Synced from docs/generated/erd/ — do not hand-edit.
Regenerate with bun run docs:erd (needs staging reader), then this script runs automatically.
Labels: docs/db/erd-table-labels.yml · Runbook: docs/runbooks/erd-schema-docs.md
One direction’s scope of an org_partnerships row (channels, object types, caps) — asymmetric, at most one row per (partnership, granting org) — Not: org_partnerships itself; a grant never implies the reverse direction is also scoped
| Name |
Type |
Default |
Nullable |
Children |
Parents |
Comment |
| audience_rights |
jsonb |
‘{}’::jsonb |
false |
|
|
|
| channels |
text[] |
‘{}’::text[] |
false |
|
|
|
| created_at |
timestamp with time zone |
now() |
false |
|
|
|
| created_by_user_id |
uuid |
|
false |
|
|
|
| frequency_cap_count |
integer |
|
true |
|
|
|
| frequency_cap_period |
text |
|
true |
|
|
|
| granting_org_id |
text |
|
false |
|
organizations |
|
| id |
uuid |
gen_random_uuid() |
false |
|
|
|
| may_request_send |
boolean |
false |
false |
|
|
|
| object_types |
text[] |
‘{}’::text[] |
false |
|
|
|
| partnership_id |
uuid |
|
false |
|
public.org_partnerships |
|
| receiving_org_id |
text |
|
false |
|
organizations |
|
| requires_approval |
boolean |
true |
false |
|
|
|
| updated_at |
timestamp with time zone |
now() |
false |
|
|
|
| updated_by_user_id |
uuid |
|
true |
|
|
|
| Name |
Definition |
| Website, Funnels & Public Surface |
Website builder config/pages, funnels, blog, public lead capture, member benefits (hot_deals, job_postings), exchange visibility layer. Catalog §3.5–3.7, §5.1.
|
| Name |
Type |
Definition |
| partnership_grants_cap_count_check |
CHECK |
CHECK (((frequency_cap_count IS NULL) OR (frequency_cap_count > 0))) |
| partnership_grants_cap_pair_check |
CHECK |
CHECK (((frequency_cap_count IS NULL) = (frequency_cap_period IS NULL))) |
| partnership_grants_cap_period_check |
CHECK |
CHECK (((frequency_cap_period IS NULL) OR (frequency_cap_period = ANY (ARRAY[‘day’::text, ‘week’::text, ‘month’::text])))) |
| partnership_grants_created_by_user_id_fkey |
FOREIGN KEY |
FOREIGN KEY (created_by_user_id) REFERENCES auth.users(id) |
| partnership_grants_direction_key |
UNIQUE |
UNIQUE (partnership_id, granting_org_id) |
| partnership_grants_distinct_orgs_check |
CHECK |
CHECK ((granting_org_id <> receiving_org_id)) |
| partnership_grants_granting_org_id_fkey |
FOREIGN KEY |
FOREIGN KEY (granting_org_id) REFERENCES organizations(id) |
| partnership_grants_object_types_check |
CHECK |
CHECK ((object_types <@ ARRAY[‘event’::text, ‘offer’::text, ‘opportunity’::text, ‘program’::text, ‘resource’::text, ‘community’::text])) |
| partnership_grants_partnership_id_fkey |
FOREIGN KEY |
FOREIGN KEY (partnership_id) REFERENCES org_partnerships(id) ON DELETE CASCADE |
| partnership_grants_pkey |
PRIMARY KEY |
PRIMARY KEY (id) |
| partnership_grants_receiving_org_id_fkey |
FOREIGN KEY |
FOREIGN KEY (receiving_org_id) REFERENCES organizations(id) |
| partnership_grants_updated_by_user_id_fkey |
FOREIGN KEY |
FOREIGN KEY (updated_by_user_id) REFERENCES auth.users(id) |
| Name |
Definition |
| idx_partnership_grants_granting |
CREATE INDEX idx_partnership_grants_granting ON public.partnership_grants USING btree (granting_org_id) |
| idx_partnership_grants_partnership |
CREATE INDEX idx_partnership_grants_partnership ON public.partnership_grants USING btree (partnership_id) |
| idx_partnership_grants_receiving |
CREATE INDEX idx_partnership_grants_receiving ON public.partnership_grants USING btree (receiving_org_id) |
| partnership_grants_direction_key |
CREATE UNIQUE INDEX partnership_grants_direction_key ON public.partnership_grants USING btree (partnership_id, granting_org_id) |
| partnership_grants_pkey |
CREATE UNIQUE INDEX partnership_grants_pkey ON public.partnership_grants USING btree (id) |
| Name |
Definition |
| trg_partnership_grant_parties |
CREATE TRIGGER trg_partnership_grant_parties BEFORE INSERT OR UPDATE ON public.partnership_grants FOR EACH ROW EXECUTE FUNCTION guard_partnership_grant_parties() |
| trg_partnership_grants_updated_at |
CREATE TRIGGER trg_partnership_grants_updated_at BEFORE UPDATE ON public.partnership_grants FOR EACH ROW EXECUTE FUNCTION update_updated_at_column() |
erDiagram
"public.partnership_grants" }o--|| "public.organizations" : "FOREIGN KEY (granting_org_id) REFERENCES organizations(id)"
"public.partnership_grants" }o--|| "public.org_partnerships" : "FOREIGN KEY (partnership_id) REFERENCES org_partnerships(id) ON DELETE CASCADE"
"public.partnership_grants" }o--|| "public.organizations" : "FOREIGN KEY (receiving_org_id) REFERENCES organizations(id)"
"public.partnership_grants" {
text granting_org_id FK ""
uuid partnership_id FK ""
text receiving_org_id FK ""
}
"public.organizations" {
text association_id FK ""
uuid default_approval_reviewer_contact_id FK "Org-level fallback reviewer for two-step send (#5698). Routing chain: the sender's own reviewer, then this, then all org admins. NULL means fall through to the admins, which is the pre-#5698 behaviour."
text id ""
text parent_org_id FK "#671 self-referencing hierarchy pointer. NULL = root org. Direct writes are blocked by trg_block_direct_parent_org_id_writes for every role except service_role/postgres/supabase_admin — the only write path for authenticated/interactive callers is public.reparent_organization(). Cycle-prevented by trg_prevent_org_hierarchy_cycle. #quot;Is association#quot; is derived (EXISTS a child), never stored."
}
"public.org_partnerships" {
uuid id ""
text initiated_by_org_id FK ""
text org_a_id FK ""
text org_b_id FK ""
}
Generated by tbls