From b2504568145cccfb42999fc6ad6413151d555a1e Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 13 Jan 2023 14:58:27 +0900 Subject: カスタム絵文字の管理を権限を持つユーザーが行えるように MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolve #9542 --- packages/backend/src/core/RoleService.ts | 3 + .../api/endpoints/admin/emoji/add-aliases-bulk.ts | 2 +- .../src/server/api/endpoints/admin/emoji/add.ts | 2 +- .../src/server/api/endpoints/admin/emoji/copy.ts | 2 +- .../api/endpoints/admin/emoji/delete-bulk.ts | 2 +- .../src/server/api/endpoints/admin/emoji/delete.ts | 2 +- .../server/api/endpoints/admin/emoji/import-zip.ts | 2 +- .../api/endpoints/admin/emoji/list-remote.ts | 2 +- .../src/server/api/endpoints/admin/emoji/list.ts | 2 +- .../endpoints/admin/emoji/remove-aliases-bulk.ts | 2 +- .../api/endpoints/admin/emoji/set-aliases-bulk.ts | 2 +- .../api/endpoints/admin/emoji/set-category-bulk.ts | 2 +- .../src/server/api/endpoints/admin/emoji/update.ts | 2 +- .../frontend/src/pages/admin/emoji-edit-dialog.vue | 106 ------ packages/frontend/src/pages/admin/emojis.vue | 398 --------------------- packages/frontend/src/pages/admin/roles.editor.vue | 16 + packages/frontend/src/pages/admin/roles.vue | 10 + .../frontend/src/pages/custom-emojis-manager.vue | 397 ++++++++++++++++++++ packages/frontend/src/pages/emoji-edit-dialog.vue | 106 ++++++ packages/frontend/src/router.ts | 5 +- packages/frontend/src/ui/_common_/common.ts | 7 +- 21 files changed, 554 insertions(+), 518 deletions(-) delete mode 100644 packages/frontend/src/pages/admin/emoji-edit-dialog.vue delete mode 100644 packages/frontend/src/pages/admin/emojis.vue create mode 100644 packages/frontend/src/pages/custom-emojis-manager.vue create mode 100644 packages/frontend/src/pages/emoji-edit-dialog.vue (limited to 'packages') diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index 78524c833d..15ba900802 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -17,6 +17,7 @@ export type RoleOptions = { ltlAvailable: boolean; canPublicNote: boolean; canInvite: boolean; + canManageCustomEmojis: boolean; driveCapacityMb: number; antennaLimit: number; }; @@ -26,6 +27,7 @@ export const DEFAULT_ROLE: RoleOptions = { ltlAvailable: true, canPublicNote: true, canInvite: false, + canManageCustomEmojis: false, driveCapacityMb: 100, antennaLimit: 5, }; @@ -182,6 +184,7 @@ export class RoleService implements OnApplicationShutdown { ltlAvailable: getOptionValues('ltlAvailable').some(x => x === true), canPublicNote: getOptionValues('canPublicNote').some(x => x === true), canInvite: getOptionValues('canInvite').some(x => x === true), + canManageCustomEmojis: getOptionValues('canManageCustomEmojis').some(x => x === true), driveCapacityMb: Math.max(...getOptionValues('driveCapacityMb')), antennaLimit: Math.max(...getOptionValues('antennaLimit')), }; diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts index 7c24e8baa8..d114fd3d55 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts @@ -8,7 +8,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', } as const; export const paramDef = { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts index c4e1987d73..52ccb74447 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts @@ -14,7 +14,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', errors: { noSuchFile: { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts index 2cdd9c36bd..4d1fdd989d 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts @@ -14,7 +14,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', errors: { noSuchEmoji: { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts index 8b2031e6dd..27aa4fb1b1 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts @@ -9,7 +9,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', } as const; export const paramDef = { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts b/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts index dd7cd4cede..2531246569 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts @@ -10,7 +10,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', errors: { noSuchEmoji: { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts b/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts index 6fe492cb75..15f468c180 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts @@ -5,7 +5,7 @@ import { QueueService } from '@/core/QueueService.js'; export const meta = { secure: true, requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', } as const; export const paramDef = { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts b/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts index 08ffc73fea..131c9ef223 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts @@ -11,7 +11,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', res: { type: 'array', diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/list.ts b/packages/backend/src/server/api/endpoints/admin/emoji/list.ts index 6bcd4973d6..ef2bc936c3 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/list.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/list.ts @@ -11,7 +11,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', res: { type: 'array', diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts index 99512a26b3..a70cd8d787 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts @@ -8,7 +8,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', } as const; export const paramDef = { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts index 697999cc7c..b33e5662bb 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts @@ -8,7 +8,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', } as const; export const paramDef = { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts index 00a5b162bf..05834bc572 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts @@ -8,7 +8,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', } as const; export const paramDef = { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts index c576950ac7..19645cb515 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts @@ -9,7 +9,7 @@ export const meta = { tags: ['admin'], requireCredential: true, - requireModerator: true, + requireRoleOption: 'canManageCustomEmojis', errors: { noSuchEmoji: { diff --git a/packages/frontend/src/pages/admin/emoji-edit-dialog.vue b/packages/frontend/src/pages/admin/emoji-edit-dialog.vue deleted file mode 100644 index b2880b60b1..0000000000 --- a/packages/frontend/src/pages/admin/emoji-edit-dialog.vue +++ /dev/null @@ -1,106 +0,0 @@ - - - - - diff --git a/packages/frontend/src/pages/admin/emojis.vue b/packages/frontend/src/pages/admin/emojis.vue deleted file mode 100644 index 49f130d75b..0000000000 --- a/packages/frontend/src/pages/admin/emojis.vue +++ /dev/null @@ -1,398 +0,0 @@ - - - - - diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue index 1d83ae3244..b66c967e6a 100644 --- a/packages/frontend/src/pages/admin/roles.editor.vue +++ b/packages/frontend/src/pages/admin/roles.editor.vue @@ -90,6 +90,19 @@ + + + +
+ + + + + + +
+
+ @@ -175,6 +188,8 @@ let options_canPublicNote_useDefault = $ref(role?.options?.canPublicNote?.useDef let options_canPublicNote_value = $ref(role?.options?.canPublicNote?.value ?? false); let options_canInvite_useDefault = $ref(role?.options?.canInvite?.useDefault ?? true); let options_canInvite_value = $ref(role?.options?.canInvite?.value ?? false); +let options_canManageCustomEmojis_useDefault = $ref(role?.options?.canManageCustomEmojis?.useDefault ?? true); +let options_canManageCustomEmojis_value = $ref(role?.options?.canManageCustomEmojis?.value ?? false); let options_driveCapacityMb_useDefault = $ref(role?.options?.driveCapacityMb?.useDefault ?? true); let options_driveCapacityMb_value = $ref(role?.options?.driveCapacityMb?.value ?? 0); let options_antennaLimit_useDefault = $ref(role?.options?.antennaLimit?.useDefault ?? true); @@ -192,6 +207,7 @@ function getOptions() { ltlAvailable: { useDefault: options_ltlAvailable_useDefault, value: options_ltlAvailable_value }, canPublicNote: { useDefault: options_canPublicNote_useDefault, value: options_canPublicNote_value }, canInvite: { useDefault: options_canInvite_useDefault, value: options_canInvite_value }, + canManageCustomEmojis: { useDefault: options_canManageCustomEmojis_useDefault, value: options_canManageCustomEmojis_value }, driveCapacityMb: { useDefault: options_driveCapacityMb_useDefault, value: options_driveCapacityMb_value }, antennaLimit: { useDefault: options_antennaLimit_useDefault, value: options_antennaLimit_value }, }; diff --git a/packages/frontend/src/pages/admin/roles.vue b/packages/frontend/src/pages/admin/roles.vue index 6495074bb7..16c12f9928 100644 --- a/packages/frontend/src/pages/admin/roles.vue +++ b/packages/frontend/src/pages/admin/roles.vue @@ -40,6 +40,14 @@ + + + + + + + + @@ -90,6 +98,7 @@ let options_gtlAvailable = $ref(instance.baseRole.gtlAvailable); let options_ltlAvailable = $ref(instance.baseRole.ltlAvailable); let options_canPublicNote = $ref(instance.baseRole.canPublicNote); let options_canInvite = $ref(instance.baseRole.canInvite); +let options_canManageCustomEmojis = $ref(instance.baseRole.canManageCustomEmojis); let options_driveCapacityMb = $ref(instance.baseRole.driveCapacityMb); let options_antennaLimit = $ref(instance.baseRole.antennaLimit); @@ -100,6 +109,7 @@ async function updateBaseRole() { ltlAvailable: options_ltlAvailable, canPublicNote: options_canPublicNote, canInvite: options_canInvite, + canManageCustomEmojis: options_canManageCustomEmojis, driveCapacityMb: options_driveCapacityMb, antennaLimit: options_antennaLimit, }, diff --git a/packages/frontend/src/pages/custom-emojis-manager.vue b/packages/frontend/src/pages/custom-emojis-manager.vue new file mode 100644 index 0000000000..87d205ed78 --- /dev/null +++ b/packages/frontend/src/pages/custom-emojis-manager.vue @@ -0,0 +1,397 @@ + + + + + diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue new file mode 100644 index 0000000000..b2880b60b1 --- /dev/null +++ b/packages/frontend/src/pages/emoji-edit-dialog.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts index 05dcd7806e..26c73c610f 100644 --- a/packages/frontend/src/router.ts +++ b/packages/frontend/src/router.ts @@ -305,6 +305,9 @@ export const routes = [{ }, { path: '/channels', component: page(() => import('./pages/channels.vue')), +}, { + path: '/custom-emojis-manager', + component: page(() => import('./pages/custom-emojis-manager.vue')), }, { path: '/registry/keys/system/:path(*)?', component: page(() => import('./pages/registry.keys.vue')), @@ -331,7 +334,7 @@ export const routes = [{ }, { path: '/emojis', name: 'emojis', - component: page(() => import('./pages/admin/emojis.vue')), + component: page(() => import('./pages/custom-emojis-manager.vue')), }, { path: '/queue', name: 'queue', diff --git a/packages/frontend/src/ui/_common_/common.ts b/packages/frontend/src/ui/_common_/common.ts index 079b31489e..cc152f9c1c 100644 --- a/packages/frontend/src/ui/_common_/common.ts +++ b/packages/frontend/src/ui/_common_/common.ts @@ -47,7 +47,7 @@ export function openInstanceMenu(ev: MouseEvent) { to: '/clicker', text: '🍪👈', icon: 'ti ti-cookie', - }, ($i && ($i.isRoot || $i.role.canInvite) && instance.disableRegistration) ? { + }, ($i && ($i.isAdmin || $i.role.canInvite) && instance.disableRegistration) ? { text: i18n.ts.invite, icon: 'ti ti-user-plus', action: () => { @@ -63,6 +63,11 @@ export function openInstanceMenu(ev: MouseEvent) { }); }); }, + } : undefined, ($i && ($i.isAdmin || $i.role.canManageCustomEmojis)) ? { + type: 'link', + to: '/custom-emojis-manager', + text: i18n.ts.manageCustomEmojis, + icon: 'ti ti-icons', } : undefined], }, null, { text: i18n.ts.help, -- cgit v1.2.3-freya