사주 기능 이식 & 로그인, 유저 페이지 Supabase 연동 & 토스 페이먼츠 결제 연동 & 사주 심층 분석을 위한 기능 분리
This commit is contained in:
121
supabase/schema.sql
Normal file
121
supabase/schema.sql
Normal file
@@ -0,0 +1,121 @@
|
||||
-- ============================================================
|
||||
-- 쟁승메이드 Supabase 스키마
|
||||
-- Supabase SQL Editor에서 순서대로 실행하세요
|
||||
-- ============================================================
|
||||
|
||||
-- ① profiles (유저 프로필 - auth.users와 연결)
|
||||
create table public.profiles (
|
||||
id uuid references auth.users(id) on delete cascade primary key,
|
||||
email text,
|
||||
full_name text,
|
||||
avatar_url text,
|
||||
created_at timestamptz default now(),
|
||||
updated_at timestamptz default now()
|
||||
);
|
||||
|
||||
-- 신규 가입 시 profiles 자동 생성 트리거
|
||||
create or replace 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 or replace trigger on_auth_user_created
|
||||
after insert on auth.users
|
||||
for each row execute procedure public.handle_new_user();
|
||||
|
||||
-- RLS
|
||||
alter table public.profiles enable row level security;
|
||||
create policy "본인 프로필 조회" on public.profiles for select using (auth.uid() = id);
|
||||
create policy "본인 프로필 수정" on public.profiles for update using (auth.uid() = id);
|
||||
|
||||
|
||||
-- ② saju_records (사주 분석 결과 저장)
|
||||
create table public.saju_records (
|
||||
id bigint generated by default as identity primary key,
|
||||
user_id uuid references public.profiles(id) on delete cascade,
|
||||
saju_data jsonb not null, -- SajuData JSON
|
||||
interpretation text, -- AI 해석 Markdown
|
||||
is_paid boolean default false, -- 유료 결제 여부
|
||||
created_at timestamptz default now()
|
||||
);
|
||||
|
||||
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);
|
||||
|
||||
|
||||
-- ③ products (판매 상품 정의)
|
||||
create table public.products (
|
||||
id text primary key, -- 예: 'saju_basic', 'saju_detail'
|
||||
name text not null, -- 상품명
|
||||
description text,
|
||||
price integer not null, -- 원 단위
|
||||
category text not null, -- 'saju' | 'lotto' | 'subscription'
|
||||
is_active boolean default true,
|
||||
created_at timestamptz default now()
|
||||
);
|
||||
|
||||
-- 초기 상품 데이터
|
||||
insert into public.products (id, name, description, price, category) values
|
||||
('saju_detail', 'AI 사주 상세 리포트', '신강/신약, 용신, 대운, AI 12가지 항목 해석', 4900, 'saju'),
|
||||
('lotto_premium', '로또 프리미엄 구독', '매주 프리미엄 번호 5조합 + 통계', 4900, 'lotto');
|
||||
|
||||
|
||||
-- ④ orders (주문 - 결제 전 생성)
|
||||
create table public.orders (
|
||||
id uuid default gen_random_uuid() primary key,
|
||||
user_id uuid references public.profiles(id) on delete set null,
|
||||
product_id text references public.products(id),
|
||||
amount integer not null,
|
||||
status text default 'pending', -- 'pending' | 'paid' | 'failed' | 'cancelled'
|
||||
metadata jsonb, -- 추가 정보 (saju_record_id 등)
|
||||
created_at timestamptz default now(),
|
||||
updated_at timestamptz default now()
|
||||
);
|
||||
|
||||
alter table public.orders enable row level security;
|
||||
create policy "본인 주문 조회" on public.orders for select using (auth.uid() = user_id);
|
||||
create policy "본인 주문 생성" on public.orders for insert with check (auth.uid() = user_id);
|
||||
|
||||
|
||||
-- ⑤ payments (결제 완료 내역 - 서버에서 검증 후 저장)
|
||||
create table public.payments (
|
||||
id uuid default gen_random_uuid() primary key,
|
||||
user_id uuid references public.profiles(id) on delete set null,
|
||||
order_id uuid references public.orders(id),
|
||||
product_name text not null,
|
||||
amount integer not null,
|
||||
status text default 'paid', -- 'paid' | 'refunded' | 'partial_refund'
|
||||
pg_provider text, -- 'toss' | 'portone'
|
||||
pg_payment_key text unique, -- PG사 결제 키
|
||||
created_at timestamptz default now()
|
||||
);
|
||||
|
||||
alter table public.payments enable row level security;
|
||||
create policy "본인 결제 내역 조회" on public.payments for select using (auth.uid() = user_id);
|
||||
|
||||
|
||||
-- ⑥ contact_requests (외주/서비스 문의 내역)
|
||||
create table public.contact_requests (
|
||||
id uuid default gen_random_uuid() primary key,
|
||||
user_id uuid references public.profiles(id) on delete set null,
|
||||
email text not null,
|
||||
name text,
|
||||
service text not null, -- 문의 서비스 종류
|
||||
message text not null,
|
||||
status text default 'pending', -- 'pending' | 'in_progress' | 'completed'
|
||||
created_at timestamptz default now()
|
||||
);
|
||||
|
||||
alter table public.contact_requests enable row level security;
|
||||
create policy "본인 의뢰 내역 조회" on public.contact_requests for select using (auth.uid() = user_id);
|
||||
create policy "누구나 의뢰 생성" on public.contact_requests for insert with check (true);
|
||||
Reference in New Issue
Block a user