From 3a3057a1b10e6dc04364bd2cff70ee0370408b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?= <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Fri, 24 Apr 2026 17:56:52 +0900 Subject: [PATCH] =?UTF-8?q?fix(backend):=20`RoleService.getAdministratorId?= =?UTF-8?q?s`=20=E3=81=A7=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BCID=E3=81=8C?= =?UTF-8?q?=E9=87=8D=E8=A4=87=E3=81=99=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20(#17334)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(backend): adminロールが複数付いてても通知が重複しないように * add tests * Update Changelog * :v: Co-Authored-by: lqvp <183242690+lqvp@users.noreply.github.com> --------- Co-authored-by: lqvp <183242690+lqvp@users.noreply.github.com> --- CHANGELOG.md | 2 ++ packages/backend/src/core/RoleService.ts | 3 ++- packages/backend/src/core/SignupService.ts | 1 - packages/backend/test/unit/RoleService.ts | 13 +++++++++++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d579ec0b8..21c861c9d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ - Fix: ID生成アルゴリズムにULIDを使用している場合にMisskeyが正しく動作しない問題を修正 - Fix: リレー経由で届いたノートがリノートとして表示される問題を修正 - Fix: robots.txtの内容を調整 +- Fix: 特定のユーザーに管理者権限を持つロールが複数ついている際に、取得できるユーザーIDが重複する問題を修正 + (Cherry-picked from https://github.com/lqvp/misskey-tempura/commit/17ed4108cec4b6bd2fd989db5a9091db91fa37a7) ## 2026.3.2 diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index 2ffee69c21..4515cfd29c 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -533,7 +533,8 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit { roleId: In(administratorRoles.map(r => r.id)), }) : []; // TODO: isRootなアカウントも含める - return assigns.map(a => a.userId); + // Setを経由して重複を除去(ユーザIDは重複する可能性があるので) + return [...new Set(assigns.map(a => a.userId))].sort((x, y) => x.localeCompare(y)); } @bindThis diff --git a/packages/backend/src/core/SignupService.ts b/packages/backend/src/core/SignupService.ts index a85da62b86..bb1b8f9f3a 100644 --- a/packages/backend/src/core/SignupService.ts +++ b/packages/backend/src/core/SignupService.ts @@ -164,4 +164,3 @@ export class SignupService { return { account, secret }; } } - diff --git a/packages/backend/test/unit/RoleService.ts b/packages/backend/test/unit/RoleService.ts index d599bb50ec..ec1e7ca134 100644 --- a/packages/backend/test/unit/RoleService.ts +++ b/packages/backend/test/unit/RoleService.ts @@ -696,6 +696,19 @@ describe('RoleService', () => { expect(adminIds).toHaveLength(0); }); + test('should not include duplicate user IDs if a user has multiple administrator roles', async () => { + const adminUser = await createUser(); + const adminRole1 = await createRole({ name: 'admin1', isAdministrator: true }); + const adminRole2 = await createRole({ name: 'admin2', isAdministrator: true }); + + await roleService.assign(adminUser.id, adminRole1.id); + await roleService.assign(adminUser.id, adminRole2.id); + + const adminIds = await roleService.getAdministratorIds(); + + expect(adminIds).toEqual([adminUser.id]); + }); + // TODO: rootユーザーは現在実装に含まれていないため、テストもそれに倣う test('should not include the root user', async () => { const rootUser = await createUser();