| create extension if not exists pgcrypto; |
|
|
| create table if not exists public.distillation_requests ( |
| id uuid primary key default gen_random_uuid (), |
| source_dataset text not null, |
| student_model text not null, |
| submitter_name text null, |
| additional_notes text not null default '', |
| upvotes integer not null default 0, |
| voted_ips text [] not null default '{}', |
| owner_id text not null, |
| created_at timestamptz not null default now(), |
| status text not null default 'pending' |
| ); |
|
|
| create table if not exists public.dataset_requests ( |
| id uuid primary key default gen_random_uuid (), |
| source_model text not null, |
| submitter_name text null, |
| dataset_size text not null default '250x', |
| reasoning_depth text not null default 'high', |
| topics text [] not null default '{}', |
| additional_notes text not null default '', |
| upvotes integer not null default 0, |
| voted_ips text [] not null default '{}', |
| owner_id text not null, |
| created_at timestamptz not null default now(), |
| status text not null default 'pending' |
| ); |
|
|
| alter table public.distillation_requests |
| add column if not exists submitter_name text; |
|
|
| alter table public.dataset_requests |
| add column if not exists submitter_name text; |
|
|
| create table if not exists public.request_comments ( |
| id uuid primary key default gen_random_uuid (), |
| request_type text not null check ( |
| request_type in ('distillation', 'dataset') |
| ), |
| request_id uuid not null, |
| body text not null, |
| author text not null, |
| role text not null check (role in ('admin', 'user')), |
| owner_id text not null, |
| created_at timestamptz not null default now(), |
| edited_at timestamptz null |
| ); |
|
|
| create index if not exists idx_request_comments_request on public.request_comments (request_type, request_id); |
|
|
| create index if not exists idx_request_comments_created_at on public.request_comments (created_at); |
|
|
| create or replace function public.toggle_upvote_distillation(request_id uuid, voter_ip text) |
| returns table(success boolean, upvotes integer, action text) |
| language plpgsql |
| security definer |
| as $$ |
| declare |
| current_ips text[]; |
| current_upvotes integer; |
| begin |
| select r.voted_ips, r.upvotes |
| into current_ips, current_upvotes |
| from public.distillation_requests r |
| where r.id = request_id |
| for update; |
|
|
| if not found then |
| success := false; |
| upvotes := 0; |
| action := null; |
| return next; |
| return; |
| end if; |
|
|
| if voter_ip = any(current_ips) then |
| update public.distillation_requests as r |
| set |
| voted_ips = array_remove(r.voted_ips, voter_ip), |
| upvotes = greatest(r.upvotes - 1, 0) |
| where r.id = request_id |
| returning r.upvotes into upvotes; |
|
|
| success := true; |
| action := 'unvoted'; |
| return next; |
| return; |
| end if; |
|
|
| update public.distillation_requests as r |
| set |
| voted_ips = array_append(r.voted_ips, voter_ip), |
| upvotes = r.upvotes + 1 |
| where r.id = request_id |
| returning r.upvotes into upvotes; |
|
|
| success := true; |
| action := 'upvoted'; |
| return next; |
| end; |
| $$; |
|
|
| create or replace function public.toggle_upvote_dataset(request_id uuid, voter_ip text) |
| returns table(success boolean, upvotes integer, action text) |
| language plpgsql |
| security definer |
| as $$ |
| declare |
| current_ips text[]; |
| current_upvotes integer; |
| begin |
| select r.voted_ips, r.upvotes |
| into current_ips, current_upvotes |
| from public.dataset_requests r |
| where r.id = request_id |
| for update; |
|
|
| if not found then |
| success := false; |
| upvotes := 0; |
| action := null; |
| return next; |
| return; |
| end if; |
|
|
| if voter_ip = any(current_ips) then |
| update public.dataset_requests as r |
| set |
| voted_ips = array_remove(r.voted_ips, voter_ip), |
| upvotes = greatest(r.upvotes - 1, 0) |
| where r.id = request_id |
| returning r.upvotes into upvotes; |
|
|
| success := true; |
| action := 'unvoted'; |
| return next; |
| return; |
| end if; |
|
|
| update public.dataset_requests as r |
| set |
| voted_ips = array_append(r.voted_ips, voter_ip), |
| upvotes = r.upvotes + 1 |
| where r.id = request_id |
| returning r.upvotes into upvotes; |
|
|
| success := true; |
| action := 'upvoted'; |
| return next; |
| end; |
| $$; |
|
|
| alter table public.distillation_requests enable row level security; |
|
|
| alter table public.dataset_requests enable row level security; |
|
|
| alter table public.request_comments enable row level security; |
|
|
| drop policy if exists public_select on public.distillation_requests; |
|
|
| drop policy if exists public_insert on public.distillation_requests; |
|
|
| drop policy if exists public_update on public.distillation_requests; |
|
|
| drop policy if exists public_delete on public.distillation_requests; |
|
|
| drop policy if exists public_select on public.dataset_requests; |
|
|
| drop policy if exists public_insert on public.dataset_requests; |
|
|
| drop policy if exists public_update on public.dataset_requests; |
|
|
| drop policy if exists public_delete on public.dataset_requests; |
|
|
| drop policy if exists public_select on public.request_comments; |
|
|
| drop policy if exists public_insert on public.request_comments; |
|
|
| drop policy if exists public_update on public.request_comments; |
|
|
| drop policy if exists public_delete on public.request_comments; |
|
|
| create policy public_select on public.distillation_requests for |
| select using (true); |
|
|
| create policy public_insert on public.distillation_requests for insert |
| with |
| check (true); |
|
|
| create policy public_select on public.dataset_requests for |
| select using (true); |
|
|
| create policy public_insert on public.dataset_requests for insert |
| with |
| check (true); |
|
|
| create policy public_select on public.request_comments for |
| select using (true); |
|
|
| create policy public_insert on public.request_comments for insert |
| with |
| check (role = 'user'); |
|
|
| grant |
| select, insert on table public.distillation_requests to anon, authenticated; |
|
|
| grant |
| select, insert on table public.dataset_requests to anon, authenticated; |
|
|
| grant |
| select, insert on table public.request_comments to anon, authenticated; |
|
|
| grant |
| execute on function public.toggle_upvote_distillation (uuid, text) to anon, |
| authenticated; |
|
|
| grant |
| execute on function public.toggle_upvote_dataset (uuid, text) to anon, |
| authenticated; |
|
|