diff --git a/packages/api/src/jobs/prune_library_item.ts b/packages/api/src/jobs/prune_library_item.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/api/src/jobs/prune_trash.ts b/packages/api/src/jobs/prune_trash.ts new file mode 100644 index 000000000..953c060be --- /dev/null +++ b/packages/api/src/jobs/prune_trash.ts @@ -0,0 +1,5 @@ +import { pruneTrash } from '../services/library_item' + +export const PRUNE_TRASH_JOB = 'prune_trash' + +export const pruneTrashJob = async () => pruneTrash() diff --git a/packages/api/src/queue-processor.ts b/packages/api/src/queue-processor.ts index 5e9aec3a9..44df2e905 100644 --- a/packages/api/src/queue-processor.ts +++ b/packages/api/src/queue-processor.ts @@ -50,6 +50,7 @@ import { PROCESS_YOUTUBE_TRANSCRIPT_JOB_NAME, PROCESS_YOUTUBE_VIDEO_JOB_NAME, } from './jobs/process-youtube-video' +import { pruneTrashJob, PRUNE_TRASH_JOB } from './jobs/prune_trash' import { refreshAllFeeds } from './jobs/rss/refreshAllFeeds' import { refreshFeed } from './jobs/rss/refreshFeed' import { savePageJob } from './jobs/save_page' @@ -214,6 +215,8 @@ export const createWorker = (connection: ConnectionOptions) => return scoreLibraryItem(job.data) case GENERATE_PREVIEW_CONTENT_JOB: return generatePreviewContent(job.data) + case PRUNE_TRASH_JOB: + return pruneTrashJob() default: logger.warning(`[queue-processor] unhandled job: ${job.name}`) } @@ -248,6 +251,18 @@ const setupCronJobs = async () => { }, } ) + + await queue.add( + PRUNE_TRASH_JOB, + {}, + { + priority: getJobPriority(PRUNE_TRASH_JOB), + repeat: { + // daily at 3am + pattern: '0 3 * * *', + }, + } + ) } const main = async () => { diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 8cc8914ec..7a7a898f3 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -1779,3 +1779,6 @@ export const downloadOriginalContent = async ( }) ) } + +export const pruneTrash = async () => + appDataSource.query(`CALL omnivore.batch_delete_trash_items();`) diff --git a/packages/api/src/utils/createTask.ts b/packages/api/src/utils/createTask.ts index 212628d38..f10971332 100644 --- a/packages/api/src/utils/createTask.ts +++ b/packages/api/src/utils/createTask.ts @@ -41,6 +41,7 @@ import { PROCESS_YOUTUBE_TRANSCRIPT_JOB_NAME, PROCESS_YOUTUBE_VIDEO_JOB_NAME, } from '../jobs/process-youtube-video' +import { PRUNE_TRASH_JOB } from '../jobs/prune_trash' import { queueRSSRefreshFeedJob, REFRESH_ALL_FEEDS_JOB_NAME, @@ -112,6 +113,7 @@ export const getJobPriority = (jobName: string): number => { case REFRESH_ALL_FEEDS_JOB_NAME: case THUMBNAIL_JOB: case GENERATE_PREVIEW_CONTENT_JOB: + case PRUNE_TRASH_JOB: return 100 default: diff --git a/packages/db/migrations/0181.do.batch_delete_trash_items.sql b/packages/db/migrations/0181.do.batch_delete_trash_items.sql index 3657610ae..38a619469 100755 --- a/packages/db/migrations/0181.do.batch_delete_trash_items.sql +++ b/packages/db/migrations/0181.do.batch_delete_trash_items.sql @@ -4,9 +4,7 @@ BEGIN; -CREATE OR REPLACE PROCEDURE batch_delete_trash_items( - minimum_items INT -) +CREATE OR REPLACE PROCEDURE omnivore.batch_delete_trash_items() RETURNS VOID AS $$ DECLARE user_record RECORD; @@ -24,25 +22,11 @@ BEGIN -- For Row Level Security PERFORM omnivore.set_claims(user_record.id, 'omnivore_user'); - -- keep the minimum number of items in trash DELETE FROM omnivore.library_item WHERE user_id = user_record.id AND state = 'DELETED' - AND deleted_at < NOW() - INTERVAL '14 days' - AND id NOT IN ( - SELECT - id - FROM - omnivore.library_item - WHERE - user_id = user_record.id - AND state = 'DELETED' - AND deleted_at < NOW() - INTERVAL '14 days' - ORDER BY - deleted_at DESC - LIMIT minimum_items - ); + AND deleted_at < NOW() - INTERVAL '14 days'; COMMIT; END LOOP; diff --git a/packages/db/migrations/0181.undo.batch_delete_trash_items.sql b/packages/db/migrations/0181.undo.batch_delete_trash_items.sql index 3851c057b..3734a1db1 100755 --- a/packages/db/migrations/0181.undo.batch_delete_trash_items.sql +++ b/packages/db/migrations/0181.undo.batch_delete_trash_items.sql @@ -4,6 +4,6 @@ BEGIN; -DROP PROCEDURE IF EXISTS batch_delete_trash_items(); +DROP PROCEDURE IF EXISTS omnivore.batch_delete_trash_items(); COMMIT;