diff --git a/packages/backend/migration/1729414690009-defaultSensitive.js b/packages/backend/migration/1729414690009-defaultSensitive.js new file mode 100644 index 0000000000000000000000000000000000000000..47debf05a70a3c4ca9f154dfe10db4a063ca9a78 --- /dev/null +++ b/packages/backend/migration/1729414690009-defaultSensitive.js @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: marie and sharkey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class DefaultSensitive1729414690009 { + name = 'DefaultSensitive1729414690009' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "user_profile" ADD "defaultSensitive" boolean NOT NULL DEFAULT false`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "defaultSensitive"`); + } +} diff --git a/packages/backend/src/core/DriveService.ts b/packages/backend/src/core/DriveService.ts index 744bc65be7d783860e5eb677671dad6d5a9d6c23..520c339d7dd0c71fbc0eb5bccad2804eaaf288e4 100644 --- a/packages/backend/src/core/DriveService.ts +++ b/packages/backend/src/core/DriveService.ts @@ -560,7 +560,7 @@ export class DriveService { file.maybeSensitive = info.sensitive; file.maybePorn = info.porn; file.isSensitive = user - ? this.userEntityService.isLocalUser(user) && profile!.alwaysMarkNsfw ? true : + ? this.userEntityService.isLocalUser(user) && (profile!.alwaysMarkNsfw || profile!.defaultSensitive) ? true : sensitive ?? false : false; diff --git a/packages/backend/src/core/entities/UserEntityService.ts b/packages/backend/src/core/entities/UserEntityService.ts index 703b07973ef7d5385a8edc68a712c65db5823418..b1832ca0f51ed5042e83d3acc01f40a36149acf0 100644 --- a/packages/backend/src/core/entities/UserEntityService.ts +++ b/packages/backend/src/core/entities/UserEntityService.ts @@ -627,6 +627,7 @@ export class UserEntityService implements OnModuleInit { injectFeaturedNote: profile!.injectFeaturedNote, receiveAnnouncementEmail: profile!.receiveAnnouncementEmail, alwaysMarkNsfw: profile!.alwaysMarkNsfw, + defaultSensitive: profile!.defaultSensitive, autoSensitive: profile!.autoSensitive, carefulBot: profile!.carefulBot, autoAcceptFollowed: profile!.autoAcceptFollowed, diff --git a/packages/backend/src/models/UserProfile.ts b/packages/backend/src/models/UserProfile.ts index 9b87130ce1b833e8f5af251be36236c31e660215..751b1aff08a33297744d2533fcfee6db34130f33 100644 --- a/packages/backend/src/models/UserProfile.ts +++ b/packages/backend/src/models/UserProfile.ts @@ -196,6 +196,11 @@ export class MiUserProfile { }) public alwaysMarkNsfw: boolean; + @Column('boolean', { + default: false, + }) + public defaultSensitive: boolean; + @Column('boolean', { default: false, }) diff --git a/packages/backend/src/models/json-schema/user.ts b/packages/backend/src/models/json-schema/user.ts index beb4dcc12cd88b73761ceef0c41b5be70431b4ae..fdbd5fa8e2e59d04ac3f532e0df87aee8717ebfc 100644 --- a/packages/backend/src/models/json-schema/user.ts +++ b/packages/backend/src/models/json-schema/user.ts @@ -516,6 +516,10 @@ export const packedMeDetailedOnlySchema = { type: 'boolean', nullable: false, optional: false, }, + defaultSensitive: { + type: 'boolean', + nullable: false, optional: false, + }, autoSensitive: { type: 'boolean', nullable: false, optional: false, diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index 026ad614d88642390df885641c86970cff42c1b5..8994c3fff6e8826c816664a6dfd719086661e181 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -193,6 +193,7 @@ export const paramDef = { injectFeaturedNote: { type: 'boolean' }, receiveAnnouncementEmail: { type: 'boolean' }, alwaysMarkNsfw: { type: 'boolean' }, + defaultSensitive: { type: 'boolean' }, autoSensitive: { type: 'boolean' }, followingVisibility: { type: 'string', enum: ['public', 'followers', 'private'] }, followersVisibility: { type: 'string', enum: ['public', 'followers', 'private'] }, @@ -349,6 +350,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- if (policies.alwaysMarkNsfw) throw new ApiError(meta.errors.restrictedByRole); profileUpdates.alwaysMarkNsfw = ps.alwaysMarkNsfw; } + if (typeof ps.defaultSensitive === 'boolean') profileUpdates.defaultSensitive = ps.defaultSensitive; if (ps.emailNotificationTypes !== undefined) profileUpdates.emailNotificationTypes = ps.emailNotificationTypes; if (ps.avatarId) { diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue index fa0963784432c432233b04c4e576954faa43bf0a..c1e325863176bcf730f39c4e7d274ce1e4a4cfb2 100644 --- a/packages/frontend/src/pages/settings/drive.vue +++ b/packages/frontend/src/pages/settings/drive.vue @@ -48,7 +48,7 @@ SPDX-License-Identifier: AGPL-3.0-only <template #label>{{ i18n.ts.keepOriginalFilename }}</template> <template #caption>{{ i18n.ts.keepOriginalFilenameDescription }}</template> </MkSwitch> - <MkSwitch v-model="alwaysMarkNsfw" @update:modelValue="saveProfile()"> + <MkSwitch v-model="defaultSensitive" @update:modelValue="saveProfile()"> <template #label>{{ i18n.ts.alwaysMarkSensitive }}</template> </MkSwitch> </div> @@ -80,7 +80,7 @@ const fetching = ref(true); const usage = ref<number | null>(null); const capacity = ref<number | null>(null); const uploadFolder = ref<Misskey.entities.DriveFolder | null>(null); -const alwaysMarkNsfw = ref($i.alwaysMarkNsfw); +const defaultSensitive = ref($i.defaultSensitive); const meterStyle = computed(() => { if (!capacity.value || !usage.value) return {}; @@ -127,14 +127,14 @@ function chooseUploadFolder() { function saveProfile() { misskeyApi('i/update', { - alwaysMarkNsfw: !!alwaysMarkNsfw.value, + defaultSensitive: !!defaultSensitive.value, }).catch(err => { os.alert({ type: 'error', title: i18n.ts.error, text: err.message, }); - alwaysMarkNsfw.value = true; + defaultSensitive.value = true; }); } diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index c02295d444fad83ad39127868b02e63aeb7d9c42..941c31455f298f14408a9c8a76ffec5ff3de8346 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -3994,6 +3994,7 @@ export type components = { injectFeaturedNote: boolean; receiveAnnouncementEmail: boolean; alwaysMarkNsfw: boolean; + defaultSensitive: boolean; autoSensitive: boolean; carefulBot: boolean; autoAcceptFollowed: boolean; @@ -20545,6 +20546,7 @@ export type operations = { injectFeaturedNote?: boolean; receiveAnnouncementEmail?: boolean; alwaysMarkNsfw?: boolean; + defaultSensitive?: boolean; autoSensitive?: boolean; /** @enum {string} */ followingVisibility?: 'public' | 'followers' | 'private';