supabase: extend initial migration and add first campaigns test

This commit is contained in:
2025-09-26 17:25:01 +02:00
parent f5ec337cf4
commit c829f019f1
2 changed files with 61 additions and 12 deletions

View File

@@ -3,26 +3,56 @@ create table profiles (
user_type text not null check (user_type in ('brand', 'creator', 'admin')) user_type text not null check (user_type in ('brand', 'creator', 'admin'))
); );
alter table profiles enable row level security; alter table profiles enable row level security;
create policy profiles_everyone_select
on profiles for select
to authenticated, anon
using (true);
create policy profiles_user_update
on profiles for update
using ( (select auth.uid()) = user_id );
create table brands ( create table brands (
profile_id uuid primary key references profiles(user_id) on delete cascade, user_id uuid primary key references profiles(user_id) on delete cascade,
company_name text not null, company_name text not null,
website text not null website text not null
); );
alter table brands enable row level security; alter table brands enable row level security;
create policy brands_everyone_select
on brands for select
to authenticated, anon
using (true);
create policy brands_user_update
on brands for update
using ( (select auth.uid()) = user_id );
create table creators ( create table creators (
profile_id uuid primary key references profiles(user_id) on delete cascade, user_id uuid primary key references profiles(user_id) on delete cascade,
nickname text not null, nickname text not null,
bio text, bio text,
social_links jsonb social_links jsonb
); );
alter table creators enable row level security; alter table creators enable row level security;
create policy creators_everyone_select
on creators for select
to authenticated, anon
using (true);
create policy creators_user_update
on creators for update
using ( (select auth.uid()) = user_id );
create table admins ( create table admins (
profile_id uuid primary key references profiles(user_id) on delete cascade user_id uuid primary key references profiles(user_id) on delete cascade
); );
alter table admins enable row level security; alter table admins enable row level security;
create policy admins_everyone_select
on admins for select
to authenticated, anon
using (true);
create policy admins_user_update
on admins for update
using ( (select auth.uid()) = user_id );
-- based on raw_user_meta_data, create a profile and subprofile for new users -- based on raw_user_meta_data, create a profile and subprofile for new users
create function public.handle_new_user() create function public.handle_new_user()
@@ -39,18 +69,18 @@ begin
end if; end if;
insert into profiles (user_id, user_type) values (new.id, new.raw_user_meta_data ->> 'user_type'); insert into profiles (user_id, user_type) values (new.id, new.raw_user_meta_data ->> 'user_type');
if user_type = 'brand' then if user_type = 'brand' then
insert into brands (profile_id, company_name, website) insert into brands (user_id, company_name, website)
values (new.id, values (new.id,
new.raw_user_meta_data ->> 'company_name', new.raw_user_meta_data ->> 'company_name',
new.raw_user_meta_data ->> 'website'); new.raw_user_meta_data ->> 'website');
elsif user_type = 'creator' then elsif user_type = 'creator' then
insert into creators (profile_id, nickname, bio, social_links) insert into creators (user_id, nickname, bio, social_links)
values (new.id, values (new.id,
new.raw_user_meta_data ->> 'nickname', new.raw_user_meta_data ->> 'nickname',
new.raw_user_meta_data ->> 'bio', new.raw_user_meta_data ->> 'bio',
new.raw_user_meta_data ->> 'social_links'); new.raw_user_meta_data ->> 'social_links');
elsif user_type = 'admin' then elsif user_type = 'admin' then
insert into admins (profile_id) values (new.id); insert into admins (user_id) values (new.id);
end if; end if;
return new; return new;
end; end;
@@ -61,7 +91,7 @@ create trigger on_auth_user_created
for each row execute procedure public.handle_new_user(); for each row execute procedure public.handle_new_user();
-- keep validation on subprofiles -- keep validation on subprofiles
create or replace function public.enforce_profile_type(profile_id uuid, expected_type text) create or replace function public.enforce_profile_type(user_id uuid, expected_type text)
returns void returns void
language plpgsql language plpgsql
security definer set search_path = '' security definer set search_path = ''
@@ -70,10 +100,10 @@ declare
actual_type text; actual_type text;
begin begin
select user_type into actual_type select user_type into actual_type
from profiles where user_id = profile_id; from profiles where user_id = user_id;
if actual_type is null then if actual_type is null then
raise exception 'profile not found for id: %', profile_id; raise exception 'profile not found for id: %', user_id;
end if; end if;
if actual_type <> expected_type then if actual_type <> expected_type then
@@ -87,7 +117,7 @@ create or replace function public.check_brand_user_type()
language plpgsql language plpgsql
security definer set search_path = '' security definer set search_path = ''
as $$ begin as $$ begin
perform public.enforce_profile_type(new.profile_id, 'brand'); perform public.enforce_profile_type(new.user_id, 'brand');
return new; return new;
end; $$; end; $$;
@@ -96,7 +126,7 @@ create or replace function public.check_creator_user_type()
language plpgsql language plpgsql
security definer set search_path = '' security definer set search_path = ''
as $$ begin as $$ begin
perform public.enforce_profile_type(new.profile_id, 'creator'); perform public.enforce_profile_type(new.user_id, 'creator');
return new; return new;
end; $$; end; $$;
@@ -105,7 +135,7 @@ create or replace function public.check_admin_user_type()
language plpgsql language plpgsql
security definer set search_path = '' security definer set search_path = ''
as $$ begin as $$ begin
perform public.enforce_profile_type(new.profile_id, 'admin'); perform public.enforce_profile_type(new.user_id, 'admin');
return new; return new;
end; $$; end; $$;

View File

@@ -0,0 +1,19 @@
create table public.campaigns (
id uuid primary key default gen_random_uuid(),
created_at timestamp with time zone not null default now(),
brand_id uuid not null references public.brands(user_id) on delete cascade,
description text not null default ''::text
);
alter table public.campaigns enable row level security;
create policy everyone_view_only
on public.campaigns
as permissive
for select
to authenticated, anon
using (true);
create policy users_manage_their_own_data
on public.campaigns
as permissive
for all
to authenticated
using ((( SELECT auth.uid() AS uid) = brand_id));