drop table if exists likes;
drop table if exists reviews;
create table reviews (
id uuid default gen_random_uuid() primary key,
created_at timestamptz default now(),
user_id uuid references auth.users(id) on delete cascade,
username text not null,
drink_name text not null,
photo_url text,
description text,
p1 int, p2 int, p3 int, p4 int,
tahikardia int, tremor int,
score numeric, tier text
);
create table likes (
review_id uuid references reviews(id) on delete cascade,
fingerprint text not null,
primary key (review_id, fingerprint)
);
alter table reviews enable row level security;
alter table likes enable row level security;
create policy "read" on reviews for select using (true);
create policy "insert own" on reviews for insert with check (auth.uid() = user_id);
create policy "update own" on reviews for update using (auth.uid() = user_id);
create policy "delete own" on reviews for delete using (auth.uid() = user_id);
create policy "read likes" on likes for select using (true);
create policy "insert likes" on likes for insert with check (true);
create policy "delete likes" on likes for delete using (true);
create table admins (
user_id uuid primary key references auth.users(id) on delete cascade
);
alter table admins enable row level security;
create policy "read admins" on admins for select using (true);
create policy "admin delete reviews" on reviews for delete
using (exists (select 1 from admins where admins.user_id = auth.uid()));
create policy "upload photos" on storage.objects for insert
to authenticated with check (bucket_id = 'drink-photos');
create policy "read photos" on storage.objects for select
using (bucket_id = 'drink-photos');
Если база уже существует и в ней есть обзоры — не выполняйте скрипт выше, а просто добавьте недостающее:
alter table reviews add column if not exists description text;
create policy "update own" on reviews for update using (auth.uid() = user_id);
create table if not exists admins (
user_id uuid primary key references auth.users(id) on delete cascade
);
alter table admins enable row level security;
create policy "read admins" on admins for select using (true);
create policy "admin delete reviews" on reviews for delete
using (exists (select 1 from admins where admins.user_id = auth.uid()));
-- выдать админку аккаунту (замените логин на свой):
insert into admins (user_id)
select id from auth.users where raw_user_meta_data->>'username' = 'skesmachine'
on conflict do nothing;
3. В разделе Storage создайте bucket drink-photos (public).
4. В Authentication → Sign In / Providers → Email выключите Confirm email.
5. Вставьте данные из Settings → API:
Project URL
Anon public key
Кадрировать фото
Двигайте и масштабируйте фото (щипком на телефоне). Выделите банку плотно — крупная банка лучше смотрится и в карточке, и в 3D.