diff --git a/packages/backend/migration/1779035944722-RoleDisplayVisibility.js b/packages/backend/migration/1779035944722-RoleDisplayVisibility.js new file mode 100644 index 0000000000..74b644a9f4 --- /dev/null +++ b/packages/backend/migration/1779035944722-RoleDisplayVisibility.js @@ -0,0 +1,24 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class RoleDisplayVisibility1779035944722 { + name = 'RoleDisplayVisibility1779035944722'; + + /** + * @param {QueryRunner} queryRunner + */ + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "user" ADD "hiddenRoleIds" character varying(32) array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "role" ADD "isPublicDisplayRequired" boolean NOT NULL DEFAULT false`); + } + + /** + * @param {QueryRunner} queryRunner + */ + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "role" DROP COLUMN "isPublicDisplayRequired"`); + await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "hiddenRoleIds"`); + } +} diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index a57449157b..13f6cb4694 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -670,6 +670,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit { target: values.target, condFormula: values.condFormula, isPublic: values.isPublic, + isPublicDisplayRequired: values.isPublicDisplayRequired ?? false, isAdministrator: values.isAdministrator, isModerator: values.isModerator, isExplorable: values.isExplorable, diff --git a/packages/backend/src/core/entities/RoleEntityService.ts b/packages/backend/src/core/entities/RoleEntityService.ts index 3fa38c9521..f4b6fdd44e 100644 --- a/packages/backend/src/core/entities/RoleEntityService.ts +++ b/packages/backend/src/core/entities/RoleEntityService.ts @@ -64,6 +64,7 @@ export class RoleEntityService { target: role.target, condFormula: role.condFormula, isPublic: role.isPublic, + isPublicDisplayRequired: role.isPublicDisplayRequired, isAdministrator: role.isAdministrator, isModerator: role.isModerator, isExplorable: role.isExplorable, @@ -84,4 +85,3 @@ export class RoleEntityService { return Promise.all(roles.map(x => this.pack(x, me))); } } - diff --git a/packages/backend/src/models/Role.ts b/packages/backend/src/models/Role.ts index 4c7da252bd..dac5a1c0f1 100644 --- a/packages/backend/src/models/Role.ts +++ b/packages/backend/src/models/Role.ts @@ -227,6 +227,11 @@ export class MiRole { }) public isPublic: boolean; + @Column('boolean', { + default: false, + }) + public isPublicDisplayRequired: boolean; + // trueの場合ユーザー名の横にバッジとして表示 @Column('boolean', { default: false, diff --git a/packages/backend/src/models/json-schema/role.ts b/packages/backend/src/models/json-schema/role.ts index eaed3ac710..ef44e2b065 100644 --- a/packages/backend/src/models/json-schema/role.ts +++ b/packages/backend/src/models/json-schema/role.ts @@ -369,6 +369,16 @@ export const packedRoleLiteSchema = { optional: false, nullable: false, example: false, }, + asBadge: { + type: 'boolean', + optional: false, nullable: false, + example: false, + }, + isPublicDisplayRequired: { + type: 'boolean', + optional: false, nullable: false, + example: false, + }, displayOrder: { type: 'integer', optional: false, nullable: false, @@ -412,6 +422,11 @@ export const packedRoleSchema = { optional: false, nullable: false, example: false, }, + isPublicDisplayRequired: { + type: 'boolean', + optional: false, nullable: false, + example: false, + }, isExplorable: { type: 'boolean', optional: false, nullable: false, diff --git a/packages/backend/src/server/api/endpoints/admin/roles/create.ts b/packages/backend/src/server/api/endpoints/admin/roles/create.ts index f92f7ebaeb..af8879ee9e 100644 --- a/packages/backend/src/server/api/endpoints/admin/roles/create.ts +++ b/packages/backend/src/server/api/endpoints/admin/roles/create.ts @@ -32,6 +32,7 @@ export const paramDef = { target: { type: 'string', enum: ['manual', 'conditional'] }, condFormula: { type: 'object' }, isPublic: { type: 'boolean' }, + isPublicDisplayRequired: { type: 'boolean', default: false }, isModerator: { type: 'boolean' }, isAdministrator: { type: 'boolean' }, isExplorable: { type: 'boolean', default: false }, // optional for backward compatibility diff --git a/packages/backend/src/server/api/endpoints/admin/roles/update.ts b/packages/backend/src/server/api/endpoints/admin/roles/update.ts index 175adcb63f..72b7981a22 100644 --- a/packages/backend/src/server/api/endpoints/admin/roles/update.ts +++ b/packages/backend/src/server/api/endpoints/admin/roles/update.ts @@ -37,6 +37,7 @@ export const paramDef = { target: { type: 'string', enum: ['manual', 'conditional'] }, condFormula: { type: 'object' }, isPublic: { type: 'boolean' }, + isPublicDisplayRequired: { type: 'boolean' }, isModerator: { type: 'boolean' }, isAdministrator: { type: 'boolean' }, isExplorable: { type: 'boolean' }, @@ -75,6 +76,7 @@ export default class extends Endpoint { // eslint- target: ps.target, condFormula: ps.condFormula, isPublic: ps.isPublic, + isPublicDisplayRequired: ps.isPublicDisplayRequired, isModerator: ps.isModerator, isAdministrator: ps.isAdministrator, isExplorable: ps.isExplorable,