add a REST API to trigger the expire folder job

This commit is contained in:
Hongbo Wu
2024-06-13 17:57:29 +08:00
parent 6f496b9336
commit 88e3d648c8
15 changed files with 115 additions and 160 deletions

View File

@ -1,25 +0,0 @@
-- Type: DO
-- Name: folder_policy
-- Description: Create a folder_policy table to contain the folder expiration policies for user and folder
BEGIN;
CREATE TYPE folder_action AS ENUM ('DELETE', 'ARCHIVE');
CREATE TABLE omnivore.folder_policy (
id UUID PRIMARY KEY DEFAULT uuid_generate_v1mc(),
user_id UUID NOT NULL REFERENCES omnivore.user(id) ON DELETE CASCADE,
folder TEXT NOT NULL, -- folder name in lowercase
action folder_action NOT NULL, -- delete or archive
after_days INT NOT NULL, -- number of days after which the action should be taken
minimum_items INT NOT NULL DEFAULT 0, -- minimum number of items to keep in the folder
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE (user_id, folder) -- only one policy per folder per user
);
CREATE TRIGGER update_folder_policy_modtime BEFORE UPDATE ON omnivore.folder_policy FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column();
GRANT SELECT, INSERT, UPDATE, DELETE ON omnivore.folder_policy TO omnivore_user;
COMMIT;

View File

@ -0,0 +1,68 @@
-- Type: DO
-- Name: folder_policy
-- Description: Create a folder_policy table to contain the folder expiration policies for user and folder
BEGIN;
CREATE TYPE folder_action AS ENUM ('DELETE', 'ARCHIVE');
CREATE TABLE omnivore.folder_policy (
id UUID PRIMARY KEY DEFAULT uuid_generate_v1mc(),
user_id UUID NOT NULL REFERENCES omnivore.user(id) ON DELETE CASCADE,
folder TEXT NOT NULL, -- folder name in lowercase
action folder_action NOT NULL, -- delete or archive
after_days INT NOT NULL, -- number of days after which the action should be taken
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE (user_id, folder, action) -- only one policy per user and folder action
);
CREATE TRIGGER update_folder_policy_modtime BEFORE UPDATE ON omnivore.folder_policy FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column();
GRANT SELECT, INSERT, UPDATE, DELETE ON omnivore.folder_policy TO omnivore_user;
CREATE PROCEDURE omnivore.expire_folders()
LANGUAGE plpgsql
AS $$
DECLARE
folder_record RECORD;
folder_name TEXT;
folder_action folder_action;
folder_user_id UUID;
folder_after_days INT;
old_states library_item_state[];
new_state library_item_state;
column_name TEXT;
folder_policy_cursor CURSOR FOR SELECT id, user_id, folder, action, after_days FROM omnivore.folder_policy;
BEGIN
FOR folder_record IN folder_policy_cursor LOOP
folder_user_id := folder_record.user_id;
folder_name := folder_record.folder;
folder_action := folder_record.action;
folder_after_days := folder_record.after_days;
IF folder_action = 'DELETE' THEN
old_states := ARRAY['SUCCEEDED', 'FAILED', 'ARCHIVED', 'PROCESSING', 'CONTENT_NOT_FETCHED'::library_item_state];
new_state := 'DELETED';
column_name := 'deleted_at';
ELSIF folder_action = 'ARCHIVE' THEN
old_states := ARRAY['SUCCEEDED', 'FAILED', 'PROCESSING', 'CONTENT_NOT_FETCHED'::library_item_state];
new_state := 'ARCHIVED';
column_name := 'archived_at';
END IF;
BEGIN
PERFORM omnivore.set_claims(folder_user_id, 'omnivore_user');
EXECUTE format('UPDATE omnivore.library_item '
'SET state = $1, %I = CURRENT_TIMESTAMP '
'WHERE user_id = $2 AND state = ANY ($3) AND folder = $4 AND created_at < CURRENT_TIMESTAMP - INTERVAL ''$5 days''', column_name)
USING new_state, folder_user_id, old_states, folder_name, folder_after_days;
COMMIT;
END;
END LOOP;
END;
$$;
COMMIT;

View File

@ -8,4 +8,6 @@ DROP TABLE omnivore.folder_policy;
DROP TYPE folder_action;
DROP PROCEDURE omnivore.expire_folders();
COMMIT;