diff options
| author | syuilo <4439005+syuilo@users.noreply.github.com> | 2025-09-14 15:25:22 +0900 |
|---|---|---|
| committer | syuilo <4439005+syuilo@users.noreply.github.com> | 2025-09-14 15:25:22 +0900 |
| commit | 2621f468ff7f00c79f8df6500bf17fb75595928c (patch) | |
| tree | f7e0cbd858c5ac2479db4de66aadcb5b2cc69eb4 | |
| parent | refactor(frontend): os.select, MkSelectのitem指定をオブジェクトに... (diff) | |
| download | misskey-2621f468ff7f00c79f8df6500bf17fb75595928c.tar.gz misskey-2621f468ff7f00c79f8df6500bf17fb75595928c.tar.bz2 misskey-2621f468ff7f00c79f8df6500bf17fb75595928c.zip | |
enhance: 広告ごとにセンシティブフラグを設定できるように
| -rw-r--r-- | CHANGELOG.md | 2 | ||||
| -rw-r--r-- | packages/backend/migration/1757823175259-sensitive-ad.js | 16 | ||||
| -rw-r--r-- | packages/backend/src/core/entities/MetaEntityService.ts | 1 | ||||
| -rw-r--r-- | packages/backend/src/models/Ad.ts | 7 | ||||
| -rw-r--r-- | packages/backend/src/models/json-schema/ad.ts | 5 | ||||
| -rw-r--r-- | packages/backend/src/models/json-schema/meta.ts | 4 | ||||
| -rw-r--r-- | packages/backend/src/server/api/endpoints/admin/ad/create.ts | 3 | ||||
| -rw-r--r-- | packages/backend/src/server/api/endpoints/admin/ad/list.ts | 1 | ||||
| -rw-r--r-- | packages/backend/src/server/api/endpoints/admin/ad/update.ts | 2 | ||||
| -rw-r--r-- | packages/frontend/src/components/global/MkAd.stories.impl.ts | 3 | ||||
| -rw-r--r-- | packages/frontend/src/pages/admin/ads.vue | 16 | ||||
| -rw-r--r-- | packages/misskey-js/src/autogen/types.ts | 4 |
12 files changed, 62 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index c7a0fbdada..dbbcc6bde9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## Unreleased ### General -- +- Enhance: 広告ごとにセンシティブフラグを設定できるようになりました ### Client - Enhance: 時刻計算のための基準値を一か所で管理するようにし、パフォーマンスを向上 diff --git a/packages/backend/migration/1757823175259-sensitive-ad.js b/packages/backend/migration/1757823175259-sensitive-ad.js new file mode 100644 index 0000000000..46f0f270ab --- /dev/null +++ b/packages/backend/migration/1757823175259-sensitive-ad.js @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class SensitiveAd1757823175259 { + name = 'SensitiveAd1757823175259' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "ad" ADD "isSensitive" boolean NOT NULL DEFAULT false`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "ad" DROP COLUMN "isSensitive"`); + } +} diff --git a/packages/backend/src/core/entities/MetaEntityService.ts b/packages/backend/src/core/entities/MetaEntityService.ts index f8abfb2f98..2da614a120 100644 --- a/packages/backend/src/core/entities/MetaEntityService.ts +++ b/packages/backend/src/core/entities/MetaEntityService.ts @@ -117,6 +117,7 @@ export class MetaEntityService { ratio: ad.ratio, imageUrl: ad.imageUrl, dayOfWeek: ad.dayOfWeek, + isSensitive: ad.isSensitive ? true : undefined, })), notesPerOneAd: instance.notesPerOneAd, enableEmail: instance.enableEmail, diff --git a/packages/backend/src/models/Ad.ts b/packages/backend/src/models/Ad.ts index 108e991c70..0d402fcbe8 100644 --- a/packages/backend/src/models/Ad.ts +++ b/packages/backend/src/models/Ad.ts @@ -54,10 +54,17 @@ export class MiAd { length: 8192, nullable: false, }) public memo: string; + @Column('integer', { default: 0, nullable: false, }) public dayOfWeek: number; + + @Column('boolean', { + default: false, + }) + public isSensitive: boolean; + constructor(data: Partial<MiAd>) { if (data == null) return; diff --git a/packages/backend/src/models/json-schema/ad.ts b/packages/backend/src/models/json-schema/ad.ts index b01b39a38b..d88ac23894 100644 --- a/packages/backend/src/models/json-schema/ad.ts +++ b/packages/backend/src/models/json-schema/ad.ts @@ -60,5 +60,10 @@ export const packedAdSchema = { optional: false, nullable: false, }, + isSensitive: { + type: 'boolean', + optional: false, + nullable: false, + }, }, } as const; diff --git a/packages/backend/src/models/json-schema/meta.ts b/packages/backend/src/models/json-schema/meta.ts index 357ff26041..a0e7d490b3 100644 --- a/packages/backend/src/models/json-schema/meta.ts +++ b/packages/backend/src/models/json-schema/meta.ts @@ -195,6 +195,10 @@ export const packedMetaLiteSchema = { type: 'integer', optional: false, nullable: false, }, + isSensitive: { + type: 'boolean', + optional: true, nullable: false, + }, }, }, }, diff --git a/packages/backend/src/server/api/endpoints/admin/ad/create.ts b/packages/backend/src/server/api/endpoints/admin/ad/create.ts index 955154f4fb..01697ae185 100644 --- a/packages/backend/src/server/api/endpoints/admin/ad/create.ts +++ b/packages/backend/src/server/api/endpoints/admin/ad/create.ts @@ -36,6 +36,7 @@ export const paramDef = { startsAt: { type: 'integer' }, imageUrl: { type: 'string', minLength: 1 }, dayOfWeek: { type: 'integer' }, + isSensitive: { type: 'boolean' }, }, required: ['url', 'memo', 'place', 'priority', 'ratio', 'expiresAt', 'startsAt', 'imageUrl', 'dayOfWeek'], } as const; @@ -55,6 +56,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- expiresAt: new Date(ps.expiresAt), startsAt: new Date(ps.startsAt), dayOfWeek: ps.dayOfWeek, + isSensitive: ps.isSensitive, url: ps.url, imageUrl: ps.imageUrl, priority: ps.priority, @@ -73,6 +75,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- expiresAt: ad.expiresAt.toISOString(), startsAt: ad.startsAt.toISOString(), dayOfWeek: ad.dayOfWeek, + isSensitive: ad.isSensitive, url: ad.url, imageUrl: ad.imageUrl, priority: ad.priority, diff --git a/packages/backend/src/server/api/endpoints/admin/ad/list.ts b/packages/backend/src/server/api/endpoints/admin/ad/list.ts index 4f897d98e4..f67cad5bd2 100644 --- a/packages/backend/src/server/api/endpoints/admin/ad/list.ts +++ b/packages/backend/src/server/api/endpoints/admin/ad/list.ts @@ -63,6 +63,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- expiresAt: ad.expiresAt.toISOString(), startsAt: ad.startsAt.toISOString(), dayOfWeek: ad.dayOfWeek, + isSensitive: ad.isSensitive, url: ad.url, imageUrl: ad.imageUrl, memo: ad.memo, diff --git a/packages/backend/src/server/api/endpoints/admin/ad/update.ts b/packages/backend/src/server/api/endpoints/admin/ad/update.ts index 4e3d731aca..a3d9aaddc6 100644 --- a/packages/backend/src/server/api/endpoints/admin/ad/update.ts +++ b/packages/backend/src/server/api/endpoints/admin/ad/update.ts @@ -39,6 +39,7 @@ export const paramDef = { expiresAt: { type: 'integer' }, startsAt: { type: 'integer' }, dayOfWeek: { type: 'integer' }, + isSensitive: { type: 'boolean' }, }, required: ['id'], } as const; @@ -66,6 +67,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- expiresAt: ps.expiresAt ? new Date(ps.expiresAt) : undefined, startsAt: ps.startsAt ? new Date(ps.startsAt) : undefined, dayOfWeek: ps.dayOfWeek, + isSensitive: ps.isSensitive, }); const updatedAd = await this.adsRepository.findOneByOrFail({ id: ad.id }); diff --git a/packages/frontend/src/components/global/MkAd.stories.impl.ts b/packages/frontend/src/components/global/MkAd.stories.impl.ts index 07e06a6897..6110dae7c5 100644 --- a/packages/frontend/src/components/global/MkAd.stories.impl.ts +++ b/packages/frontend/src/components/global/MkAd.stories.impl.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: syuilo and misskey-project * SPDX-License-Identifier: AGPL-3.0-only */ - + import { expect, userEvent, waitFor, within } from '@storybook/test'; import MkAd from './MkAd.vue'; import type { StoryObj } from '@storybook/vue3'; @@ -75,6 +75,7 @@ const common = { place: '', imageUrl: '', dayOfWeek: 7, + isSensitive: false, }, }, parameters: { diff --git a/packages/frontend/src/pages/admin/ads.vue b/packages/frontend/src/pages/admin/ads.vue index 17008e0c13..94940a84ae 100644 --- a/packages/frontend/src/pages/admin/ads.vue +++ b/packages/frontend/src/pages/admin/ads.vue @@ -9,21 +9,26 @@ SPDX-License-Identifier: AGPL-3.0-only <MkSelect v-model="filterType" :items="filterTypeDef" :class="$style.input" @update:modelValue="filterItems"> <template #label>{{ i18n.ts.state }}</template> </MkSelect> + <div> <div v-for="ad in ads" class="_panel _gaps_m" :class="$style.ad"> <MkAd v-if="ad.url" :key="ad.id" :specify="ad"/> + <MkInput v-model="ad.url" type="url"> <template #label>URL</template> </MkInput> + <MkInput v-model="ad.imageUrl" type="url"> <template #label>{{ i18n.ts.imageUrl }}</template> </MkInput> + <MkRadios v-model="ad.place"> <template #label>Form</template> <option value="square">square</option> <option value="horizontal">horizontal</option> <option value="horizontal-big">horizontal-big</option> </MkRadios> + <!-- <div style="margin: 32px 0;"> {{ i18n.ts.priority }} @@ -32,6 +37,7 @@ SPDX-License-Identifier: AGPL-3.0-only <MkRadio v-model="ad.priority" value="low">{{ i18n.ts.low }}</MkRadio> </div> --> + <FormSplit> <MkInput v-model="ad.ratio" type="number"> <template #label>{{ i18n.ts.ratio }}</template> @@ -43,6 +49,11 @@ SPDX-License-Identifier: AGPL-3.0-only <template #label>{{ i18n.ts.expiration }}</template> </MkInput> </FormSplit> + + <MkSwitch v-model="ad.isSensitive"> + <template #label>{{ i18n.ts.sensitive }}</template> + </MkSwitch> + <MkFolder> <template #label>{{ i18n.ts.advancedSettings }}</template> <span> @@ -56,9 +67,11 @@ SPDX-License-Identifier: AGPL-3.0-only </div> </span> </MkFolder> + <MkTextarea v-model="ad.memo"> <template #label>{{ i18n.ts.memo }}</template> </MkTextarea> + <div class="_buttons"> <MkButton inline primary style="margin-right: 12px;" @click="save(ad)"> <i @@ -70,6 +83,7 @@ SPDX-License-Identifier: AGPL-3.0-only </MkButton> </div> </div> + <MkButton @click="more()"> <i class="ti ti-reload"></i>{{ i18n.ts.more }} </MkButton> @@ -88,6 +102,7 @@ import MkRadios from '@/components/MkRadios.vue'; import MkFolder from '@/components/MkFolder.vue'; import MkSelect from '@/components/MkSelect.vue'; import FormSplit from '@/components/form/split.vue'; +import MkSwitch from '@/components/MkSwitch.vue'; import * as os from '@/os.js'; import { misskeyApi } from '@/utility/misskey-api.js'; import { i18n } from '@/i18n.js'; @@ -158,6 +173,7 @@ function add() { expiresAt: new Date().toISOString(), startsAt: new Date().toISOString(), dayOfWeek: 0, + isSensitive: false, }); } diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index ff76f653fc..22a3733fcb 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -4285,6 +4285,7 @@ export type components = { imageUrl: string; memo: string; dayOfWeek: number; + isSensitive: boolean; }; Announcement: { /** @@ -5381,6 +5382,7 @@ export type components = { /** Format: url */ imageUrl: string; dayOfWeek: number; + isSensitive?: boolean; }[]; /** @default 0 */ notesPerOneAd: number; @@ -6242,6 +6244,7 @@ export interface operations { startsAt: number; imageUrl: string; dayOfWeek: number; + isSensitive?: boolean; }; }; }; @@ -6454,6 +6457,7 @@ export interface operations { expiresAt?: number; startsAt?: number; dayOfWeek?: number; + isSensitive?: boolean; }; }; }; |