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 07b38d538..3657610ae 100755 --- a/packages/db/migrations/0181.do.batch_delete_trash_items.sql +++ b/packages/db/migrations/0181.do.batch_delete_trash_items.sql @@ -4,7 +4,9 @@ BEGIN; -CREATE OR REPLACE FUNCTION batch_delete_trash_items() +CREATE OR REPLACE PROCEDURE batch_delete_trash_items( + minimum_items INT +) RETURNS VOID AS $$ DECLARE user_record RECORD; @@ -17,14 +19,32 @@ DECLARE status = 'ACTIVE'; BEGIN FOR user_record IN user_cursor LOOP + 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 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 + ); + + COMMIT; END LOOP; END; $$ LANGUAGE plpgsql; 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 836f8e533..3851c057b 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 FUNCTION IF EXISTS batch_delete_trash_items(); +DROP PROCEDURE IF EXISTS batch_delete_trash_items(); COMMIT;