feat: actualizar Tablero CDC con administracion de listas
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
-- =============================================================
|
||||
-- TABLERO CDC — Notificación personal de briefs "Nuevos"
|
||||
-- Fecha: 2026-08-12
|
||||
--
|
||||
-- Ejecutar SOLO si ya habías ejecutado una versión anterior de
|
||||
-- supabase_cdc_brief_review_inbox.sql. Si aún no la habías ejecutado,
|
||||
-- usa el archivo completo actualizado y no necesitas este delta.
|
||||
-- =============================================================
|
||||
|
||||
begin;
|
||||
|
||||
create table if not exists public.tablero_cdc_brief_inbox_seen (
|
||||
user_id uuid not null references auth.users(id) on delete cascade,
|
||||
inbox_id uuid not null references public.tablero_cdc_brief_inbox(id) on delete cascade,
|
||||
seen_at timestamptz not null default now(),
|
||||
primary key (user_id, inbox_id)
|
||||
);
|
||||
|
||||
create index if not exists tablero_cdc_brief_inbox_seen_inbox_idx
|
||||
on public.tablero_cdc_brief_inbox_seen (inbox_id);
|
||||
|
||||
alter table public.tablero_cdc_brief_inbox_seen enable row level security;
|
||||
|
||||
drop policy if exists "tablero_cdc_brief_inbox_seen_select_own"
|
||||
on public.tablero_cdc_brief_inbox_seen;
|
||||
|
||||
create policy "tablero_cdc_brief_inbox_seen_select_own"
|
||||
on public.tablero_cdc_brief_inbox_seen
|
||||
for select
|
||||
to authenticated
|
||||
using (
|
||||
user_id = auth.uid()
|
||||
and public.tablero_cdc_is_active_allowed_user()
|
||||
);
|
||||
|
||||
revoke insert, update, delete on public.tablero_cdc_brief_inbox_seen from authenticated;
|
||||
grant select on public.tablero_cdc_brief_inbox_seen to authenticated;
|
||||
grant all on public.tablero_cdc_brief_inbox_seen to service_role;
|
||||
|
||||
create or replace function public.tablero_cdc_get_unseen_brief_count()
|
||||
returns integer
|
||||
language plpgsql
|
||||
stable
|
||||
security definer
|
||||
set search_path = public, auth
|
||||
as $$
|
||||
declare
|
||||
v_count integer;
|
||||
begin
|
||||
if auth.uid() is null or not public.tablero_cdc_is_active_allowed_user() then
|
||||
raise exception 'No tienes permiso para consultar notificaciones de briefs.';
|
||||
end if;
|
||||
|
||||
select count(*)::integer
|
||||
into v_count
|
||||
from public.tablero_cdc_brief_inbox i
|
||||
where i.review_status = 'new'
|
||||
and not exists (
|
||||
select 1
|
||||
from public.tablero_cdc_brief_inbox_seen s
|
||||
where s.user_id = auth.uid()
|
||||
and s.inbox_id = i.id
|
||||
);
|
||||
|
||||
return coalesce(v_count, 0);
|
||||
end;
|
||||
$$;
|
||||
|
||||
revoke all on function public.tablero_cdc_get_unseen_brief_count() from public;
|
||||
grant execute on function public.tablero_cdc_get_unseen_brief_count() to authenticated;
|
||||
|
||||
create or replace function public.tablero_cdc_mark_briefs_seen()
|
||||
returns jsonb
|
||||
language plpgsql
|
||||
security definer
|
||||
set search_path = public, auth
|
||||
as $$
|
||||
declare
|
||||
v_marked integer := 0;
|
||||
v_remaining integer := 0;
|
||||
begin
|
||||
if auth.uid() is null or not public.tablero_cdc_is_active_allowed_user() then
|
||||
raise exception 'No tienes permiso para marcar briefs como vistos.';
|
||||
end if;
|
||||
|
||||
insert into public.tablero_cdc_brief_inbox_seen (user_id, inbox_id, seen_at)
|
||||
select auth.uid(), i.id, now()
|
||||
from public.tablero_cdc_brief_inbox i
|
||||
where i.review_status = 'new'
|
||||
on conflict (user_id, inbox_id) do nothing;
|
||||
|
||||
get diagnostics v_marked = row_count;
|
||||
|
||||
select count(*)::integer
|
||||
into v_remaining
|
||||
from public.tablero_cdc_brief_inbox i
|
||||
where i.review_status = 'new'
|
||||
and not exists (
|
||||
select 1
|
||||
from public.tablero_cdc_brief_inbox_seen s
|
||||
where s.user_id = auth.uid()
|
||||
and s.inbox_id = i.id
|
||||
);
|
||||
|
||||
return jsonb_build_object(
|
||||
'ok', true,
|
||||
'marked_count', v_marked,
|
||||
'unseen_count', coalesce(v_remaining, 0)
|
||||
);
|
||||
end;
|
||||
$$;
|
||||
|
||||
revoke all on function public.tablero_cdc_mark_briefs_seen() from public;
|
||||
grant execute on function public.tablero_cdc_mark_briefs_seen() to authenticated;
|
||||
|
||||
do $$
|
||||
begin
|
||||
if exists (select 1 from pg_publication where pubname = 'supabase_realtime')
|
||||
and not exists (
|
||||
select 1
|
||||
from pg_publication_tables
|
||||
where pubname = 'supabase_realtime'
|
||||
and schemaname = 'public'
|
||||
and tablename = 'tablero_cdc_brief_inbox_seen'
|
||||
) then
|
||||
alter publication supabase_realtime add table public.tablero_cdc_brief_inbox_seen;
|
||||
end if;
|
||||
end $$;
|
||||
|
||||
commit;
|
||||
|
||||
select
|
||||
to_regclass('public.tablero_cdc_brief_inbox_seen') as tabla_estado_visto,
|
||||
to_regprocedure('public.tablero_cdc_get_unseen_brief_count()') as rpc_contador,
|
||||
to_regprocedure('public.tablero_cdc_mark_briefs_seen()') as rpc_marcar_vistos;
|
||||
Reference in New Issue
Block a user