Skip to content

feat(web/bot): 새 글 등록 시 FCM 푸시 알림 발송#66

Merged
bbbang105 merged 1 commit intodevfrom
feat/new-post-push-notification
Mar 23, 2026
Merged

feat(web/bot): 새 글 등록 시 FCM 푸시 알림 발송#66
bbbang105 merged 1 commit intodevfrom
feat/new-post-push-notification

Conversation

@bbbang105
Copy link
Copy Markdown
Owner

Summary

새 글이 등록(수동 + RSS)되면, 알림을 허용한 active/OB/dormant 멤버 전원에게 FCM 푸시 알림을 발송한다. 작성자 본인은 제외.

Changes

파일 변경
packages/shared/src/db/schema.ts NotificationTypeNEW_POST: 'new_post' 추가
packages/web/src/lib/sanitize.ts decodeHtmlEntities() 추가 (RSS 제목 HTML 엔티티 디코딩, fromCodePoint + 제어문자 필터)
packages/web/src/app/api/internal/new-post-push/route.ts 신규 — 봇→웹 내부 푸시 API (Bearer 인증, timing-safe 비교, rate limit 20/min, UUID/길이 검증)
packages/web/src/app/api/posts/manual/route.ts 별도 after() 블록으로 푸시 발송 (Discord 토글 무관, decodeHtmlEntities 적용)
packages/bot/src/scheduler-registry.ts RSS 새 글 시 웹 내부 API fire-and-forget 호출 (루프 블로킹 방지)
packages/web/src/components/settings/push-notification-settings.tsx new_post 토글 + FileText 아이콘 추가
packages/web/src/app/api/push/test/route.ts new_post 테스트 메시지 추가
.env.example INTERNAL_API_KEY, WEB_URL 추가
CLAUDE.md 새 글 푸시 알림 관련 문서 최신화
docs/ARCHITECTURE.md 데이터 흐름, 보안 레이어, FCM 설명 업데이트

Design Decisions

결정 이유
봇→웹 내부 API 방식 (A안) 푸시 로직을 웹에 집중, Firebase 의존성 봇에 추가 불필요, 확장성
Discord 토글과 푸시 분리 사용자가 Discord 알림은 끄되 푸시는 받고 싶을 수 있음
fire-and-forget (봇→웹) RSS 폴링 루프 블로킹 방지
timing-safe 비교 + rate limit 내부 API이지만 Vercel에 퍼블릭 노출되므로 보안 강화
active + OB + dormant 전원 대상 웹 접근 가능한 모든 멤버가 알림 수신 가능하도록

Test Plan

  • 수동 등록 시 본인 제외 전원에게 푸시 알림 수신 확인
  • RSS 수집 시 봇→웹 내부 API 호출 및 푸시 발송 확인
  • 알림 설정에서 '새 글 알림' 토글 표시 및 on/off 동작 확인
  • 테스트 푸시 '새 글 알림' 전송 확인
  • INTERNAL_API_KEY 미설정 시 봇 graceful skip 확인
  • 클릭 시 /posts/{id} 포스트 상세로 이동 확인

배포 전 필요

  • Vercel에 INTERNAL_API_KEY 환경변수 추가
  • 봇 EC2에 INTERNAL_API_KEY + WEB_URL 환경변수 추가

🤖 Generated with Claude Code

수동 등록 + RSS 수집 모두에서 새 글 등록 시 작성자 본인을 제외한
active/OB/dormant 멤버에게 FCM 푸시 알림을 발송한다.

- shared: NotificationType에 NEW_POST 추가
- web: 내부 API `/api/internal/new-post-push` (Bearer 인증, timing-safe 비교, rate limit 20/min, UUID/길이 검증)
- web: 수동 등록 시 별도 after() 블록에서 sendPushToMembers 호출 (Discord 토글과 독립)
- bot: RSS 새 글 감지 시 웹 내부 API fire-and-forget 호출
- web: 알림 설정 UI에 '새 글 알림' 토글 추가
- web: 테스트 푸시에 new_post 타입 추가
- web: decodeHtmlEntities 유틸 추가 (RSS 제목 HTML 엔티티 디코딩)
- docs: CLAUDE.md, ARCHITECTURE.md 최신화

Co-Authored-By: Claude <noreply@anthropic.com>
@bbbang105 bbbang105 requested a review from choihooo as a code owner March 23, 2026 07:36
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 23, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
study-admin-web Ready Ready Preview, Comment Mar 23, 2026 7:37am

@bbbang105 bbbang105 added 📄 docs 문서 추가 및 수정 🚀 feat 새로운 기능 추가 / 일부 코드 추가 / 일부 코드 수정 (리팩토링과 구분) / 디자인 요소 수정 labels Mar 23, 2026
@bbbang105 bbbang105 merged commit 73df652 into dev Mar 23, 2026
8 checks passed
@bbbang105 bbbang105 deleted the feat/new-post-push-notification branch March 23, 2026 07:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📄 docs 문서 추가 및 수정 🚀 feat 새로운 기능 추가 / 일부 코드 추가 / 일부 코드 수정 (리팩토링과 구분) / 디자인 요소 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant