From b61c1d5b27f8381c0ed7d04fa824c68c7db0a444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Tue, 22 Jul 2025 00:26:05 +0200 Subject: [PATCH] forRoles IS NOT NULL, coalesce to empty=unrestricted --- .../migration/1752352800438-announcement-forRoles.js | 2 +- packages/backend/src/core/AnnouncementService.ts | 2 +- packages/backend/src/models/Announcement.ts | 4 ++-- .../server/api/endpoints/admin/announcements/create.ts | 2 +- .../server/api/endpoints/admin/announcements/list.ts | 2 +- .../server/api/endpoints/admin/announcements/update.ts | 2 +- .../backend/src/server/api/endpoints/announcements.ts | 2 +- packages/frontend/src/pages/admin/announcements.vue | 6 +++--- packages/misskey-js/src/autogen/types.ts | 10 +++++----- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/backend/migration/1752352800438-announcement-forRoles.js b/packages/backend/migration/1752352800438-announcement-forRoles.js index a148c87eed..a3fcb449c5 100644 --- a/packages/backend/migration/1752352800438-announcement-forRoles.js +++ b/packages/backend/migration/1752352800438-announcement-forRoles.js @@ -5,7 +5,7 @@ export class AnnouncementForRoles1752352800438 { async up(queryRunner) { - await queryRunner.query(`ALTER TABLE "announcement" ADD "forRoles" text[] DEFAULT null`); + await queryRunner.query(`ALTER TABLE "announcement" ADD "forRoles" text[] DEFAULT '{}'`); } async down(queryRunner) { diff --git a/packages/backend/src/core/AnnouncementService.ts b/packages/backend/src/core/AnnouncementService.ts index 643f0c7e05..616cd710fa 100644 --- a/packages/backend/src/core/AnnouncementService.ts +++ b/packages/backend/src/core/AnnouncementService.ts @@ -63,7 +63,7 @@ export class AnnouncementService { })) .andWhere(new Brackets(qb => { qb.orWhere('announcement.forRoles && :roles', { roles: roles.map((r) => r.id) }); - qb.orWhere('announcement.forRoles IS NULL'); + qb.orWhere('announcement.forRoles = \'{}\''); })) .andWhere(`announcement.id NOT IN (${ readsQuery.getQuery() })`); diff --git a/packages/backend/src/models/Announcement.ts b/packages/backend/src/models/Announcement.ts index 2e0fb66137..15857bcb92 100644 --- a/packages/backend/src/models/Announcement.ts +++ b/packages/backend/src/models/Announcement.ts @@ -69,9 +69,9 @@ export class MiAnnouncement { @Column('text', { array: true, - default: null, nullable: true, + default: '{}', nullable: false, }) - public forRoles: MiRole['id'][] | null; + public forRoles: MiRole['id'][]; @Index() @Column('boolean', { diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/create.ts b/packages/backend/src/server/api/endpoints/admin/announcements/create.ts index c37b54b9c9..76acf5440d 100644 --- a/packages/backend/src/server/api/endpoints/admin/announcements/create.ts +++ b/packages/backend/src/server/api/endpoints/admin/announcements/create.ts @@ -59,7 +59,7 @@ export const paramDef = { icon: { type: 'string', enum: ['info', 'warning', 'error', 'success'], default: 'info' }, display: { type: 'string', enum: ['normal', 'banner', 'dialog'], default: 'normal' }, forExistingUsers: { type: 'boolean', default: false }, - forRoles: { type: 'array', nullable: true, default: null, items: { type: 'string', nullable: false, format: 'misskey:id' }, }, + forRoles: { type: 'array', default: [], items: { type: 'string', nullable: false, format: 'misskey:id' }, }, silence: { type: 'boolean', default: false }, needConfirmationToRead: { type: 'boolean', default: false }, confetti: { type: 'boolean', default: false }, diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/list.ts b/packages/backend/src/server/api/endpoints/admin/announcements/list.ts index 9fbd46d7b2..6bd3989df5 100644 --- a/packages/backend/src/server/api/endpoints/admin/announcements/list.ts +++ b/packages/backend/src/server/api/endpoints/admin/announcements/list.ts @@ -59,7 +59,7 @@ export const meta = { }, forRoles: { type: 'array', - optional: false, nullable: true, + optional: false, nullable: false, items: { type: 'string', optional: false, nullable: false, diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/update.ts b/packages/backend/src/server/api/endpoints/admin/announcements/update.ts index 4132647969..f694b64dd8 100644 --- a/packages/backend/src/server/api/endpoints/admin/announcements/update.ts +++ b/packages/backend/src/server/api/endpoints/admin/announcements/update.ts @@ -36,7 +36,7 @@ export const paramDef = { icon: { type: 'string', enum: ['info', 'warning', 'error', 'success'] }, display: { type: 'string', enum: ['normal', 'banner', 'dialog'] }, forExistingUsers: { type: 'boolean' }, - forRoles: { type: 'array', nullable: true, default: null, items: { type: 'string', nullable: false, format: 'misskey:id' }, }, + forRoles: { type: 'array', default: [], items: { type: 'string', nullable: false, format: 'misskey:id' }, }, silence: { type: 'boolean' }, needConfirmationToRead: { type: 'boolean' }, confetti: { type: 'boolean' }, diff --git a/packages/backend/src/server/api/endpoints/announcements.ts b/packages/backend/src/server/api/endpoints/announcements.ts index 3ac7173d8c..08528ce826 100644 --- a/packages/backend/src/server/api/endpoints/announcements.ts +++ b/packages/backend/src/server/api/endpoints/announcements.ts @@ -65,7 +65,7 @@ export default class extends Endpoint { // eslint- })) .andWhere(new Brackets(qb => { if (me) qb.orWhere('announcement.forRoles && :roles', { roles: roles.map((r) => r.id) }); - qb.orWhere('announcement.forRoles IS NULL'); + qb.orWhere('announcement.forRoles = \'{}\''); })); const announcements = await query.limit(ps.limit).getMany(); diff --git a/packages/frontend/src/pages/admin/announcements.vue b/packages/frontend/src/pages/admin/announcements.vue index 3dd4ee8fb4..67a8a6ed89 100644 --- a/packages/frontend/src/pages/admin/announcements.vue +++ b/packages/frontend/src/pages/admin/announcements.vue @@ -76,7 +76,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.tsx._announcement.onlyForRolesRestricted({roles: announcement.forRoles.length}) }} + {{ i18n.tsx._announcement.onlyForRolesRestricted({roles: announcement.forRoles.length}) }} {{ i18n.ts._announcement.onlyForRolesUnrestricted }} {{ i18n.ts._announcement.onlyForRolesChange }} @@ -141,7 +141,7 @@ function add() { silence: false, needConfirmationToRead: false, confetti: false, - forRoles: null, + forRoles: [], }); } @@ -153,7 +153,7 @@ async function changeRoles(announcement) { }); if (result.canceled) return; - announcement.forRoles = result.result.length !== 0 ? result.result.map((r) => r.id) : null; + announcement.forRoles = result.result.map((r) => r.id); } function del(announcement) { diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index 19cbe30fde..7a1f2daa58 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -6694,8 +6694,8 @@ export type operations = { display?: 'normal' | 'banner' | 'dialog'; /** @default false */ forExistingUsers?: boolean; - /** @default null */ - forRoles?: string[] | null; + /** @default [] */ + forRoles?: string[]; /** @default false */ silence?: boolean; /** @default false */ @@ -6858,7 +6858,7 @@ export type operations = { title: string; imageUrl: string | null; reads: number; - forRoles: string[] | null; + forRoles: string[]; })[]; }; }; @@ -6914,8 +6914,8 @@ export type operations = { /** @enum {string} */ display?: 'normal' | 'banner' | 'dialog'; forExistingUsers?: boolean; - /** @default null */ - forRoles?: string[] | null; + /** @default [] */ + forRoles?: string[]; silence?: boolean; needConfirmationToRead?: boolean; confetti?: boolean;