-- 022: 네이티브 앱 (iOS/Android) FCM 푸시 채널 추가 -- -- 배경: -- - 2026-05-05 SQL 017 에서 Web Push 폐기 (push_subscriptions DROP). -- - 2026-05-10 iOS/Android 네이티브 앱 배포 완료 → FCM 으로 푸시 부활. -- - 회귀 가드 (playlist_scheduling.md): "push_subscriptions 부활 금지, 새 푸시 -- 채널은 별도 테이블" → 본 마이그레이션은 device_push_tokens 라는 새 이름 사용. -- -- 적용 일자: 2026-05-10 -- 1) device_push_tokens — 사용자 단말별 FCM registration token 보관. -- 한 사용자가 여러 단말 사용 가능 (iPhone + iPad + Android 등) → composite key. CREATE TABLE IF NOT EXISTS device_push_tokens ( user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, token TEXT NOT NULL, platform TEXT NOT NULL CHECK (platform IN ('ios', 'android')), app_version TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), PRIMARY KEY (user_id, token) ); CREATE INDEX IF NOT EXISTS idx_device_push_tokens_user ON device_push_tokens (user_id); -- 같은 토큰이 다른 user 로 옮겨가는 케이스 (단말 양도/재로그인) — 토큰 기준 -- 으로도 빠르게 찾아 옛 user 행 정리할 수 있게. CREATE INDEX IF NOT EXISTS idx_device_push_tokens_token ON device_push_tokens (token); -- RLS — 본인 토큰만 read/write. 발송은 서버(service_role)가 직접 query. ALTER TABLE device_push_tokens ENABLE ROW LEVEL SECURITY; DROP POLICY IF EXISTS "device_push_tokens_self_select" ON device_push_tokens; CREATE POLICY "device_push_tokens_self_select" ON device_push_tokens FOR SELECT USING (auth.uid() = user_id); DROP POLICY IF EXISTS "device_push_tokens_self_insert" ON device_push_tokens; CREATE POLICY "device_push_tokens_self_insert" ON device_push_tokens FOR INSERT WITH CHECK (auth.uid() = user_id); DROP POLICY IF EXISTS "device_push_tokens_self_update" ON device_push_tokens; CREATE POLICY "device_push_tokens_self_update" ON device_push_tokens FOR UPDATE USING (auth.uid() = user_id); DROP POLICY IF EXISTS "device_push_tokens_self_delete" ON device_push_tokens; CREATE POLICY "device_push_tokens_self_delete" ON device_push_tokens FOR DELETE USING (auth.uid() = user_id); -- 2) playlist_schedules.notify_app_push — 스케줄 발사 시 FCM 푸시도 보낼지. -- SQL 017 의 notify_kakao 와 독립. 둘 다 켜면 둘 다 발송. ALTER TABLE playlist_schedules ADD COLUMN IF NOT EXISTS notify_app_push BOOLEAN NOT NULL DEFAULT FALSE; -- 3) care_messages 도 동일 채널 추가 (안부 메시지도 푸시 옵션 가능하도록). ALTER TABLE care_messages ADD COLUMN IF NOT EXISTS notify_app_push BOOLEAN NOT NULL DEFAULT FALSE;