fix(push/subscribe): 같은 user_id 의 여러 endpoint 동시 허용

옛 정책: 같은 user_id 의 다른 endpoint 자동 DELETE → 마지막 구독 1개만 유지
새 정책: 모든 endpoint 유지 (PC Chrome / 모바일 Chrome / 삼성 인터넷 / 앱 동시 구독 가능)

문제 사례:
- momo125 가 모바일 Chrome 에서 구독 → DB (momo125, chrome_endpoint)
- 그 후 삼성 인터넷에서 구독 시도 → DB 의 chrome_endpoint 가 삭제되며 삼성만 남음
- PC 에서 발송하면 양쪽 다 안 오는 케이스 발생

만료(404/410)된 endpoint 는 sendPush 내부에서 자동 정리되어 누적 위험 없음.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
chpark
2026-05-30 22:26:06 +09:00
parent be86d22a6f
commit 3786800f12
+4 -7
View File
@@ -33,13 +33,10 @@ export async function POST(req: NextRequest) {
[createObjectId(), userId, endpoint, p256dh, auth, userAgent]
);
// 같은 사용자의 이전 구독은 정리 — 마지막에 구독한 기기/앱 하나만 유지.
// 브라우저(삼성 인터넷 등)로 먼저 구독해 둔 게 남아 앱이 아닌 브라우저 알림으로
// 오던 문제 방지. (앱에서 다시 켜면 옛 브라우저 구독이 제거됨)
await pool.query(
`DELETE FROM momo_push_subscriptions WHERE user_id = $1 AND endpoint <> $2`,
[userId, endpoint]
).catch(() => {});
// 옛 정책(같은 user_id 마지막 1개만 유지)은 제거 — 한 사용자가 PC Chrome /
// 모바일 Chrome / 삼성 인터넷 / 모모유통 앱 등 여러 채널 동시 구독을 허용.
// 만료(404/410)된 endpoint 는 sendPush 내부에서 자동 정리되므로 stale 누적 없음.
// (참고: User-Agent 가 동일하고 endpoint 만 갱신된 경우는 위의 UPSERT 가 갱신 처리)
// 구독 직후 환영 푸시 — 전체 파이프라인(서버→푸시서비스→기기) 동작 즉시 확인용
const welcome = await sendPush(