-- Switch catalog table ids from uuid to text. -- -- The app's built-in library (domain/library.ts) has always used stable, -- human-readable string ids ('pt-hdmi', 'dt-display', 'ct-xlr', ...), and -- existing diagrams (including everything created locally so far) reference -- port/cable/category/device types by exactly those ids. Seeding the public -- catalog with fresh uuids instead would silently orphan every one of those -- references. Tables are empty at this point (catalog data hasn't been -- seeded yet), so this is a pure schema change, not a data migration. -- -- manufacturers and device_template_ports keep uuid ids — nothing -- referenced manufacturers before now (it's a brand new table), and a -- template's ports were never independently referenced by id (placing a -- device already copies ports with a fresh id, discarding the template -- port's original id — see createDeviceFromTemplate). -- Drop FKs that depend on the columns we're about to retype. alter table public.device_template_ports drop constraint device_template_ports_device_template_id_fkey; alter table public.device_template_ports drop constraint device_template_ports_port_type_id_fkey; alter table public.device_templates drop constraint device_templates_category_id_fkey; -- device_template_ports' policies join back to device_templates.id, which -- Postgres treats as a dependency that blocks ALTER TYPE on that column — -- drop them here, recreate (verbatim) at the end. drop policy "device_template_ports_select" on public.device_template_ports; drop policy "device_template_ports_insert" on public.device_template_ports; drop policy "device_template_ports_update" on public.device_template_ports; drop policy "device_template_ports_delete" on public.device_template_ports; -- Retype the catalog primary keys. alter table public.device_categories alter column id drop default; alter table public.device_categories alter column id type text; alter table public.port_types alter column id drop default; alter table public.port_types alter column id type text; alter table public.cable_types alter column id drop default; alter table public.cable_types alter column id type text; alter table public.device_templates alter column id drop default; alter table public.device_templates alter column id type text; -- Retype the columns that reference them. alter table public.device_templates alter column category_id type text; alter table public.device_template_ports alter column device_template_id type text; alter table public.device_template_ports alter column port_type_id type text; -- catalog_submissions.entity_id is polymorphic (device_template/port_type/ -- cable_type/device_category all now text ids; manufacturer stays uuid, but -- a uuid string is still valid text) — no FK constraint on it to begin with. alter table public.catalog_submissions alter column entity_id type text; -- Recreate the FKs. alter table public.device_templates add constraint device_templates_category_id_fkey foreign key (category_id) references public.device_categories (id); alter table public.device_template_ports add constraint device_template_ports_device_template_id_fkey foreign key (device_template_id) references public.device_templates (id) on delete cascade; alter table public.device_template_ports add constraint device_template_ports_port_type_id_fkey foreign key (port_type_id) references public.port_types (id); -- Recreate the four policies dropped above, verbatim. create policy "device_template_ports_select" on public.device_template_ports for select using ( exists ( select 1 from public.device_templates dt where dt.id = device_template_id and (dt.is_public or dt.owner_id = auth.uid() or public.is_admin()) ) ); create policy "device_template_ports_insert" on public.device_template_ports for insert with check ( exists ( select 1 from public.device_templates dt where dt.id = device_template_id and ((dt.owner_id = auth.uid() and not dt.is_public) or public.is_admin()) ) ); create policy "device_template_ports_update" on public.device_template_ports for update using ( exists ( select 1 from public.device_templates dt where dt.id = device_template_id and ((dt.owner_id = auth.uid() and not dt.is_public) or public.is_admin()) ) ); create policy "device_template_ports_delete" on public.device_template_ports for delete using ( exists ( select 1 from public.device_templates dt where dt.id = device_template_id and ((dt.owner_id = auth.uid() and not dt.is_public) or public.is_admin()) ) );