장단콩 보드게임 & 미니어처 게임 클럽

게임 전체 1위 트로피 수여 복구 설계

목표

2048와 콩드랍의 전체 최고 기록 보유자에게 각각 game-2048-champion, suika-master 업적을 영구 수여한다. 현재 최고 기록자인데 누락된 회원도 소급 수여한다. 트로피는 회수하지 않는다.

정책

서버 판정

functions/index.jsonGameScoreUpdatedonSuikaScoreUpdated는 각각 game_scores/{uid}suika_scores/{uid} 변경 후 전체 컬렉션을 조회한다. 2048은 bestScore, 콩드랍은 best를 같은 정규화 구조({ uid, bestScore })로 변환한 뒤 isTopScorer에 전달한다. 최고점이면 기존 awardTrophies를 통해 신규 트로피만 users/{uid}.trophies{ id, earnedAt, seen: false }로 추가한다.

수정에서는 다음을 명확히 보강한다.

  1. 두 트리거가 최고점 갱신이 아닌 쓰기에서도 안전하게 동작하도록 공통 최고점 판정과 각 점수 스키마 변환을 순수 함수 테스트로 고정한다.
  2. 두 게임의 트리거가 동일한 영구 수여 정책을 따른다는 회귀 테스트를 추가한다.
  3. 트로피 문서 갱신 뒤 내 정보 페이지가 이미 사용하는 trophies 배열과 TROPHIES_META를 통해 해당 이미지를 잠금 없이 렌더링하는 경로는 변경하지 않는다.

소급 수여

관리자 통계 페이지의 기존 “트로피 소급 재계산”은 game_scoressuika_scores 전체를 읽어 각 게임 최고점자에게 후보 트로피를 계산한다. 이 기능을 실행해 현재 각 게임의 누락된 전체 1위(공동 1위 포함)에게 두 트로피를 추가한다. 기존 보유자는 newlyEarnedTrophyIds로 제외한다.

일회성 수동 데이터 편집이나 트로피 회수는 수행하지 않는다.

검증

범위 밖