From 5be7daf72ad4bd7cb29d20b434688997a231756e Mon Sep 17 00:00:00 2001
From: dullbananas <dull.bananas0@gmail.com>
Date: Thu, 13 Jun 2024 14:34:09 -0700
Subject: [PATCH] Update triggers.sql

---
 .../db_schema/replaceable_schema/triggers.sql | 85 ++++++++++++++++++-
 1 file changed, 83 insertions(+), 2 deletions(-)

diff --git a/crates/db_schema/replaceable_schema/triggers.sql b/crates/db_schema/replaceable_schema/triggers.sql
index 11b630398..29e35687e 100644
--- a/crates/db_schema/replaceable_schema/triggers.sql
+++ b/crates/db_schema/replaceable_schema/triggers.sql
@@ -564,8 +564,10 @@ BEGIN
     IF NOT (NEW.path ~ ('*.' || id)::lquery) THEN
         NEW.path = NEW.path || id;
     END IF;
-    -- Set `ap_id`
-    NEW.ap_id = coalesce(NEW.ap_id, r.local_url('/comment/' || id));
+    -- Set local apub URLs
+    IF NEW.local THEN
+        NEW.ap_id = coalesce(NEW.ap_id, r.local_url('/comment/' || id));
+    END IF;
     RETURN NEW;
 END
 $$;
@@ -575,3 +577,82 @@ CREATE TRIGGER change_values
     FOR EACH ROW
     EXECUTE FUNCTION r.comment_change_values ();
 
+CREATE FUNCTION r.community_change_values ()
+    RETURNS TRIGGER
+    LANGUAGE plpgsql
+    AS $$
+BEGIN
+    -- Set local apub URLs
+    IF NEW.local THEN
+        NEW.actor_id = coalesce(NEW.actor_id, r.local_url('/c/' || NEW.id::text));
+        NEW.followers_url = coalesce(NEW.followers_url, NEW.actor_id || '/followers');
+        NEW.inbox_url = coalesce(NEW.inbox_url, NEW.actor_id || '/inbox');
+        NEW.moderators_url = coalesce(NEW.moderators_url, NEW.actor_id || '/moderators');
+        NEW.featured_url = coalesce(NEW.featured_url, NEW.actor_id || '/featured');
+        NEW.shared_inbox_url = coalesce(NEW.shared_inbox_url, r.local_url('/inbox');
+    END IF;
+    RETURN NEW;
+END
+$$;
+
+CREATE TRIGGER change_values
+    BEFORE INSERT OR UPDATE ON community
+    FOR EACH ROW
+    EXECUTE FUNCTION r.community_change_values ();
+
+CREATE FUNCTION r.person_change_values ()
+    RETURNS TRIGGER
+    LANGUAGE plpgsql
+    AS $$
+BEGIN
+    -- Set local apub URLs
+    IF NEW.local THEN
+        NEW.actor_id = coalesce(NEW.actor_id, r.local_url('/u/' || NEW.id::text));
+        NEW.inbox_url = coalesce(NEW.inbox_url, NEW.actor_id || '/inbox');
+        NEW.shared_inbox_url = coalesce(NEW.shared_inbox_url, r.local_url('/inbox');
+    END IF;
+    RETURN NEW;
+END
+$$;
+
+CREATE TRIGGER change_values
+    BEFORE INSERT OR UPDATE ON person
+    FOR EACH ROW
+    EXECUTE FUNCTION r.person_change_values ();
+
+CREATE FUNCTION r.post_change_values ()
+    RETURNS TRIGGER
+    LANGUAGE plpgsql
+    AS $$
+BEGIN
+    -- Set local apub URLs
+    IF NEW.local THEN
+        NEW.ap_id = coalesce(NEW.ap_id, r.local_url('/post/' || NEW.id::text));
+    END IF;
+    RETURN NEW;
+END
+$$;
+
+CREATE TRIGGER change_values
+    BEFORE INSERT OR UPDATE ON post
+    FOR EACH ROW
+    EXECUTE FUNCTION r.post_change_values ();
+
+CREATE FUNCTION r.private_message_change_values ()
+    RETURNS TRIGGER
+    LANGUAGE plpgsql
+    AS $$
+BEGIN
+    -- Set local apub URLs
+    IF NEW.local THEN
+        NEW.ap_id = coalesce(NEW.ap_id, r.local_url('/private_message/' || NEW.id::text));
+    END IF;
+    RETURN NEW;
+END
+$$;
+
+CREATE TRIGGER change_values
+    BEFORE INSERT OR UPDATE ON private_message
+    FOR EACH ROW
+    EXECUTE FUNCTION r.private_message_change_values ();
+