Files
MineGeo/supabase/migrations/20261017073500_map_community_features.sql
pavel444-byte e1a6ab5730
Some checks failed
Deploy MineGeo to Dokploy / deploy (push) Failing after 3m22s
Add map community reactions, comments, and moderation
2026-10-17 12:45:18 +05:00

67 lines
3.8 KiB
PL/PgSQL

-- All access goes through authenticated server routes using the service client.
create table public.map_reactions (
dataset_id uuid not null references public.datasets(id) on delete cascade,
user_id uuid not null references public.profiles(id) on delete cascade,
value smallint not null check (value in (-1, 1)),
created_at timestamptz not null default now(),
primary key (dataset_id, user_id)
);
create index map_reactions_user on public.map_reactions(user_id);
create index map_reactions_totals on public.map_reactions(dataset_id, value);
create table public.map_comments (
id uuid primary key default gen_random_uuid(),
dataset_id uuid not null references public.datasets(id) on delete cascade,
author_id uuid references public.profiles(id) on delete set null,
body text not null check (body = btrim(body) and char_length(body) between 1 and 2000),
created_at timestamptz not null default now(),
removed_at timestamptz,
removed_by uuid references public.profiles(id) on delete set null
);
create index map_comments_dataset_created on public.map_comments(dataset_id, created_at desc, id desc);
create index map_comments_author on public.map_comments(author_id);
create index map_comments_removed_by on public.map_comments(removed_by);
create table public.community_reports (
id uuid primary key default gen_random_uuid(),
reporter_id uuid references public.profiles(id) on delete set null,
target text not null check (target in ('comment', 'account')),
comment_id uuid references public.map_comments(id) on delete cascade,
account_id uuid references public.profiles(id) on delete cascade,
category text not null check (category in ('spam', 'advertising', 'inappropriate', 'harassment', 'other')),
reason text not null check (reason = btrim(reason) and char_length(reason) between 10 and 2000),
state text not null default 'open' check (state in ('open', 'resolved', 'dismissed')),
reviewer_id uuid references public.profiles(id) on delete set null,
reviewed_at timestamptz,
review_reason text check (char_length(review_reason) <= 2000),
created_at timestamptz not null default now(),
constraint community_reports_target_link check (
(target = 'comment' and comment_id is not null and account_id is null)
or (target = 'account' and account_id is not null and comment_id is null)
)
);
create unique index community_reports_open_comment on public.community_reports(reporter_id, comment_id)
where state = 'open' and target = 'comment';
create unique index community_reports_open_account on public.community_reports(reporter_id, account_id)
where state = 'open' and target = 'account';
create index community_reports_queue on public.community_reports(state, created_at desc);
create index community_reports_reporter on public.community_reports(reporter_id);
create index community_reports_comment on public.community_reports(comment_id);
create index community_reports_account on public.community_reports(account_id);
create index community_reports_reviewer on public.community_reports(reviewer_id);
alter table public.map_reactions enable row level security;
alter table public.map_comments enable row level security;
alter table public.community_reports enable row level security;
revoke all on public.map_reactions, public.map_comments, public.community_reports from public, anon, authenticated;
grant all on public.map_reactions, public.map_comments, public.community_reports to service_role;
create function public.map_reaction_summary(p_dataset uuid)
returns table (likes bigint, dislikes bigint)
language sql stable security invoker set search_path = '' as $$
select count(*) filter (where value = 1), count(*) filter (where value = -1)
from public.map_reactions where dataset_id = p_dataset;
$$;
revoke all on function public.map_reaction_summary(uuid) from public, anon, authenticated;
grant execute on function public.map_reaction_summary(uuid) to service_role;