From 5601ed091499183e4c07298b18e974dae155fe31 Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Mon, 9 Oct 2023 08:46:05 +0900
Subject: [PATCH] =?UTF-8?q?enhance(backend):=20UserListMembership=E3=81=AB?=
 =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=83=AA=E3=82=B9=E3=83=88?=
 =?UTF-8?q?=E3=81=AE=E4=BD=9C=E6=88=90=E8=80=85ID=E3=82=92=E9=9D=9E?=
 =?UTF-8?q?=E6=AD=A3=E8=A6=8F=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../migration/1696807733453-userListUserId.js | 21 +++++++++++++++++++
 .../1696808725134-userListUserId-2.js         | 16 ++++++++++++++
 .../backend/src/core/AccountMoveService.ts    |  3 ++-
 packages/backend/src/core/UserListService.ts  |  1 +
 .../backend/src/models/UserListMembership.ts  |  7 +++++++
 5 files changed, 47 insertions(+), 1 deletion(-)
 create mode 100644 packages/backend/migration/1696807733453-userListUserId.js
 create mode 100644 packages/backend/migration/1696808725134-userListUserId-2.js

diff --git a/packages/backend/migration/1696807733453-userListUserId.js b/packages/backend/migration/1696807733453-userListUserId.js
new file mode 100644
index 0000000000..ab2ba07fb5
--- /dev/null
+++ b/packages/backend/migration/1696807733453-userListUserId.js
@@ -0,0 +1,21 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class UserListUserId1696807733453 {
+    name = 'UserListUserId1696807733453'
+
+    async up(queryRunner) {
+        await queryRunner.query(`ALTER TABLE "user_list_membership" ADD "userListUserId" character varying(32) NOT NULL DEFAULT ''`);
+				const memberships = await queryRunner.query(`SELECT "id", "userListId" FROM "user_list_membership"`);
+				for(let i = 0; i < memberships.length; i++) {
+					const userList = await queryRunner.query(`SELECT "userId" FROM "user_list" WHERE "id" = $1`, [memberships[i].userListId]);
+					await queryRunner.query(`UPDATE "user_list_membership" SET "userListUserId" = $1 WHERE "id" = $2`, [userList[0].userId, memberships[i].id]);
+				}
+    }
+
+    async down(queryRunner) {
+        await queryRunner.query(`ALTER TABLE "user_list_membership" DROP COLUMN "userListUserId"`);
+    }
+}
diff --git a/packages/backend/migration/1696808725134-userListUserId-2.js b/packages/backend/migration/1696808725134-userListUserId-2.js
new file mode 100644
index 0000000000..5bcb5aedc2
--- /dev/null
+++ b/packages/backend/migration/1696808725134-userListUserId-2.js
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class UserListUserId21696808725134 {
+    name = 'UserListUserId21696808725134'
+
+    async up(queryRunner) {
+        await queryRunner.query(`ALTER TABLE "user_list_membership" ALTER COLUMN "userListUserId" DROP DEFAULT`);
+    }
+
+    async down(queryRunner) {
+        await queryRunner.query(`ALTER TABLE "user_list_membership" ALTER COLUMN "userListUserId" SET DEFAULT ''`);
+    }
+}
diff --git a/packages/backend/src/core/AccountMoveService.ts b/packages/backend/src/core/AccountMoveService.ts
index ba3413007d..db64f42754 100644
--- a/packages/backend/src/core/AccountMoveService.ts
+++ b/packages/backend/src/core/AccountMoveService.ts
@@ -228,7 +228,7 @@ export class AccountMoveService {
 			},
 		}).then(memberships => memberships.map(membership => membership.userListId));
 
-		const newMemberships: Map<string, { createdAt: Date; userId: string; userListId: string; }> = new Map();
+		const newMemberships: Map<string, { createdAt: Date; userId: string; userListId: string; userListUserId: string; }> = new Map();
 
 		// 重複しないようにIDを生成
 		const genId = (): string => {
@@ -244,6 +244,7 @@ export class AccountMoveService {
 				createdAt: new Date(),
 				userId: dst.id,
 				userListId: membership.userListId,
+				userListUserId: membership.userListUserId,
 			});
 		}
 
diff --git a/packages/backend/src/core/UserListService.ts b/packages/backend/src/core/UserListService.ts
index bece1e442e..5b4e7a711e 100644
--- a/packages/backend/src/core/UserListService.ts
+++ b/packages/backend/src/core/UserListService.ts
@@ -97,6 +97,7 @@ export class UserListService implements OnApplicationShutdown {
 			createdAt: new Date(),
 			userId: target.id,
 			userListId: list.id,
+			userListUserId: list.userId,
 		} as MiUserListMembership);
 
 		this.globalEventService.publishInternalEvent('userListMemberAdded', { userListId: list.id, memberId: target.id });
diff --git a/packages/backend/src/models/UserListMembership.ts b/packages/backend/src/models/UserListMembership.ts
index f337f19a47..f57f9ac33d 100644
--- a/packages/backend/src/models/UserListMembership.ts
+++ b/packages/backend/src/models/UserListMembership.ts
@@ -50,4 +50,11 @@ export class MiUserListMembership {
 		default: false,
 	})
 	public withReplies: boolean;
+
+	//#region Denormalized fields
+	@Column({
+		...id(),
+	})
+	public userListUserId: MiUser['id'];
+	//#endregion
 }