diff options
| author | okayurisotto <47853651+okayurisotto@users.noreply.github.com> | 2024-02-21 14:31:50 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-21 14:31:50 +0900 |
| commit | 750d2626041b355459265a4a4148d08f6ac517fd (patch) | |
| tree | 728df33322fc43aa4358f1a6a764a9bb64f13cac /packages/backend/src/core | |
| parent | refactor(frontend): 不必要なconsole.logを除去・抑制 (#13400) (diff) | |
| download | sharkey-750d2626041b355459265a4a4148d08f6ac517fd.tar.gz sharkey-750d2626041b355459265a4a4148d08f6ac517fd.tar.bz2 sharkey-750d2626041b355459265a4a4148d08f6ac517fd.zip | |
refactor(backend): `ReactionService.prototype.convertLegacyReactions` (#13375)
* add unit tests
* cleanup unnecessary type assertions
* `convertedReaction`変数の定義と変換表に対する存在確認処理の整理
* `count`変数の定義とループ処理での`Object.entries()`の活用
* 条件式の整理
* `Array.prototype.reduce`を使うように
* `Array.prototype.reduce`を使うように
* 配列操作を1つのメソッドチェーンに整理
これまでの実装では、`decodeReaction`の返り値が同一になる異なる入力値が同時に複数個存在した場合、後ろのもので上書きされてしまっていたはず。
これからの実装では、後ろのものは前のものに加算される。
(実際にこの挙動の変更が問題になるシチュエーションはまずないはず。)
* add unit test
* ドキュメントコメントの追加と型定義の調整
Diffstat (limited to 'packages/backend/src/core')
| -rw-r--r-- | packages/backend/src/core/ReactionService.ts | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts index 5014156a5c..cb0b079df0 100644 --- a/packages/backend/src/core/ReactionService.ts +++ b/packages/backend/src/core/ReactionService.ts @@ -322,35 +322,36 @@ export class ReactionService { //#endregion } + /** + * 文字列タイプのレガシーな形式のリアクションを現在の形式に変換しつつ、 + * データベース上には存在する「0個のリアクションがついている」という情報を削除する。 + */ @bindThis - public convertLegacyReactions(reactions: Record<string, number>) { - const _reactions = {} as Record<string, number>; + public convertLegacyReactions(reactions: MiNote['reactions']): MiNote['reactions'] { + return Object.entries(reactions) + .filter(([, count]) => { + // `ReactionService.prototype.delete`ではリアクション削除時に、 + // `MiNote['reactions']`のエントリの値をデクリメントしているが、 + // デクリメントしているだけなのでエントリ自体は0を値として持つ形で残り続ける。 + // そのため、この処理がなければ、「0個のリアクションがついている」ということになってしまう。 + return count > 0; + }) + .map(([reaction, count]) => { + // unchecked indexed access + const convertedReaction = legacies[reaction] as string | undefined; - for (const reaction of Object.keys(reactions)) { - if (reactions[reaction] <= 0) continue; + const key = this.decodeReaction(convertedReaction ?? reaction).reaction; - if (Object.keys(legacies).includes(reaction)) { - if (_reactions[legacies[reaction]]) { - _reactions[legacies[reaction]] += reactions[reaction]; - } else { - _reactions[legacies[reaction]] = reactions[reaction]; - } - } else { - if (_reactions[reaction]) { - _reactions[reaction] += reactions[reaction]; - } else { - _reactions[reaction] = reactions[reaction]; - } - } - } - - const _reactions2 = {} as Record<string, number>; + return [key, count] as const; + }) + .reduce<MiNote['reactions']>((acc, [key, count]) => { + // unchecked indexed access + const prevCount = acc[key] as number | undefined; - for (const reaction of Object.keys(_reactions)) { - _reactions2[this.decodeReaction(reaction).reaction] = _reactions[reaction]; - } + acc[key] = (prevCount ?? 0) + count; - return _reactions2; + return acc; + }, {}); } @bindThis |