summaryrefslogtreecommitdiff
path: root/packages/backend/src/core
diff options
context:
space:
mode:
authorokayurisotto <47853651+okayurisotto@users.noreply.github.com>2024-02-21 14:31:50 +0900
committerGitHub <noreply@github.com>2024-02-21 14:31:50 +0900
commit750d2626041b355459265a4a4148d08f6ac517fd (patch)
tree728df33322fc43aa4358f1a6a764a9bb64f13cac /packages/backend/src/core
parentrefactor(frontend): 不必要なconsole.logを除去・抑制 (#13400) (diff)
downloadsharkey-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.ts49
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