File size: 2,799 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
-- 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;