d3ro-voice/server/supabase/migrations/20260413000002_admin_role.sql
윤찬 667c09242b feat(web): 관리자 CRM 웹페이지 — admin role + 4개 페이지
- migration: profiles.role 컬럼 + admin RLS 정책
- admin-guard.ts: RSC용 admin 권한 체크
- /admin: CRM 대시보드 (총 유저, 유료 구독자, API 호출, 만료 예정)
- /admin/users: 유저 목록 (검색/필터/페이지네이션)
- /admin/users/[id]: 유저 상세 (프로필+구독+30일 사용량)
- /admin/subscriptions: 구독 목록 (상태 필터)
- /admin/usage: 사용량 집계 (7/14/30일)
- Sidebar에 Admin 네비게이션 추가
2026-04-12 20:24:26 +09:00

31 lines
1 KiB
SQL

-- Phase 3.3: 관리자 역할 + RLS 정책
-- profiles.role 컬럼 추가 + admin 전용 SELECT 정책
-- 1. role 컬럼
ALTER TABLE public.profiles
ADD COLUMN IF NOT EXISTS role text NOT NULL DEFAULT 'user';
ALTER TABLE public.profiles
ADD CONSTRAINT profiles_role_check
CHECK (role IN ('user', 'admin'));
-- 2. Admin RLS: 모든 profiles 조회
CREATE POLICY "admin_read_all_profiles" ON public.profiles
FOR SELECT TO authenticated
USING (
EXISTS (SELECT 1 FROM public.profiles p WHERE p.id = auth.uid() AND p.role = 'admin')
);
-- 3. Admin RLS: 모든 subscriptions 조회
CREATE POLICY "admin_read_all_subscriptions" ON public.subscriptions
FOR SELECT TO authenticated
USING (
EXISTS (SELECT 1 FROM public.profiles p WHERE p.id = auth.uid() AND p.role = 'admin')
);
-- 4. Admin RLS: 모든 daily_usage 조회
CREATE POLICY "admin_read_all_daily_usage" ON public.daily_usage
FOR SELECT TO authenticated
USING (
EXISTS (SELECT 1 FROM public.profiles p WHERE p.id = auth.uid() AND p.role = 'admin')
);