a tool for shared writing and social publishing

add unified function for getting leaflet page data

+100
+100
supabase/migrations/20260325000000_add_get_leaflet_page_data.sql
··· 1 + CREATE OR REPLACE FUNCTION public.get_leaflet_page_data(p_token_id uuid) 2 + RETURNS TABLE ( 3 + permission_token json, 4 + permission_token_rights json, 5 + leaflets_in_publications json, 6 + leaflets_to_documents json, 7 + custom_domain_routes json, 8 + facts json 9 + ) 10 + LANGUAGE sql STABLE 11 + AS $$ 12 + WITH token AS ( 13 + SELECT pt.* 14 + FROM permission_tokens pt 15 + WHERE pt.id = p_token_id 16 + ), 17 + token_rights AS ( 18 + SELECT json_agg(row_to_json(ptr)) AS rights, array_agg(ptr.entity_set) AS entity_sets 19 + FROM permission_token_rights ptr 20 + WHERE ptr.token = p_token_id 21 + ), 22 + related_tokens AS ( 23 + SELECT array_agg(pt2.id) AS ids 24 + FROM permission_token_rights ptr2 25 + JOIN permission_tokens pt2 ON pt2.id = ptr2.token 26 + WHERE ptr2.entity_set IN (SELECT unnest(entity_sets) FROM token_rights) 27 + AND pt2.id != p_token_id 28 + ), 29 + lip_direct AS ( 30 + SELECT json_agg(row_to_json(sub)) AS data 31 + FROM ( 32 + SELECT lip.*, 33 + row_to_json(pub) AS publications, 34 + row_to_json(d) AS documents 35 + FROM leaflets_in_publications lip 36 + LEFT JOIN publications pub ON pub.uri = lip.publication 37 + LEFT JOIN documents d ON d.uri = lip.doc 38 + WHERE lip.leaflet = p_token_id 39 + ) sub 40 + ), 41 + lip_fallback AS ( 42 + SELECT json_agg(row_to_json(sub)) AS data 43 + FROM ( 44 + SELECT lip.*, 45 + row_to_json(pub) AS publications, 46 + row_to_json(d) AS documents 47 + FROM leaflets_in_publications lip 48 + LEFT JOIN publications pub ON pub.uri = lip.publication 49 + LEFT JOIN documents d ON d.uri = lip.doc 50 + WHERE lip.leaflet IN (SELECT unnest(ids) FROM related_tokens) 51 + ) sub 52 + ), 53 + ltd_direct AS ( 54 + SELECT json_agg(row_to_json(sub)) AS data 55 + FROM ( 56 + SELECT ltd.*, 57 + row_to_json(doc) AS documents 58 + FROM leaflets_to_documents ltd 59 + LEFT JOIN documents doc ON doc.uri = ltd.document 60 + WHERE ltd.leaflet = p_token_id 61 + ) sub 62 + ), 63 + ltd_fallback AS ( 64 + SELECT json_agg(row_to_json(sub)) AS data 65 + FROM ( 66 + SELECT ltd.*, 67 + row_to_json(doc) AS documents 68 + FROM leaflets_to_documents ltd 69 + LEFT JOIN documents doc ON doc.uri = ltd.document 70 + WHERE ltd.leaflet IN (SELECT unnest(ids) FROM related_tokens) 71 + ) sub 72 + ), 73 + cdr AS ( 74 + SELECT json_agg(row_to_json(c)) AS data 75 + FROM custom_domain_routes c 76 + WHERE c.edit_permission_token = p_token_id 77 + ), 78 + facts AS ( 79 + SELECT json_agg(row_to_json(f)) AS data 80 + FROM get_facts((SELECT root_entity FROM token)) f 81 + ) 82 + SELECT 83 + row_to_json(token) AS permission_token, 84 + (SELECT rights FROM token_rights) AS permission_token_rights, 85 + COALESCE((SELECT data FROM lip_direct), (SELECT data FROM lip_fallback)) AS leaflets_in_publications, 86 + COALESCE((SELECT data FROM ltd_direct), (SELECT data FROM ltd_fallback)) AS leaflets_to_documents, 87 + (SELECT data FROM cdr) AS custom_domain_routes, 88 + (SELECT data FROM facts) AS facts 89 + FROM token; 90 + $$; 91 + 92 + -- Indexes for get_leaflet_page_data query patterns 93 + CREATE INDEX IF NOT EXISTS leaflets_in_publications_leaflet_idx 94 + ON public.leaflets_in_publications(leaflet); 95 + 96 + CREATE INDEX IF NOT EXISTS permission_token_rights_entity_set_idx 97 + ON public.permission_token_rights(entity_set); 98 + 99 + CREATE INDEX IF NOT EXISTS custom_domain_routes_edit_permission_token_idx 100 + ON public.custom_domain_routes(edit_permission_token);