-- Migration date: 2026-06-13 -- Workflows overview read model. -- Returns owned and shared workflows in one database call. create or replace function public.get_workflows_overview( p_user_id text, p_user_email text default null, p_type text default null ) returns table ( id uuid, user_id text, title text, type text, prompt_md text, columns_config jsonb, practice text, is_system boolean, created_at timestamptz, allow_edit boolean, is_owner boolean, shared_by_name text ) language sql stable as $$ with owned as ( select w.*, true as allow_edit, true as is_owner, null::text as shared_by_name, 0 as sort_bucket from public.workflows w where w.user_id = p_user_id and w.is_system = false and (p_type is null or w.type = p_type) ), shared as ( select w.*, ws.allow_edit, false as is_owner, nullif(trim(up.display_name), '') as shared_by_name, 1 as sort_bucket from public.workflow_shares ws join public.workflows w on w.id = ws.workflow_id left join public.user_profiles up on up.user_id::text = ws.shared_by_user_id where lower(ws.shared_with_email) = lower(coalesce(p_user_email, '')) and (p_type is null or w.type = p_type) ), visible_workflows as ( select * from owned union all select * from shared ) select vw.id, vw.user_id, vw.title, vw.type, vw.prompt_md, vw.columns_config, vw.practice, vw.is_system, vw.created_at, vw.allow_edit, vw.is_owner, vw.shared_by_name from visible_workflows vw order by vw.sort_bucket asc, vw.created_at desc; $$;