Bops
AI 봇 팀이 업무 운영을 담당, 메일·파이프라인·청구·보고서 관리, 각각 컴퓨터·이메일·전화번호 보유, 모든 정보를 기억
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
PWA 홈 화면에 표시되는 이름은 「2청년회」 입니다 (public/manifest.webmanifest). 2청년회 가장·임원·목사를 위한 주간 운영 도구입니다. 학기 가족 구성, 주일 출석, 참여조사, 리더모임(교안·기도회·악보), 배정모자, 돌봄카드, 공지, 가장 인수인계를 한곳에서 처리합니다. 로그인 후 왼쪽(넓은 화면) 또는 위쪽(좁은 화면)에 나옵니다. 임원은 회장·부회장·총무·부총무·서기·부서기·회계·부회계입니다. 그해 직책은 목사만 앉히거나 비웁니다. 담당 가족만 있는 일반 가장은 가족·성도 명단·가장 임명·출석 QR·참여조사 생성·공지 발송·배정 관리를 할 수 없습니다. 임원이 가장을 겸임할 수 있습니다. /my-group은 예전 주소입니다. 가장은 자기 가족 돌봄카드로, 그 외에는 대시보드로 이동합니다. 예배 좌석 배치(/worship, 인쇄 /worship/{id}/print)는 코드와 시드에 남아 있습니다. 메뉴에는 없습니다.README 전문 보기 ↗
PWA 홈 화면에 표시되는 이름은 「2청년회」 입니다 (public/manifest.webmanifest).
2청년회 가장·임원·목사를 위한 주간 운영 도구입니다. 학기 가족 구성, 주일 출석, 참여조사, 리더모임(교안·기도회·악보), 배정모자, 돌봄카드, 공지, 가장 인수인계를 한곳에서 처리합니다.
로그인 후 왼쪽(넓은 화면) 또는 위쪽(좁은 화면)에 나옵니다.
| 메뉴 | 경로 | 누가 |
|---|---|---|
| 대시보드 | /dashboard | 모두. 이번 주일 출석이 비어 있으면 바로가기, 알림 켜기, 최근 리더모임 |
| 출석 | /attendance | 모두. 가장은 자기 가족, 임원·목사는 전체 |
| 리더모임 | /meetings | 모두 |
| 돌봄카드 | 가장은 /reports/{자기 가족}, 그 외 /reports | 그 가족 가장과 목사·관리자만 방을 봄 |
| 참여조사 | /surveys | 모두. 조사 생성은 임원·목사 |
| 공지 | /announcements | 모두 열람. 작성·발송은 임원·목사 |
| 배정모자 | /hat | 모두 |
| 가족 | /groups | 임원·목사 |
| 성도 명단 | /admin/members | 임원·목사 |
| 가장·임원 관리 | /admin/handover | 임원·목사 |
| 배정 관리 | /hat/admin | 임원·목사 |
임원은 회장·부회장·총무·부총무·서기·부서기·회계·부회계입니다. 그해 직책은 목사만 앉히거나 비웁니다. 담당 가족만 있는 일반 가장은 가족·성도 명단·가장 임명·출석 QR·참여조사 생성·공지 발송·배정 관리를 할 수 없습니다. 임원이 가장을 겸임할 수 있습니다.
/my-group은 예전 주소입니다. 가장은 자기 가족 돌봄카드로, 그 외에는 대시보드로 이동합니다.
예배 좌석 배치(/worship, 인쇄 /worship/{id}/print)는 코드와 시드에 남아 있습니다. 메뉴에는 없습니다.
가족에서 미배정으로 보여 새 가족으로 옮깁니다.로컬·배포 모두 Firebase입니다. SQLite/Prisma는 쓰지 않습니다.
| 무엇 | 어디에 |
|---|---|
| 계정, 가족, 가족원, 가장 임기, 학기, 리더모임, 돌봄카드, 출석, 참여조사, 공지, 예배 좌석 | Firestore (src/lib/firebase-admin.ts, src/lib/store/*) |
| 교안, 교안 해설지, 악보 | Vercel Blob (비공개, src/lib/storage.ts) |
| 푸시 구독 | Firestore pushSubscriptions |
| 배정모자 실시간 상태 | Realtime Database (public/sorting-hat/). Firestore와 별개 |
클라이언트는 Firestore·Blob을 직접 읽지 않습니다. 서버 액션(src/app/actions.ts)과 서버 컴포넌트만 firebase-admin으로 접근하고, 권한은 NextAuth 세션으로 검사합니다. 웹 푸시(FCM)만 브라우저의 Firebase Messaging SDK와 서비스 워커를 쓰고, 토큰은 서버가 저장합니다.
로그인 사용자(목사·관리자·가장·임원)만 받을 수 있습니다. 가족원 계정은 없고, 돌봄카드는 카카오톡과 병행합니다.
같은 계정으로 브라우저와 설치형 PWA에서 각각 알림을 켜도 사용자당 최신 토큰 하나만 남습니다. 발송도 그 토큰만 쓰고, 같은 이벤트는 notification.tag로 한 번만 보이게 합니다.
| 언제 | 누구에게 | 누르면 |
|---|---|---|
| 가장이 돌봄카드를 보냄 | 구독 중인 목사·관리자 | /reports/{groupId} |
| 리더모임에서 기도회 인도 가장을 저장 | 그 담당자 | /meetings/{meetingId} |
| 매주 일요일 18:00 (서울) | 담당 가족이 있는 가장. 목사·임원은 제외 | /attendance/{sundayId} (가장은 자기 가족 화면) |
| 공지를 지금 보냄 | all 알림을 켠 로그인 사용자, leaders 담당 가족 있는 가장, 또는 users로 고른 사람 | /announcements/{id} |
기도회 인도 가장은 리더모임 상세에서 그 주 가장을 고릅니다. 출석 리마인더는 vercel.json Cron 0 9 * * 0(일요일 09:00 UTC = 18:00 KST)이 GET /api/cron/attendance-reminder를 호출합니다. Authorization: Bearer <CRON_SECRET>이 필요하고, Firestore settings/attendanceReminder의 lastRemindedSundayId로 같은 주일 중복 발송을 막습니다. 일요일이 아니거나, 이미 보냈거나, 담당 가족 가장·구독 토큰이 없으면 건너뜁니다.
Firebase 콘솔
public/sorting-hat/firebase-config.js와 같은 프로젝트면 그 웹 앱 설정을 재사용합니다.NEXT_PUBLIC_FIREBASE_VAPID_KEY.FIREBASE_PROJECT_ID와 NEXT_PUBLIC_FIREBASE_PROJECT_ID가 같아야 합니다.NEXT_PUBLIC_FIREBASE_API_KEY="..."
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN="....firebaseapp.com"
NEXT_PUBLIC_FIREBASE_PROJECT_ID="..."
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID="..."
NEXT_PUBLIC_FIREBASE_APP_ID="..."
NEXT_PUBLIC_FIREBASE_VAPID_KEY="..."
서비스 계정 키는 git에 넣지 않습니다.
iPhone에서 홈 화면에 추가
iOS에는 설치 버튼이 없습니다. Safari에서 직접 홈 화면에 넣어야 하고, 웹 푸시는 iOS 16.4 이상에서 그 앱을 열었을 때만 됩니다. Chrome이나 카카오톡 인앱 브라우저에는 이 메뉴가 없습니다.
로컬에서 출석 리마인더만 흉내 낼 때 (일요일, 에뮬레이터·Firebase Admin·CRON_SECRET 필요):
curl -sS -H "Authorization: Bearer $CRON_SECRET" \
"http://localhost:43123/api/cron/attendance-reminder"
{"status":"sent",...} 이면 발송된 것이고, 같은 주일에 다시 호출하면 already_reminded_for_sunday로 건너뜁니다. 다른 요일은 not_sunday_...입니다.
BLOB_READ_WRITE_TOKEN, Vercel에서 스토어 연결 시 주입).env.example을 복사해 .env를 만듭니다.
로컬 (에뮬레이터)
Firestore만 로컬에서 돌려도 됩니다(Storage 에뮬레이터는 이 앱의 교안·악보에 쓰이지 않습니다). 프로젝트 ID는 demo-로 시작해야 실제 Firebase에 붙지 않습니다.
npm install -g firebase-tools
macOS에서 Java가 PATH에 없으면 에뮬레이터가 시작하지 않습니다.
brew install openjdk
export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"
export JAVA_HOME="/opt/homebrew/opt/openjdk"
이 터미널은 켜 둡니다.
firebase emulators:start --only firestore --project demo-mokyang-flow
여기까지가 README 앞부분입니다. 나머지는 원문에서 읽을 수 있습니다. README 전문 보기 ↗