Files
saju-web/supabase/schema.sql

77 lines
3.4 KiB
PL/PgSQL

-- 1. 유저 프로필 테이블 (auth.users와 연동)
create table public.profiles (
id uuid references auth.users(id) on delete cascade not null primary key,
email text,
full_name text,
avatar_url text,
credits integer default 0, -- 사주 보기용 머니/크레딧
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- RLS (Row Level Security) 설정
alter table public.profiles enable row level security;
create policy "공개 프로필은 누구나 볼 수 있음" on public.profiles for select using ( true );
create policy "사용자는 자신의 프로필을 생성 가능" on public.profiles for insert with check ( auth.uid() = id );
create policy "사용자는 자신의 프로필만 수정 가능" on public.profiles for update using ( auth.uid() = id );
-- 새 유저 가입 시 자동으로 profile 생성하는 트리거
create function public.handle_new_user()
returns trigger as $$
begin
insert into public.profiles (id, email, full_name, avatar_url)
values (new.id, new.email, new.raw_user_meta_data->>'full_name', new.raw_user_meta_data->>'avatar_url');
return new;
end;
$$ language plpgsql security definer;
create trigger on_auth_user_created
after insert on auth.users
for each row execute procedure public.handle_new_user();
-- 2. 사주 기록 테이블 (저장된 결과)
create table public.saju_records (
id bigint generated by default as identity primary key,
user_id uuid references public.profiles(id) not null,
saju_data jsonb not null, -- 사주 원국 데이터 (JSON)
interpretation text, -- AI 해석 결과 (Markdown 텍스트)
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
alter table public.saju_records enable row level security;
create policy "사용자는 자신의 기록만 볼 수 있음" on public.saju_records for select using ( auth.uid() = user_id );
create policy "사용자는 자신의 기록만 생성 가능" on public.saju_records for insert with check ( auth.uid() = user_id );
-- 3. 결제 내역 테이블 (PortOne 연동)
create table public.payments (
id uuid default gen_random_uuid() primary key,
user_id uuid references public.profiles(id) not null,
merchant_uid text not null unique, -- 주문 번호
imp_uid text, -- 포트원 고유 번호
amount integer not null,
token_amount integer default 0, -- 충전된 토큰 수
status text not null default 'pending', -- pending, paid, failed, cancelled
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
alter table public.payments enable row level security;
create policy "사용자는 자신의 결제 내역만 볼 수 있음" on public.payments for select using ( auth.uid() = user_id );
create policy "사용자는 자신의 결제 내역 생성 가능" on public.payments for insert with check ( auth.uid() = user_id );
create policy "사용자는 자신의 결제 내역 수정 가능" on public.payments for update using ( auth.uid() = user_id );
-- 토큰(크레딧) 충전을 위한 RPC 함수 (atomic increment, RLS 우회)
create or replace function public.add_credits(user_id_input uuid, amount_input integer)
returns integer as $$
declare
new_credits integer;
begin
update public.profiles
set credits = credits + amount_input
where id = user_id_input
returning credits into new_credits;
return new_credits;
end;
$$ language plpgsql security definer;