Novato 프로젝트 문서 (마스터)

Novato 농구 리그 관리 서비스의 웹(React) + 앱(Flutter) 기능 종합 문서. 현재 상태 지도 + 변경 이력.

세부는 각 페이지 참고. 이 페이지는 전체 지도 + 요약만.

문서 구조

웹 (novato.kr · novato_react)

앱 (novato_app · Flutter)

공통

검토 / 의사결정

  • Capacitor-네이티브-전환-검토 — 앱을 Flutter WebView → Capacitor 네이티브로 전환할지 검토 (Play Store·OTA·구글로그인·싸이닝·대시보드 카드화)
  • Capacitor-PoC-검증결과 — 위 검토의 PoC 실행 결과 (스캐폴딩·로그인·카드대시보드·edge-to-edge·OTA 실기기 검증 완료)
  • RLS-정책-설계-검토 — Supabase RLS 정책 설계·확정 (로그인 조회 제한 + 역할별 CRUD). 결정 완료(§6) — 웹 로그인 강제, 감독=로스터 coach 팀단위, 스탯입력은 로그인 전원, Flutter StatPad 폐기. SQL: novato_react supabase/rls_phase2_member_lockdown.sql (main 배포 후 적용)

한눈에 보기

구분화면 / 메뉴
웹 탭 (novato.kr)대시보드 · 일정 · 순위 · 팀/선수 · 라운지 (5개)
웹 직접 URLbroadcast(PRISM방송) · highlights(유튜브 스탯입력) · 예측 · 게시판 · 공지 · 통계(DAU)
(novato_app)웹뷰(위 웹앱) + ”…” 메뉴: 새로고침 · 공지관리 · StatPad · 공유 · 정보
  • = 일반 기능 전부. 스탯 입력은 /highlights(유튜브), 경기 상세는 일정 카드에서 진입(경기 탭 제거됨).
  • = 웹뷰 + 특수기능. 현재 v1.0.2.

정리 현황 (대부분 완료)

대상상태
/broadcast24·/tvbroadcast·/scoreboard·/mobile-scoreboard·/mobile-broadcast✅ 제거 (PR #29)
/upload(Google Sheets/Excel) 페이지·서비스✅ 제거 (PR #29)
웹 경기 탭(하단/상단)✅ 제거 (PR #32) — 일정 카드에서 진입
앱 스탯업로드·신문기사·전광판 메뉴 + Streamlit·갤러리·전광판 화면✅ 제거 (v1.0.0)
앱 TV 방송채널 메뉴, undo/redo·미사용 코드✅ 제거 (v1.0.1)
유지/broadcast(PRISM), /highlights(유튜브 스탯), /stats(DAU), /admin

변경 이력 (2026-07)

  • +1점 규칙(녹색 견장) — 통계 원본, 점수만 +1. 앱-StatPad
  • 방송/스코어보드 5종·업로드 페이지 폐기 (PR #29)
  • 일정 카드 ”…” 메뉴 재설계(모드 토글·롱프레스 제거), 바디클릭=상세/예측 (PR #30) → 웹-메뉴트리
  • 일정 예정경기 2주 폴딩(그 이후 접기) (PR #31)
  • 브로드캐스트 득점리더 라이브스탯 일치 수정(항상 원시카운트+보너스) (PR #31)
  • 경기 탭 제거, 팀 메뉴 역할 지정(감독/코치 등), 프로필 수정 시 기본정보 탭, 카드 메뉴 z-index (PR #32)
  • AI 경기 프리뷰 — 승부예측 페이지에 AI 승률+기사 표시, 주 1회 /game-preview 스킬로 생성 (PR #33) → AI-경기프리뷰
  • NovaTalk 로그인 계정 글쓰기 복구posts/commentspassword_hash NOT NULL 해제. 계정(user_id) 글은 비밀번호가 없어 작성이 전부 실패하던 것
  • 태블릿·폴드 펼침 대비 수정 — 하단 탭 내비가 안드로이드 3버튼 네비바에 가리고 글씨가 회색이라 안 보이던 문제. 네이티브 그라데이션 처리가 모바일 분기에만 있었음 (일정 화면 대비 1.3 → 6.27)
  • 사진 확대 뷰어 — 핀치 줌/더블탭/드래그. 게시글·경기 사진·선수 사진 공용(ImageViewer), 기존 줌 없는 모달 3곳 대체
  • 게시글 화면 정리 — 작성 폼 하단 잘림(pb-tabbar 누락), 상세를 제목/본문/댓글 카드로 분리, /board 단독 라우트 → 라운지 board 탭 리다이렉트

앱 (v0.9.9 → v1.0.2)

  • v1.0.0: 메뉴 8→5, 레거시 제거
  • v1.0.1: StatPad 심플모드 스탯 전면 확장(모든 스탯+실패·리바운드), 카드에 리바운드/스틸 표시, 업데이트 확인 전체버전 감지 + 강제 APK 다운로드 앱-개요
  • v1.0.2: 심플모드 비활성 선수 서버 업로드 제외 버그 수정 앱-StatPad

Capacitor 앱 (novato_react 네이티브 셸, 2026-07-23)

  • 릴리스 서명키 개통novato-release.keystore 생성(로컬 NovatoProject/keys/ 보관), GitHub Actions 시크릿 4종 등록. 릴리스 APK signed:"release" 확인. 기존 디버그 서명 APK 위에는 업데이트 설치 불가 → 재설치 필요.
  • 가입 승인 대기(pending) 대시보드 오버레이 — 미승인 계정은 대시보드 데이터 로드를 통째로 스킵하고, 블러 처리된 정적 스크린샷 배경 + 반투명 딤 + “가입 승인 대기중입니다” 카드 표시 (PendingDashboardOverlay, useAppData({enabled})).

알림 고도화 + 계정 카드 (2026-07-28~29)

  • 경기 전날 22시 개인 알림 — 내일 본인 팀 경기 + 우리 팀 유니폼 색(hex→한글). 기존 2일 전 아침 알림 대체. → 앱-푸시알림
  • 가입요청 알림 허브 딥링크 — super_admin 알림 탭 시 커스텀 탭으로 hub.novato.kr/members. 알림 route 가 외부 URL 이면 브라우저로 여는 공통 처리 추가.
  • 내 계정 연결 선수 카드 — 사진/이름/팀, 탭 시 선수 상세. “내 프로필 아니면 운영자에게 수정 요청” 안내.
  • 스크롤 복원 보강(일정·라운지·팀상세·경기기록 — 실스크롤러에 훅), 공지 ‘오늘 더 보지 않기’ localStorage 화(웹뷰 재시작 초기화 버그), 알림함 세션 레이스 수정.

관리 기능 허브 일원화 (2026-07-25)

  • 앱(novato_react)에서 제거: /admin(공지 등록) · /stats(DAU) · /management(리그 관리) · /highlights/:gameId(유튜브 스탯 입력) — 모두 novato_hub 로 이관 완료 (공지 관리는 동영상 지원 포함). 앱에는 공지 ‘열람’(팝업/배너/상세, 동영상 재생)과 하이라이트 재생만 유지.

푸시 알림 체계 (2026-07-25)앱-푸시알림

  • 알림함 — 앱 상단 🔔, 최근 7일 수신 알림 최신순 + 탭 시 딥링크 이동. app_notifications(RLS 본인만) + 7일 정리 크론. send-push 가 발송 시 유저별 자동 기록.
  • 알림 4종notify-events Edge Function(문구 조합) + 크론/트리거: ① 아침(KST 09) 월요일 주간 일정·매일 오늘 경기·2일 전 본인 팀 경기 개인 알림 ② 결과(KST 08) 어제 결과+팀순위 ③ 커피타임 등록 시 별명+농담 ④ AI 프리뷰/리뷰 등록 시. 수신 대상은 승인+player 연결 계정만(push_audience() RPC).
  • 정기 테스트 알림(2시간 간격)은 별명 개인화. 앱 재설치 공지(announcements id 23) 게시.

OTA 트러블슈팅 (2026-07-23 저녁)

  • OTA 미반영 원인 = R2 CORS — pub-*.r2.dev 가 CORS 헤더를 안 보내 웹뷰 fetch 의 manifest 조회가 조용히 실패. selfHostedUpdater 의 manifest 조회를 CapacitorHttp(네이티브, CORS 무관)로 교체(b91e48d)해 해결. 실기기(Z Fold)에서 다운로드→적용까지 logcat 검증 완료.
  • 적용 시점 주의: capgo 는 next 번들을 앱이 백그라운드로 갈 때 적용(installNext). 최근앱에서 강제 종료(force-stop)하면 적용 단계가 스킵됨 — 홈으로 나갔다가 다시 열면 반영.

허브 (novato_hub, 2026-07-23)

  • 스탭 임명 회원 선택화 — 회원관리의 리그 역할 임명 폼: 이메일 자유입력 → 승인 회원 드롭다운(이름+이메일, 한글 정렬).
  • 전 메뉴 테이블 정렬 — 공용 useSortable 훅 + SortableTh 컴포넌트로 선수관리·게임관리·리그관리·회원관리·커피타임·매니지먼트(경기·스탭)·관리자 승인 표 헤더 클릭 정렬(오름/내림차순, null 후순위).

남은 아이디어

  • admin 통합 관리: /stats(DAU)·/admin(공지) 등 관리 기능을 한 곳으로 통합(운영자 희망) → 웹-독립페이지

작성: 코드베이스(novato_react, novato_app) 분석 기반. 파일:line 근거는 각 세부 페이지 참조.