47 lines
2.2 KiB
PL/PgSQL
47 lines
2.2 KiB
PL/PgSQL
CREATE OR REPLACE FUNCTION index_bookmarked_item() RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
-- if a bookmark was created or updated, `NEW` will be used
|
|
IF NEW IS NOT NULL THEN
|
|
INSERT INTO pgboss.job (name, data) VALUES ('indexItem', jsonb_build_object('id', NEW."itemId"));
|
|
RETURN NEW;
|
|
END IF;
|
|
-- if a bookmark was deleted, `OLD` will be used
|
|
IF OLD IS NOT NULL THEN
|
|
-- include `updatedAt` in the `indexItem` job as `now()` to indicate when the indexed item should think it was updated
|
|
-- this is to facilitate the fact that deleted bookmarks do not show up when re-indexing the item, and therefore
|
|
-- we don't have a reliable way to calculate a more recent index version, to displace the prior version
|
|
INSERT INTO pgboss.job (name, data) VALUES ('indexItem', jsonb_build_object('id', OLD."itemId", 'updatedAt', now()));
|
|
RETURN OLD;
|
|
END IF;
|
|
-- This should never be reached
|
|
RETURN NULL;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Re-index the bookmarked item when a bookmark changes, so new bookmarks are searchable
|
|
DROP TRIGGER IF EXISTS index_bookmarked_item ON "Bookmark";
|
|
CREATE TRIGGER index_bookmarked_item
|
|
AFTER INSERT OR UPDATE OR DELETE ON "Bookmark"
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE index_bookmarked_item();
|
|
|
|
-- hack ... prisma doesn't know about our other schemas (e.g. pgboss)
|
|
-- and this is only really a problem on their "shadow database"
|
|
-- so we catch the exception it throws and ignore it
|
|
CREATE OR REPLACE FUNCTION reindex_all_current_bookmarked_items() RETURNS void AS $$
|
|
BEGIN
|
|
-- Re-index all existing bookmarked items so these bookmarks are searchable
|
|
INSERT INTO pgboss.job (name, data, priority, startafter, expirein)
|
|
SELECT 'indexItem', jsonb_build_object('id', "itemId"), -100, now() + interval '10 minutes', interval '1 day'
|
|
FROM "Bookmark"
|
|
GROUP BY "itemId";
|
|
EXCEPTION WHEN OTHERS THEN
|
|
-- catch the exception for prisma dev execution, but do nothing with it
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- execute the function once
|
|
SELECT reindex_all_current_bookmarked_items();
|
|
-- then drop it since we don't need it anymore
|
|
DROP FUNCTION reindex_all_current_bookmarked_items();
|