트로피 자동 수여 보완 설계
목표
사용자가 어떤 트로피 조건을 만족하는 순간 자동으로 업적을 수여한다. 전체 재계산은 과거 누락 복구용으로만 유지하며, 정상적인 신규 조건 달성에는 필요하지 않다.
문제와 해결
실제 참석 트로피는 참석자 확정 시점에만 판정된다. 확정이 일정 마감 전이면 집계에서 제외되고, 이후 마감 때 재판정하지 않아 누락된다.
posts/{postId} 변경 시 다음 두 경우 모두 같은 참석자 재판정을 실행한다.
confirmedAttendees가 변경된 경우: 마감된 일정이면 현재 확정 참석자를 판정한다.- 이벤트가 마감되는 경우: 이미 확정된 참석자 전원을 다시 판정한다.
두 조건이 한 번의 쓰기에서 함께 일어나도 uid를 중복 없이 처리한다. 마감 전에는 수여하지 않으며, 마감 후에는 확정과 마감의 순서와 무관하게 수여한다.
자동 수여 범위
stats/global변경: 출석, 일정 등록, 만석, 평점, 온도 트로피posts확정/마감 변경: 불참 없이 참석, 주말 개근, 5일 연속 참여parties변경: 파티 플래너users.annualMember변경: 연회원 가입game_scores/suika_scores변경: 각 게임 전체 1위
모든 기록은 기존 awardTrophies를 통해 신규 id만 추가한다. 업적은 회수하지 않는다.
검증
- 마감 전 확정 후 마감, 마감 후 확정 모두 참석 트로피 재판정 대상이 된다.
- 같은 이벤트 쓰기에서 중복 uid를 한 번만 처리한다.
- 마감되지 않은 이벤트는 실제 참석 트로피에 포함되지 않는다.
- 각 자동 수여 트리거의 판정 조건을 순수 함수 테스트로 회귀 보호한다.