- /userVotesByDate/{date}/{uid}/{gameId} fan-out 인덱스 추가 — RTDB에는 부분 노드 읽기가 없어서 dailyArchive가 하루치를 처리하려면 /userVotes 트리 전체(전 유저 x 전 보존 날짜)를 내려받아야 했다
- 투표를 쓰는 3곳(submitVote, changeVote, processGameEndWithGame의 판정 결과 주입)이 원자 update 하나로 원본과 미러를 함께 기록
- 삭제 경로도 동기화: deleteUserVoteGame은 양쪽에서, deleteUserVoteIndex는 유저의 날짜 목록을 먼저 읽어 해당 날짜 미러만 정리
- database.rules.json에 userVotesByDate·userVotesByDateMeta를 read/write false로 추가 — 교차 유저 데이터라 서버 전용
- 백필 스크립트 추가(npm run backfill:vote-index). dry-run 기본, --apply로 500건씩 청킹 기록, 멱등. 완료 시 /userVotesByDateMeta/backfilledAt 마커를 남겨 잡이 원본 스캔을 그만두는 근거로 쓴다
- 미러 정합성 테스트 8건 추가
44 lines
744 B
JSON
44 lines
744 B
JSON
{
|
|
"rules": {
|
|
"votes": {
|
|
"$gameId": {
|
|
".read": "auth != null",
|
|
"counts": {
|
|
".read": true
|
|
},
|
|
".write": false
|
|
}
|
|
},
|
|
"userVotes": {
|
|
"$uid": {
|
|
".read": "auth != null && auth.uid == $uid",
|
|
".write": false
|
|
}
|
|
},
|
|
"userVotesByDate": {
|
|
".read": false,
|
|
".write": false
|
|
},
|
|
"userVotesByDateMeta": {
|
|
".read": false,
|
|
".write": false
|
|
},
|
|
"cache": {
|
|
".read": false,
|
|
".write": false
|
|
},
|
|
"chatUsage": {
|
|
".read": false,
|
|
".write": false
|
|
},
|
|
"nicknames": {
|
|
".read": false,
|
|
".write": false
|
|
},
|
|
"userNicknames": {
|
|
".read": false,
|
|
".write": false
|
|
}
|
|
}
|
|
}
|