From 755f483ba93c30ca2e7863ff069afbad730aa911 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 11 Jun 2024 18:51:25 +0800 Subject: [PATCH] create a function to batch delete items in trash --- packages/api/src/jobs/prune_library_item.ts | 0 packages/api/src/services/library_item.ts | 24 ++++++++++++++ .../0181.do.batch_delete_trash_items.sql | 32 +++++++++++++++++++ .../0181.undo.batch_delete_trash_items.sql | 9 ++++++ 4 files changed, 65 insertions(+) create mode 100644 packages/api/src/jobs/prune_library_item.ts create mode 100755 packages/db/migrations/0181.do.batch_delete_trash_items.sql create mode 100755 packages/db/migrations/0181.undo.batch_delete_trash_items.sql diff --git a/packages/api/src/jobs/prune_library_item.ts b/packages/api/src/jobs/prune_library_item.ts new file mode 100644 index 000000000..e69de29bb diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index fb5a5c2cf..8cc8914ec 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -1392,6 +1392,30 @@ export const batchDelete = async (criteria: FindOptionsWhere) => { return authTrx(async (t) => t.query(sql)) } +export const batchDeleteAllTrash = async () => { + const sql = ` + DO $$ + DECLARE + user_record RECORD; + user_cursor CURSOR FOR SELECT id FROM omnivore.user WHERE status = 'ACTIVE'; -- Adjust the condition as needed + BEGIN + OPEN user_cursor; + + LOOP + FETCH NEXT FROM user_cursor INTO user_record; + EXIT WHEN NOT FOUND; + + DELETE FROM omnivore.library_item WHERE user_id = user_record.id AND state = 'DELETED' AND deleted_at < '2023-01-01'; + + RETURN NEXT; + END LOOP; + + CLOSE user_cursor; + END $$;` + + return authTrx(async (t) => t.query(sql)) +} + export const findLibraryItemIdsByLabelId = async ( labelId: string, userId: string diff --git a/packages/db/migrations/0181.do.batch_delete_trash_items.sql b/packages/db/migrations/0181.do.batch_delete_trash_items.sql new file mode 100755 index 000000000..07b38d538 --- /dev/null +++ b/packages/db/migrations/0181.do.batch_delete_trash_items.sql @@ -0,0 +1,32 @@ +-- Type: DO +-- Name: batch_delete_trash_items +-- Description: Create a function to batch delete library items in trash + +BEGIN; + +CREATE OR REPLACE FUNCTION batch_delete_trash_items() +RETURNS VOID AS $$ +DECLARE + user_record RECORD; + user_cursor CURSOR FOR + SELECT + id + FROM + omnivore.user + WHERE + status = 'ACTIVE'; +BEGIN + FOR user_record IN user_cursor LOOP + -- For Row Level Security + PERFORM omnivore.set_claims(user_record.id, 'omnivore_user'); + + DELETE FROM omnivore.library_item + WHERE + user_id = user_record.id + AND state = 'DELETED' + AND deleted_at < NOW() - INTERVAL '14 days'; + END LOOP; +END; +$$ LANGUAGE plpgsql; + +COMMIT; diff --git a/packages/db/migrations/0181.undo.batch_delete_trash_items.sql b/packages/db/migrations/0181.undo.batch_delete_trash_items.sql new file mode 100755 index 000000000..836f8e533 --- /dev/null +++ b/packages/db/migrations/0181.undo.batch_delete_trash_items.sql @@ -0,0 +1,9 @@ +-- Type: UNDO +-- Name: batch_delete_trash_items +-- Description: Create a function to batch delete library items in trash + +BEGIN; + +DROP FUNCTION IF EXISTS batch_delete_trash_items(); + +COMMIT;