diff --git a/packages/backend/migration/1710383352620-ScheduledDeleteNote.js b/packages/backend/migration/1710383352620-ScheduledDeleteNote.js index 2f50a3d8f9..92268fccba 100644 --- a/packages/backend/migration/1710383352620-ScheduledDeleteNote.js +++ b/packages/backend/migration/1710383352620-ScheduledDeleteNote.js @@ -7,10 +7,10 @@ export class ScheduledDeleteNote1710383352620 { name = 'ScheduledDeleteNote1710383352620' async up(queryRunner) { - await queryRunner.query(`ALTER TABLE "notes" ADD "deleteAt" TIMESTAMP WITH TIME ZONE`) + await queryRunner.query(`ALTER TABLE "note" ADD "deleteAt" TIMESTAMP WITH TIME ZONE`) } async down(queryRunner) { - await queryRunner.query(`ALTER TABLE "notes" DROP COLUMN "deleteAt"`) + await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "deleteAt"`) } } diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index 9a7da0eb15..c3122ca42d 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -150,7 +150,6 @@ type Option = { uri?: string | null; url?: string | null; app?: MiApp | null; - deleteAt?: Date | null; }; @Injectable() @@ -413,7 +412,6 @@ export class NoteCreateService implements OnApplicationShutdown { text: data.text, hasPoll: data.poll != null, hasEvent: data.event != null, - deleteAt: data.deleteAt, cw: data.cw ?? null, tags: tags.map(tag => normalizeForSearch(tag)), emojis, @@ -584,16 +582,6 @@ export class NoteCreateService implements OnApplicationShutdown { }); } - if (data.deleteAt) { - const delay = data.deleteAt.getTime() - Date.now(); - this.queueService.scheduledNoteDeletionQueue.add(note.id, { - noteId: note.id, - }, { - delay, - removeOnComplete: true, - }); - } - if (!silent) { if (this.userEntityService.isLocalUser(user)) this.activeUsersChart.write(user); diff --git a/packages/backend/src/core/QueueModule.ts b/packages/backend/src/core/QueueModule.ts index 237671625e..23cfd4f538 100644 --- a/packages/backend/src/core/QueueModule.ts +++ b/packages/backend/src/core/QueueModule.ts @@ -11,7 +11,7 @@ import type { Config } from '@/config.js'; import { QUEUE, baseQueueOptions } from '@/queue/const.js'; import { allSettled } from '@/misc/promise-tracker.js'; import type { Provider } from '@nestjs/common'; -import type { DeliverJobData, InboxJobData, EndedPollNotificationJobData, WebhookDeliverJobData, RelationshipJobData, ScheduledNoteDeleteJobData } from '../queue/types.js'; +import type { DeliverJobData, InboxJobData, EndedPollNotificationJobData, WebhookDeliverJobData, RelationshipJobData } from '../queue/types.js'; export type SystemQueue = Bull.Queue>; export type EndedPollNotificationQueue = Bull.Queue; @@ -21,7 +21,6 @@ export type DbQueue = Bull.Queue; export type RelationshipQueue = Bull.Queue; export type ObjectStorageQueue = Bull.Queue; export type WebhookDeliverQueue = Bull.Queue; -export type ScheduledNoteDeleteJobQueue = Bull.Queue; const $system: Provider = { provide: 'queue:system', @@ -35,12 +34,6 @@ const $endedPollNotification: Provider = { inject: [DI.config, DI.redisForJobQueue], }; -const $scheduledNoteDelete: Provider = { - provide: 'queue:scheduledNoteDelete', - useFactory: (config: Config, redisForJobQueue: Redis.Redis) => new Bull.Queue(QUEUE.SCHEDULED_NOTE_DELETE, baseQueueOptions(config, QUEUE.SCHEDULED_NOTE_DELETE, redisForJobQueue)), - inject: [DI.config, DI.redisForJobQueue], -}; - const $deliver: Provider = { provide: 'queue:deliver', useFactory: (config: Config, redisForJobQueue: Redis.Redis) => new Bull.Queue(QUEUE.DELIVER, baseQueueOptions(config, QUEUE.DELIVER, redisForJobQueue)), @@ -83,7 +76,6 @@ const $webhookDeliver: Provider = { providers: [ $system, $endedPollNotification, - $scheduledNoteDelete, $deliver, $inbox, $db, @@ -94,7 +86,6 @@ const $webhookDeliver: Provider = { exports: [ $system, $endedPollNotification, - $scheduledNoteDelete, $deliver, $inbox, $db, @@ -107,7 +98,6 @@ export class QueueModule implements OnApplicationShutdown { constructor( @Inject('queue:system') public systemQueue: SystemQueue, @Inject('queue:endedPollNotification') public endedPollNotificationQueue: EndedPollNotificationQueue, - @Inject('queue:scheduledNoteDelete') public scheduledNoteDeleteQueue: ScheduledNoteDeleteJobQueue, @Inject('queue:deliver') public deliverQueue: DeliverQueue, @Inject('queue:inbox') public inboxQueue: InboxQueue, @Inject('queue:db') public dbQueue: DbQueue, @@ -123,7 +113,6 @@ export class QueueModule implements OnApplicationShutdown { await Promise.all([ this.systemQueue.close(), this.endedPollNotificationQueue.close(), - this.scheduledNoteDeleteQueue.close(), this.deliverQueue.close(), this.inboxQueue.close(), this.dbQueue.close(), diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts index add902a1fc..00d9faea3c 100644 --- a/packages/backend/src/core/QueueService.ts +++ b/packages/backend/src/core/QueueService.ts @@ -14,7 +14,7 @@ import { DI } from '@/di-symbols.js'; import { bindThis } from '@/decorators.js'; import type { Antenna } from '@/server/api/endpoints/i/import-antennas.js'; import { ApRequestCreator } from '@/core/activitypub/ApRequestService.js'; -import type { DbQueue, DeliverQueue, EndedPollNotificationQueue, InboxQueue, ObjectStorageQueue, RelationshipQueue, SystemQueue, WebhookDeliverQueue, ScheduledNoteDeleteJobQueue } from './QueueModule.js'; +import type { DbQueue, DeliverQueue, EndedPollNotificationQueue, InboxQueue, ObjectStorageQueue, RelationshipQueue, SystemQueue, WebhookDeliverQueue } from './QueueModule.js'; import type { DbJobData, DeliverJobData, RelationshipJobData, ThinUser } from '../queue/types.js'; import type httpSignature from '@peertube/http-signature'; import type * as Bull from 'bullmq'; @@ -27,7 +27,6 @@ export class QueueService { @Inject('queue:system') public systemQueue: SystemQueue, @Inject('queue:endedPollNotification') public endedPollNotificationQueue: EndedPollNotificationQueue, - @Inject('queue:scheduledNoteDelete') public scheduledNoteDeleteQueue: ScheduledNoteDeleteJobQueue, @Inject('queue:deliver') public deliverQueue: DeliverQueue, @Inject('queue:inbox') public inboxQueue: InboxQueue, @Inject('queue:db') public dbQueue: DbQueue, diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts index c82de58b14..5fda736b15 100644 --- a/packages/backend/src/core/entities/NoteEntityService.ts +++ b/packages/backend/src/core/entities/NoteEntityService.ts @@ -393,7 +393,6 @@ export class NoteEntityService implements OnModuleInit { poll: note.hasPoll ? this.populatePoll(note, meId) : undefined, event: note.hasEvent ? this.populateEvent(note) : undefined, - deleteAt: note.deleteAt?.toISOString() ?? undefined, ...(meId && Object.keys(note.reactions).length > 0 ? { myReaction: this.populateMyReaction(note, meId, options?._hint_), diff --git a/packages/backend/src/models/Note.ts b/packages/backend/src/models/Note.ts index bb5f6dcfd6..02df6e0ecb 100644 --- a/packages/backend/src/models/Note.ts +++ b/packages/backend/src/models/Note.ts @@ -210,11 +210,6 @@ export class MiNote { }) public hasPoll: boolean; - @Column('timestamp with time zone', { - nullable: true, - }) - public deleteAt: Date | null; - @Index() @Column({ ...id(), diff --git a/packages/backend/src/models/json-schema/note.ts b/packages/backend/src/models/json-schema/note.ts index 2facc13b5e..00c2eac310 100644 --- a/packages/backend/src/models/json-schema/note.ts +++ b/packages/backend/src/models/json-schema/note.ts @@ -187,11 +187,6 @@ export const packedNoteSchema = { type: 'object', optional: true, nullable: true, }, - deleteAt: { - type: 'string', - optional: true, nullable: true, - format: 'date-time', - }, channelId: { type: 'string', optional: true, nullable: true, diff --git a/packages/backend/src/queue/QueueProcessorModule.ts b/packages/backend/src/queue/QueueProcessorModule.ts index a01ea8d973..8b9e5a45b7 100644 --- a/packages/backend/src/queue/QueueProcessorModule.ts +++ b/packages/backend/src/queue/QueueProcessorModule.ts @@ -8,7 +8,6 @@ import { CoreModule } from '@/core/CoreModule.js'; import { GlobalModule } from '@/GlobalModule.js'; import { QueueLoggerService } from './QueueLoggerService.js'; import { QueueProcessorService } from './QueueProcessorService.js'; -import { ScheduledNoteDeleteProcessorService } from './processors/ScheduledNoteDeleteService.js'; import { DeliverProcessorService } from './processors/DeliverProcessorService.js'; import { EndedPollNotificationProcessorService } from './processors/EndedPollNotificationProcessorService.js'; import { InboxProcessorService } from './processors/InboxProcessorService.js'; @@ -76,7 +75,6 @@ import { RelationshipProcessorService } from './processors/RelationshipProcessor ReportAbuseProcessorService, WebhookDeliverProcessorService, EndedPollNotificationProcessorService, - ScheduledNoteDeleteProcessorService, DeliverProcessorService, InboxProcessorService, AggregateRetentionProcessorService, diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts index 6edc34b996..255bbada07 100644 --- a/packages/backend/src/queue/QueueProcessorService.ts +++ b/packages/backend/src/queue/QueueProcessorService.ts @@ -12,7 +12,6 @@ import type Logger from '@/logger.js'; import { bindThis } from '@/decorators.js'; import { WebhookDeliverProcessorService } from './processors/WebhookDeliverProcessorService.js'; import { EndedPollNotificationProcessorService } from './processors/EndedPollNotificationProcessorService.js'; -import { ScheduledNoteDeleteProcessorService } from './processors/ScheduledNoteDeleteService.js'; import { DeliverProcessorService } from './processors/DeliverProcessorService.js'; import { InboxProcessorService } from './processors/InboxProcessorService.js'; import { DeleteDriveFilesProcessorService } from './processors/DeleteDriveFilesProcessorService.js'; @@ -76,7 +75,6 @@ export class QueueProcessorService implements OnApplicationShutdown { private logger: Logger; private systemQueueWorker: Bull.Worker; private dbQueueWorker: Bull.Worker; - private scheduleNoteDeleteQueueWorker: Bull.Worker; private deliverQueueWorker: Bull.Worker; private inboxQueueWorker: Bull.Worker; private webhookDeliverQueueWorker: Bull.Worker; @@ -123,7 +121,6 @@ export class QueueProcessorService implements OnApplicationShutdown { private aggregateRetentionProcessorService: AggregateRetentionProcessorService, private checkExpiredMutingsProcessorService: CheckExpiredMutingsProcessorService, private cleanProcessorService: CleanProcessorService, - private scheduledNoteDeleteProcessorService: ScheduledNoteDeleteProcessorService, ) { this.logger = this.queueLoggerService.logger; @@ -339,13 +336,6 @@ export class QueueProcessorService implements OnApplicationShutdown { autorun: false, }); //#endregion - - //#region scheduled note delete - this.scheduledNoteDeleteProcessorService = new Bull.Worker(QUEUE.SCHEDULED_NOTE_DELETE, (job) => this.scheduledNoteDeleteProcessorService.process(job), { - ...baseQueueOptions(this.config, QUEUE.SCHEDULED_NOTE_DELETE), - autorun: false, - }); - //#endregion } @bindThis @@ -359,7 +349,6 @@ export class QueueProcessorService implements OnApplicationShutdown { this.relationshipQueueWorker.run(), this.objectStorageQueueWorker.run(), this.endedPollNotificationQueueWorker.run(), - this.scheduleNoteDeleteQueueWorker.run(), ]); } @@ -374,7 +363,6 @@ export class QueueProcessorService implements OnApplicationShutdown { this.relationshipQueueWorker.close(), this.objectStorageQueueWorker.close(), this.endedPollNotificationQueueWorker.close(), - this.scheduleNoteDeleteQueueWorker.close(), ]); } diff --git a/packages/backend/src/queue/const.ts b/packages/backend/src/queue/const.ts index b8852ec951..3d0f65dbf2 100644 --- a/packages/backend/src/queue/const.ts +++ b/packages/backend/src/queue/const.ts @@ -12,7 +12,6 @@ export const QUEUE = { INBOX: 'inbox', SYSTEM: 'system', ENDED_POLL_NOTIFICATION: 'endedPollNotification', - SCHEDULED_NOTE_DELETE: 'scheduledNoteDelete', DB: 'db', RELATIONSHIP: 'relationship', OBJECT_STORAGE: 'objectStorage', diff --git a/packages/backend/src/queue/processors/ScheduledNoteDeleteService.ts b/packages/backend/src/queue/processors/ScheduledNoteDeleteService.ts deleted file mode 100644 index 61dd04307d..0000000000 --- a/packages/backend/src/queue/processors/ScheduledNoteDeleteService.ts +++ /dev/null @@ -1,47 +0,0 @@ - -import { Inject, Injectable } from '@nestjs/common'; -import { DI } from '@/di-symbols.js'; -import type { NotesRepository, UsersRepository } from '@/models/_.js'; -import type Logger from '@/logger.js'; -import { bindThis } from '@/decorators.js'; -import { NoteDeleteService } from '@/core/NoteDeleteService.js'; -import { QueueLoggerService } from '../QueueLoggerService.js'; -import { ScheduledNoteDeleteJobData } from '../types.js'; -import type * as Bull from 'bullmq'; - -@Injectable() -export class ScheduledNoteDeleteProcessorService { - private logger: Logger; - - constructor( - @Inject(DI.notesRepository) - private notesRepository: NotesRepository, - - @Inject(DI.usersRepository) - private usersRepository: UsersRepository, - - private noteDeleteService: NoteDeleteService, - private queueLoggerService: QueueLoggerService, - ) { - this.logger = queueLoggerService.logger.createSubLogger('scheduled-note-delete'); - } - - @bindThis - public async process(job: Bull.Job) { - const { noteId } = job.data; - - const note = await this.notesRepository.findOneBy({ id: job.data.noteId }); - if (note == null) { - return; - } - - const user = await this.usersRepository.findOneBy({ id: note.userId }); - if (user == null) { - return; - } - - await this.noteDeleteService.delete(user, note); - this.logger.info(`Deleted note ${note.id}`); - } -} - diff --git a/packages/backend/src/queue/types.ts b/packages/backend/src/queue/types.ts index 68914c9cc3..6130740286 100644 --- a/packages/backend/src/queue/types.ts +++ b/packages/backend/src/queue/types.ts @@ -109,10 +109,6 @@ export type EndedPollNotificationJobData = { noteId: MiNote['id']; }; -export type ScheduledNoteDeleteJobData = { - noteId: MiNote['id']; -}; - export type WebhookDeliverJobData = { type: string; content: unknown; diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts index d0f40aa6c6..07d328724f 100644 --- a/packages/backend/src/server/api/endpoints/notes/create.ts +++ b/packages/backend/src/server/api/endpoints/notes/create.ts @@ -189,14 +189,6 @@ export const paramDef = { metadata: { type: 'object' }, }, }, - scheduledDelete: { - type: 'object', - nullable: true, - properties: { - deleteAt: { type: 'integer', nullable: true }, - deleteAfter: { type: 'integer', nullable: true, minimum: 1 }, - }, - }, }, // (re)note with text, files and poll are optional if: { @@ -357,16 +349,6 @@ export default class extends Endpoint { // eslint- } } - if (ps.scheduledDelete) { - if (typeof ps.scheduledDelete.deleteAt === 'number') { - if (ps.scheduledDelete.deleteAt < Date.now()) { - throw new ApiError(meta.errors.cannotScheduleDeleteEarlierThanNow); - } - } else if (typeof ps.scheduledDelete.deleteAfter === 'number') { - ps.scheduledDelete.deleteAt = Date.now() + ps.scheduledDelete.deleteAfter; - } - } - let channel: MiChannel | null = null; if (ps.channelId != null) { channel = await this.channelsRepository.findOneBy({ id: ps.channelId, isArchived: false }); @@ -405,7 +387,6 @@ export default class extends Endpoint { // eslint- apMentions: ps.noExtractMentions ? [] : undefined, apHashtags: ps.noExtractHashtags ? [] : undefined, apEmojis: ps.noExtractEmojis ? [] : undefined, - deleteAt: ps.scheduledDelete?.deleteAt ? new Date(ps.scheduledDelete.deleteAt) : null, }); return { diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts index 3a244fc768..345a26cd62 100644 --- a/packages/backend/src/server/web/ClientServerService.ts +++ b/packages/backend/src/server/web/ClientServerService.ts @@ -24,7 +24,7 @@ import { getNoteSummary } from '@/misc/get-note-summary.js'; import { DI } from '@/di-symbols.js'; import * as Acct from '@/misc/acct.js'; import { MetaService } from '@/core/MetaService.js'; -import type { DbQueue, DeliverQueue, EndedPollNotificationQueue, InboxQueue, ObjectStorageQueue, SystemQueue, WebhookDeliverQueue, ScheduledNoteDeleteJobQueue } from '@/core/QueueModule.js'; +import type { DbQueue, DeliverQueue, EndedPollNotificationQueue, InboxQueue, ObjectStorageQueue, SystemQueue, WebhookDeliverQueue } from '@/core/QueueModule.js'; import { UserEntityService } from '@/core/entities/UserEntityService.js'; import { NoteEntityService } from '@/core/entities/NoteEntityService.js'; import { PageEntityService } from '@/core/entities/PageEntityService.js'; @@ -105,7 +105,6 @@ export class ClientServerService { @Inject('queue:system') public systemQueue: SystemQueue, @Inject('queue:endedPollNotification') public endedPollNotificationQueue: EndedPollNotificationQueue, - @Inject('queue:scheduledNoteDelete') public scheduledNoteDeleteQueue: ScheduledNoteDeleteJobQueue, @Inject('queue:deliver') public deliverQueue: DeliverQueue, @Inject('queue:inbox') public inboxQueue: InboxQueue, @Inject('queue:db') public dbQueue: DbQueue, @@ -223,7 +222,6 @@ export class ClientServerService { queues: [ this.systemQueue, this.endedPollNotificationQueue, - this.scheduledNoteDeleteQueue, this.deliverQueue, this.inboxQueue, this.dbQueue, diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index 7d48bddd0f..181fb8a307 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -42,7 +42,6 @@ SPDX-License-Identifier: AGPL-3.0-only -