2024-09-11 12:14:10 +02:00
|
|
|
-- migrate:up
|
|
|
|
|
CREATE EXTENSION hstore;
|
|
|
|
|
|
|
|
|
|
CREATE TABLE internal.change_log (
|
|
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid (),
|
|
|
|
|
website_id UUID REFERENCES internal.website (id) ON DELETE CASCADE,
|
2024-09-14 15:12:08 +02:00
|
|
|
user_id UUID REFERENCES internal.user (id) ON DELETE SET NULL DEFAULT (CURRENT_SETTING('request.jwt.claims', TRUE)::JSON ->> 'user_id') ::UUID,
|
|
|
|
|
username VARCHAR(16) NOT NULL DEFAULT (CURRENT_SETTING('request.jwt.claims', TRUE)::JSON ->> 'username'),
|
2024-09-11 12:14:10 +02:00
|
|
|
tstamp TIMESTAMPTZ NOT NULL DEFAULT CLOCK_TIMESTAMP(),
|
|
|
|
|
table_name TEXT NOT NULL,
|
|
|
|
|
operation TEXT NOT NULL,
|
|
|
|
|
old_value HSTORE,
|
|
|
|
|
new_value HSTORE
|
|
|
|
|
);
|
|
|
|
|
|
2024-10-04 17:09:51 +02:00
|
|
|
CREATE VIEW api.change_log WITH ( security_invoker = ON
|
|
|
|
|
) AS
|
|
|
|
|
SELECT
|
|
|
|
|
*
|
|
|
|
|
FROM
|
|
|
|
|
internal.change_log;
|
|
|
|
|
|
|
|
|
|
GRANT SELECT ON internal.change_log TO authenticated_user;
|
|
|
|
|
|
|
|
|
|
GRANT SELECT ON api.change_log TO authenticated_user;
|
|
|
|
|
|
|
|
|
|
ALTER TABLE internal.change_log ENABLE ROW LEVEL SECURITY;
|
|
|
|
|
|
|
|
|
|
CREATE POLICY view_change_log ON internal.change_log
|
|
|
|
|
FOR SELECT
|
|
|
|
|
USING (internal.user_has_website_access (website_id, 10));
|
|
|
|
|
|
2024-09-11 12:14:10 +02:00
|
|
|
CREATE FUNCTION internal.track_changes ()
|
|
|
|
|
RETURNS TRIGGER
|
|
|
|
|
AS $$
|
|
|
|
|
DECLARE
|
|
|
|
|
_website_id UUID;
|
2024-09-14 15:12:08 +02:00
|
|
|
_user_id UUID := (CURRENT_SETTING('request.jwt.claims', TRUE)::JSON ->> 'user_id')::UUID;
|
2024-09-11 12:14:10 +02:00
|
|
|
BEGIN
|
2024-09-14 15:12:08 +02:00
|
|
|
IF (NOT EXISTS (
|
|
|
|
|
SELECT
|
2024-10-03 18:51:30 +02:00
|
|
|
u.id
|
2024-09-14 15:12:08 +02:00
|
|
|
FROM
|
2024-10-03 18:51:30 +02:00
|
|
|
internal.user AS u
|
2024-09-14 15:12:08 +02:00
|
|
|
WHERE
|
2024-10-03 18:51:30 +02:00
|
|
|
u.id = _user_id) OR (to_jsonb (OLD.*) - 'last_modified_at' - 'last_modified_by') = (to_jsonb (NEW.*) - 'last_modified_at' - 'last_modified_by')) THEN
|
2024-09-14 15:12:08 +02:00
|
|
|
RETURN NULL;
|
2024-09-13 18:00:50 +02:00
|
|
|
END IF;
|
2024-09-11 12:14:10 +02:00
|
|
|
IF TG_TABLE_NAME = 'website' THEN
|
|
|
|
|
_website_id := NEW.id;
|
|
|
|
|
ELSE
|
2024-09-12 18:06:59 +02:00
|
|
|
_website_id := COALESCE(NEW.website_id, OLD.website_id);
|
2024-09-11 12:14:10 +02:00
|
|
|
END IF;
|
|
|
|
|
IF TG_OP = 'INSERT' THEN
|
|
|
|
|
INSERT INTO internal.change_log (website_id, table_name, operation, new_value)
|
|
|
|
|
VALUES (_website_id, TG_TABLE_NAME, TG_OP, HSTORE (NEW));
|
2024-09-14 15:12:08 +02:00
|
|
|
ELSIF (TG_OP = 'UPDATE'
|
2024-09-12 21:22:26 +02:00
|
|
|
AND EXISTS (
|
|
|
|
|
SELECT
|
2024-10-03 18:51:30 +02:00
|
|
|
w.id
|
2024-09-12 21:22:26 +02:00
|
|
|
FROM
|
2024-10-03 18:51:30 +02:00
|
|
|
internal.website AS w
|
2024-09-12 21:22:26 +02:00
|
|
|
WHERE
|
2024-10-03 18:51:30 +02:00
|
|
|
w.id = _website_id)) THEN
|
2024-09-14 15:12:08 +02:00
|
|
|
INSERT INTO internal.change_log (website_id, table_name, operation, old_value, new_value)
|
|
|
|
|
VALUES (_website_id, TG_TABLE_NAME, TG_OP, HSTORE (OLD) - HSTORE (NEW), HSTORE (NEW) - HSTORE (OLD));
|
|
|
|
|
ELSIF (TG_OP = 'DELETE'
|
2024-09-12 21:22:26 +02:00
|
|
|
AND EXISTS (
|
|
|
|
|
SELECT
|
2024-10-03 18:51:30 +02:00
|
|
|
w.id
|
2024-09-12 21:22:26 +02:00
|
|
|
FROM
|
2024-10-03 18:51:30 +02:00
|
|
|
internal.website AS w
|
2024-09-12 21:22:26 +02:00
|
|
|
WHERE
|
2024-10-03 18:51:30 +02:00
|
|
|
w.id = _website_id)) THEN
|
2024-09-14 15:12:08 +02:00
|
|
|
INSERT INTO internal.change_log (website_id, table_name, operation, old_value)
|
|
|
|
|
VALUES (_website_id, TG_TABLE_NAME, TG_OP, HSTORE (OLD));
|
2024-09-11 12:14:10 +02:00
|
|
|
END IF;
|
2024-09-14 15:12:08 +02:00
|
|
|
RETURN NULL;
|
2024-09-11 12:14:10 +02:00
|
|
|
END;
|
|
|
|
|
$$
|
|
|
|
|
LANGUAGE plpgsql
|
|
|
|
|
SECURITY DEFINER;
|
|
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
CREATE TRIGGER track_changes_website
|
2024-09-12 18:06:59 +02:00
|
|
|
AFTER UPDATE ON internal.website
|
2024-09-11 12:14:10 +02:00
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION internal.track_changes ();
|
|
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
CREATE TRIGGER track_changes_settings
|
2024-09-11 12:14:10 +02:00
|
|
|
AFTER UPDATE ON internal.settings
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION internal.track_changes ();
|
|
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
CREATE TRIGGER track_changes_header
|
2024-09-11 12:14:10 +02:00
|
|
|
AFTER UPDATE ON internal.header
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION internal.track_changes ();
|
|
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
CREATE TRIGGER track_changes_home
|
2024-09-11 12:14:10 +02:00
|
|
|
AFTER UPDATE ON internal.home
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION internal.track_changes ();
|
|
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
CREATE TRIGGER track_changes_article
|
2024-09-11 12:14:10 +02:00
|
|
|
AFTER INSERT OR UPDATE OR DELETE ON internal.article
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION internal.track_changes ();
|
|
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
CREATE TRIGGER track_changes_docs_category
|
2024-09-11 12:14:10 +02:00
|
|
|
AFTER INSERT OR UPDATE OR DELETE ON internal.docs_category
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION internal.track_changes ();
|
|
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
CREATE TRIGGER track_changes_footer
|
2024-09-11 12:14:10 +02:00
|
|
|
AFTER UPDATE ON internal.footer
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION internal.track_changes ();
|
|
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
CREATE TRIGGER track_changes_legal_information
|
2024-09-12 18:06:59 +02:00
|
|
|
AFTER INSERT OR UPDATE OR DELETE ON internal.legal_information
|
2024-09-11 12:14:10 +02:00
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION internal.track_changes ();
|
|
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
CREATE TRIGGER track_changes_collab
|
2024-09-11 12:14:10 +02:00
|
|
|
AFTER INSERT OR UPDATE OR DELETE ON internal.collab
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION internal.track_changes ();
|
|
|
|
|
|
|
|
|
|
-- migrate:down
|
2024-10-08 21:20:44 +02:00
|
|
|
DROP TRIGGER track_changes_website ON internal.website;
|
2024-09-11 12:14:10 +02:00
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
DROP TRIGGER track_changes_settings ON internal.settings;
|
2024-09-11 12:14:10 +02:00
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
DROP TRIGGER track_changes_header ON internal.header;
|
2024-09-11 12:14:10 +02:00
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
DROP TRIGGER track_changes_home ON internal.home;
|
2024-09-11 12:14:10 +02:00
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
DROP TRIGGER track_changes_article ON internal.article;
|
2024-09-11 12:14:10 +02:00
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
DROP TRIGGER track_changes_docs_category ON internal.docs_category;
|
2024-09-11 12:14:10 +02:00
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
DROP TRIGGER track_changes_footer ON internal.footer;
|
2024-09-11 12:14:10 +02:00
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
DROP TRIGGER track_changes_legal_information ON internal.legal_information;
|
2024-09-11 12:14:10 +02:00
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
DROP TRIGGER track_changes_collab ON internal.collab;
|
2024-09-11 12:14:10 +02:00
|
|
|
|
2024-10-08 21:20:44 +02:00
|
|
|
DROP FUNCTION internal.track_changes;
|
2024-09-11 12:14:10 +02:00
|
|
|
|
|
|
|
|
DROP VIEW api.change_log;
|
|
|
|
|
|
|
|
|
|
DROP TABLE internal.change_log;
|
|
|
|
|
|
|
|
|
|
DROP EXTENSION hstore;
|
|
|
|
|
|