diff --git a/locales/en-US.yml b/locales/en-US.yml index 1583286ada..c489ec4d79 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -99,7 +99,6 @@ serverIsDead: "This server is not responding. Please wait for a while and try ag youShouldUpgradeClient: "To view this page, please refresh to update your client." enterListName: "Enter a name for the list" privacy: "Privacy" -autoDeleteNotes: "Self-destructing notes" makeFollowManuallyApprove: "Follow requests require approval" defaultNoteVisibility: "Default visibility" follow: "Follow" @@ -948,7 +947,6 @@ oneHour: "One hour" oneDay: "One day" oneWeek: "One week" oneMonth: "One month" -oneYear: "One year" reflectMayTakeTime: "It may take some time for this to be reflected." failedToFetchAccountInformation: "Could not fetch account information" rateLimitExceeded: "Rate limit exceeded" @@ -2002,8 +2000,6 @@ _time: minute: "Minute(s)" hour: "Hour(s)" day: "Day(s)" - month: "Month(s)" - year: "Year(s)" _2fa: alreadyRegistered: "You have already registered a 2-factor authentication device." registerTOTP: "Register authenticator app" diff --git a/packages/backend/migration/1709530777533-autoDeleteNotes.js b/packages/backend/migration/1709530777533-autoDeleteNotes.js deleted file mode 100644 index 2b296c4f29..0000000000 --- a/packages/backend/migration/1709530777533-autoDeleteNotes.js +++ /dev/null @@ -1,14 +0,0 @@ -export class AutoDeleteNotes1709530777533 { - name = "AutoDeleteNotes1709530777533"; - - async up(queryRunner) { - await queryRunner.query(`ALTER TABLE user_profile ADD "autoDeleteNotes" boolean NOT NULL DEFAULT false;`); - await queryRunner.query(`ALTER TABLE user_profile ADD "autoDeleteNotesMinutes" integer NOT NULL DEFAULT 43200;`); - } - - async down(queryRunner) { - await queryRunner.query(`ALTER TABLE user_profile DROP COLUMN "autoDeleteNotes";`); - await queryRunner.query(`ALTER TABLE user_profile DROP COLUMN "autoDeleteNotesMinutes";`); - } - -} diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts index 96b52c33b4..103813acf2 100644 --- a/packages/backend/src/core/QueueService.ts +++ b/packages/backend/src/core/QueueService.ts @@ -69,12 +69,6 @@ export class QueueService { repeat: { pattern: '*/5 * * * *' }, removeOnComplete: true, }); - - this.systemQueue.add('autoDeleteNotes', { - }, { - repeat: { pattern: '*/5 * * * *' }, - removeOnComplete: true, - }); } @bindThis diff --git a/packages/backend/src/core/entities/UserEntityService.ts b/packages/backend/src/core/entities/UserEntityService.ts index 20a3ca64c7..8f5d986fac 100644 --- a/packages/backend/src/core/entities/UserEntityService.ts +++ b/packages/backend/src/core/entities/UserEntityService.ts @@ -509,8 +509,6 @@ export class UserEntityService implements OnModuleInit { mutedWords: profile!.mutedWords, hardMutedWords: profile!.hardMutedWords, mutedInstances: profile!.mutedInstances, - autoDeleteNotes: profile!.autoDeleteNotes, - autoDeleteNotesMinutes: profile!.autoDeleteNotesMinutes, mutingNotificationTypes: [], // 後方互換性のため notificationRecieveConfig: profile!.notificationRecieveConfig, emailNotificationTypes: profile!.emailNotificationTypes, diff --git a/packages/backend/src/models/UserProfile.ts b/packages/backend/src/models/UserProfile.ts index 90d1e0e0d1..c4f6a16e24 100644 --- a/packages/backend/src/models/UserProfile.ts +++ b/packages/backend/src/models/UserProfile.ts @@ -277,17 +277,6 @@ export class MiUserProfile { unlockedAt: number; }[]; - @Column('boolean', { - default: false, - }) - public autoDeleteNotes: boolean; - - @Column('integer', { - default: 43200, // 30 days in minutes - }) - public autoDeleteNotesMinutes: number; - - //#region Denormalized fields @Index() @Column('varchar', { diff --git a/packages/backend/src/models/json-schema/user.ts b/packages/backend/src/models/json-schema/user.ts index c31291a6a4..33a3efd453 100644 --- a/packages/backend/src/models/json-schema/user.ts +++ b/packages/backend/src/models/json-schema/user.ts @@ -605,14 +605,6 @@ export const packedMeDetailedOnlySchema = { nullable: false, optional: false, }, }, - autoDeleteNotes: { - type: 'boolean', - nullable: false, optional: false, - }, - autoDeleteNotesMinutes: { - type: 'number', - nullable: false, optional: false, - }, notificationRecieveConfig: { type: 'object', nullable: false, optional: false, diff --git a/packages/backend/src/queue/QueueProcessorModule.ts b/packages/backend/src/queue/QueueProcessorModule.ts index 593e1d4b2f..d7316e19e3 100644 --- a/packages/backend/src/queue/QueueProcessorModule.ts +++ b/packages/backend/src/queue/QueueProcessorModule.ts @@ -13,7 +13,6 @@ import { EndedPollNotificationProcessorService } from './processors/EndedPollNot import { InboxProcessorService } from './processors/InboxProcessorService.js'; import { WebhookDeliverProcessorService } from './processors/WebhookDeliverProcessorService.js'; import { CheckExpiredMutingsProcessorService } from './processors/CheckExpiredMutingsProcessorService.js'; -import { AutoDeleteNotesProcessorService } from './processors/AutoDeleteNotesProcessorService.js'; import { CleanChartsProcessorService } from './processors/CleanChartsProcessorService.js'; import { CleanProcessorService } from './processors/CleanProcessorService.js'; import { CleanRemoteFilesProcessorService } from './processors/CleanRemoteFilesProcessorService.js'; @@ -53,7 +52,6 @@ import { RelationshipProcessorService } from './processors/RelationshipProcessor ResyncChartsProcessorService, CleanChartsProcessorService, CheckExpiredMutingsProcessorService, - AutoDeleteNotesProcessorService, CleanProcessorService, DeleteDriveFilesProcessorService, ExportAccountDataProcessorService, diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts index d8f39dd5c4..76b6d7fb05 100644 --- a/packages/backend/src/queue/QueueProcessorService.ts +++ b/packages/backend/src/queue/QueueProcessorService.ts @@ -38,7 +38,6 @@ import { TickChartsProcessorService } from './processors/TickChartsProcessorServ import { ResyncChartsProcessorService } from './processors/ResyncChartsProcessorService.js'; import { CleanChartsProcessorService } from './processors/CleanChartsProcessorService.js'; import { CheckExpiredMutingsProcessorService } from './processors/CheckExpiredMutingsProcessorService.js'; -import { AutoDeleteNotesProcessorService } from './processors/AutoDeleteNotesProcessorService.js'; import { CleanProcessorService } from './processors/CleanProcessorService.js'; import { AggregateRetentionProcessorService } from './processors/AggregateRetentionProcessorService.js'; import { QueueLoggerService } from './QueueLoggerService.js'; @@ -119,7 +118,6 @@ export class QueueProcessorService implements OnApplicationShutdown { private cleanChartsProcessorService: CleanChartsProcessorService, private aggregateRetentionProcessorService: AggregateRetentionProcessorService, private checkExpiredMutingsProcessorService: CheckExpiredMutingsProcessorService, - private autoDeleteNotesProcessorService: AutoDeleteNotesProcessorService, private cleanProcessorService: CleanProcessorService, ) { this.logger = this.queueLoggerService.logger; @@ -148,7 +146,6 @@ export class QueueProcessorService implements OnApplicationShutdown { case 'cleanCharts': return this.cleanChartsProcessorService.process(); case 'aggregateRetention': return this.aggregateRetentionProcessorService.process(); case 'checkExpiredMutings': return this.checkExpiredMutingsProcessorService.process(); - case 'autoDeleteNotes': return this.autoDeleteNotesProcessorService.process(); case 'clean': return this.cleanProcessorService.process(); default: throw new Error(`unrecognized job type ${job.name} for system`); } diff --git a/packages/backend/src/queue/processors/AutoDeleteNotesProcessorService.ts b/packages/backend/src/queue/processors/AutoDeleteNotesProcessorService.ts deleted file mode 100644 index c3a057c3b2..0000000000 --- a/packages/backend/src/queue/processors/AutoDeleteNotesProcessorService.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * SPDX-FileCopyrightText: syuilo and misskey-project - * SPDX-License-Identifier: AGPL-3.0-only - */ - -import { Inject, Injectable } from '@nestjs/common'; -import { In } from 'typeorm'; -import { DI } from '@/di-symbols.js'; -import type { UserProfilesRepository, NotesRepository } from '@/models/_.js'; -import type Logger from '@/logger.js'; -import { bindThis } from '@/decorators.js'; -import { NoteDeleteService } from '@/core/NoteDeleteService.js'; -import { IdService } from '@/core/IdService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import type * as Bull from 'bullmq'; - -@Injectable() -export class AutoDeleteNotesProcessorService { - private logger: Logger; - - constructor( - @Inject(DI.userProfilesRepository) - private userProfilesRepository: UserProfilesRepository, - @Inject(DI.notesRepository) - private notesRepository: NotesRepository, - @Inject(DI.userNotePiningsRepository) - private userNotePiningsRepository: UserNotePiningsRepository, - - private idService: IdService, - private noteDeleteService: NoteDeleteService, - private queueLoggerService: QueueLoggerService, - ) { - this.logger = this.queueLoggerService.logger.createSubLogger('auto-delete-notes'); - } - - @bindThis - public async process(): Promise { - this.logger.info('Auto deleting old notes...'); - - const userProfiles = await this.userProfilesRepository.createQueryBuilder('user_profile') - .innerJoinAndSelect('user_profile.user', 'user') - .where('user.host IS NULL') - .andWhere('user_profile.autoDeleteNotes') - .getMany(); - - for (const userProfile of userProfiles) { - const user = userProfile.user; - this.logger.debug(`Deleting old notes of user @${user.username} (id ${user.id})`); - const untilTime = Date.now() - (userProfile.autoDeleteNotesMinutes * 1000 * 60); - const untilId = this.idService.gen(untilTime); - - const pins = await this.userNotePiningsRepository.createQueryBuilder('user_note_pining') - .where('"userId" = :userId', { userId: user.id }) - .getMany(); - - const pinnedNoteIds = pins.map((p) => p.noteId); - - const notes = await this.notesRepository.createQueryBuilder('note') - .where('note."userId" = :userId', { userId: user.id }) - .andWhere('note.id < :untilId', { untilId }) - .andWhere('note.id NOT IN (SELECT "noteId" FROM note_favorite WHERE "userId" = :userId)') - .getMany(); - - for (const note of notes) { - if (pinnedNoteIds.includes(note.id)) { - this.logger.debug(`Skipping note ${note.id} as it is pinned`); - continue; - } - - this.logger.debug(`Deleting note ${note.id}`); - await this.noteDeleteService.delete(user, note, false, user); - } - } - - this.logger.succ('Done with note auto-delete'); - } -} diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts index 818322eb8e..9cdca02224 100644 --- a/packages/backend/src/server/api/endpoints/admin/show-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts @@ -88,14 +88,6 @@ export const meta = { type: 'string', }, }, - autoDeleteNotes: { - type: 'boolean', - optional: false, nullable: false, - }, - autoDeleteNotesMinutes: { - type: 'number', - optional: false, nullable: false, - }, notificationRecieveConfig: { type: 'object', optional: false, nullable: false, @@ -247,8 +239,6 @@ export default class extends Endpoint { // eslint- receiveAnnouncementEmail: profile.receiveAnnouncementEmail, mutedWords: profile.mutedWords, mutedInstances: profile.mutedInstances, - autoDeleteNotesMinutes: profile.autoDeleteNotesMinutes, - autoDeleteNotes: profile.autoDeleteNotes, notificationRecieveConfig: profile.notificationRecieveConfig, isModerator: isModerator, isSilenced: isSilenced, diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index 7bd3cbf68d..cb413de9ee 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -202,8 +202,6 @@ export const paramDef = { mutedInstances: { type: 'array', items: { type: 'string', } }, - autoDeleteNotes: { type: 'boolean', nullable: false }, - autoDeleteNotesMinutes: { type: 'number', nullable: false, minimum: 1 }, notificationRecieveConfig: { type: 'object', nullable: false, @@ -321,8 +319,6 @@ export default class extends Endpoint { // eslint- profileUpdates.hardMutedWords = ps.hardMutedWords; } if (ps.mutedInstances !== undefined) profileUpdates.mutedInstances = ps.mutedInstances; - if (ps.autoDeleteNotes !== undefined) profileUpdates.autoDeleteNotes = ps.autoDeleteNotes; - if (ps.autoDeleteNotesMinutes !== undefined) profileUpdates.autoDeleteNotesMinutes = ps.autoDeleteNotesMinutes; if (ps.notificationRecieveConfig !== undefined) profileUpdates.notificationRecieveConfig = ps.notificationRecieveConfig; if (typeof ps.isLocked === 'boolean') updates.isLocked = ps.isLocked; if (typeof ps.isExplorable === 'boolean') updates.isExplorable = ps.isExplorable; diff --git a/packages/frontend/src/pages/settings/privacy.autodelete.vue b/packages/frontend/src/pages/settings/privacy.autodelete.vue deleted file mode 100644 index 34675fb5c3..0000000000 --- a/packages/frontend/src/pages/settings/privacy.autodelete.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - diff --git a/packages/frontend/src/pages/settings/privacy.vue b/packages/frontend/src/pages/settings/privacy.vue index 36f3319871..86cf5ab241 100644 --- a/packages/frontend/src/pages/settings/privacy.vue +++ b/packages/frontend/src/pages/settings/privacy.vue @@ -68,15 +68,6 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.keepCw }} - - -
- - - - -
-
@@ -91,7 +82,6 @@ import { defaultStore } from '@/store.js'; import { i18n } from '@/i18n.js'; import { signinRequired } from '@/account.js'; import { definePageMetadata } from '@/scripts/page-metadata.js'; -import XAutoDelete from './privacy.autodelete.vue'; const $i = signinRequired();