-- Try to get user_id from NEW record (common column names)
IFNEW.creator_idISNOTNULLTHEN
v_user_id:=NEW.creator_id;
ELSIFNEW.user_idISNOTNULLTHEN
v_user_id:=NEW.user_id;
ELSE
v_user_id:=NULL;
ENDIF;
ELSIFTG_OP='UPDATE'THEN
v_action:='update';
v_old_data:=to_jsonb(OLD);
v_new_data:=to_jsonb(NEW);
-- Try to get user_id from NEW record
IFNEW.creator_idISNOTNULLTHEN
v_user_id:=NEW.creator_id;
ELSIFNEW.user_idISNOTNULLTHEN
v_user_id:=NEW.user_id;
ELSE
v_user_id:=NULL;
ENDIF;
ELSIFTG_OP='DELETE'THEN
v_action:='delete';
v_old_data:=to_jsonb(OLD);
v_new_data:=NULL;
-- Try to get user_id from OLD record
IFOLD.creator_idISNOTNULLTHEN
v_user_id:=OLD.creator_id;
ELSIFOLD.user_idISNOTNULLTHEN
v_user_id:=OLD.user_id;
ELSE
v_user_id:=NULL;
ENDIF;
ENDIF;
-- Insert audit log entry
INSERTINTOpublic.audit_logs(
id,
user_id,
action,
resource,
resource_id,
metadata,
timestamp
)VALUES(
gen_random_uuid(),
v_user_id,
v_action,
TG_TABLE_NAME,
CASE
WHENTG_OP='DELETE'THEN(OLD.id)::UUID
ELSE(NEW.id)::UUID
END,
jsonb_build_object(
'operation',TG_OP,
'old_data',v_old_data,
'new_data',v_new_data,
'table',TG_TABLE_NAME
),
NOW()
);
-- Return appropriate record
IFTG_OP='DELETE'THEN
RETURNOLD;
ELSE
RETURNNEW;
ENDIF;
END;
$$LANGUAGEplpgsql;
COMMENTONFUNCTIONpublic.audit_trigger_function()IS'Generic audit trigger function that logs INSERT, UPDATE, and DELETE operations to audit_logs table';
COMMENTONTRIGGERaudit_playlist_tracks_triggerONpublic.playlist_tracksIS'Audit trigger for playlist_tracks table - logs all create, update, and delete operations';
COMMENTONTRIGGERaudit_track_comments_triggerONpublic.track_commentsIS'Audit trigger for track_comments table - logs all create, update, and delete operations';
-- === TRIGGERS FOR MARKETPLACE_PRODUCTS TABLE ===
COMMENTONTRIGGERaudit_marketplace_products_triggerONpublic.marketplace_productsIS'Audit trigger for marketplace_products table - logs all create, update, and delete operations';
COMMENTONTRIGGERaudit_marketplace_orders_triggerONpublic.marketplace_ordersIS'Audit trigger for marketplace_orders table - logs all create, update, and delete operations';
COMMENTONTRIGGERaudit_playlist_collaborators_triggerONpublic.playlist_collaboratorsIS'Audit trigger for playlist_collaborators table - logs all create, update, and delete operations';
-- Note: Triggers are set to AFTER to ensure data integrity and allow access to both OLD and NEW records
-- The function captures the full state of records (old and new) in JSONB format for detailed audit trails