File size: 2,568 Bytes
aa9892b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
-- ํฌ๋ ˆ๋”ง ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ” (Supabase SQL Editor์—์„œ ์‹คํ–‰)

-- 1. ์‚ฌ์šฉ์ž ํฌ๋ ˆ๋”ง ์ž”์•ก
CREATE TABLE IF NOT EXISTS public.user_credits (
    user_id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
    balance INTEGER NOT NULL DEFAULT 100,
    total_earned INTEGER NOT NULL DEFAULT 100,
    total_spent INTEGER NOT NULL DEFAULT 0,
    daily_reset_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

-- RLS: ๋ณธ์ธ๋งŒ ์กฐํšŒ, service_role๋งŒ ์ˆ˜์ •
ALTER TABLE public.user_credits ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can read own credits" ON public.user_credits
    FOR SELECT USING (auth.uid() = user_id);

-- 2. ํฌ๋ ˆ๋”ง ๋ณ€๋™ ๋กœ๊ทธ
CREATE TABLE IF NOT EXISTS public.credit_logs (
    id BIGSERIAL PRIMARY KEY,
    user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
    amount INTEGER NOT NULL,  -- ์–‘์ˆ˜=์ถฉ์ „, ์Œ์ˆ˜=์ฐจ๊ฐ
    reason TEXT NOT NULL DEFAULT '',
    detail JSONB NOT NULL DEFAULT '{}',
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

ALTER TABLE public.credit_logs ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can read own logs" ON public.credit_logs
    FOR SELECT USING (auth.uid() = user_id);

CREATE INDEX IF NOT EXISTS idx_credit_logs_user ON public.credit_logs(user_id, created_at DESC);

-- 3. ์ฟ ํฐ ํ…Œ์ด๋ธ”
CREATE TABLE IF NOT EXISTS public.coupons (
    id BIGSERIAL PRIMARY KEY,
    code TEXT NOT NULL UNIQUE,
    credit_amount INTEGER NOT NULL DEFAULT 10000,
    max_uses INTEGER NOT NULL DEFAULT 1,
    used_count INTEGER NOT NULL DEFAULT 0,
    active BOOLEAN NOT NULL DEFAULT TRUE,
    expires_at TIMESTAMPTZ,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

ALTER TABLE public.coupons ENABLE ROW LEVEL SECURITY;
-- ์ฟ ํฐ์€ service_role๋กœ๋งŒ ๊ด€๋ฆฌ

-- 4. ์ฟ ํฐ ์‚ฌ์šฉ ์ด๋ ฅ
CREATE TABLE IF NOT EXISTS public.coupon_redemptions (
    id BIGSERIAL PRIMARY KEY,
    user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
    coupon_id BIGINT NOT NULL REFERENCES public.coupons(id),
    credit_amount INTEGER NOT NULL,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    UNIQUE(user_id, coupon_id)  -- 1์ธ 1ํšŒ ์‚ฌ์šฉ
);

ALTER TABLE public.coupon_redemptions ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can read own redemptions" ON public.coupon_redemptions
    FOR SELECT USING (auth.uid() = user_id);

-- 5. ํ…Œ์ŠคํŠธ ์ฟ ํฐ ์‚ฝ์ž… (ํ•„์š”์‹œ)
-- INSERT INTO public.coupons (code, credit_amount, max_uses) VALUES ('WELCOME2026', 10000, 100);