저장 복구 영수증 조회 계약 v1
Phase 2 S04·S05·S07의 구형 탭 후속 요청과 미러 복구가 서버의 확정 여부를 확인할 때 사용하는 읽기 전용 계약이다. 저장 요청을 재실행하거나 현재 세션을 읽어서 성공 여부를 추측하지 않는다.
호출과 권한
get_workout_recovery_receipt_v1(p_client_mutation_id uuid) → jsonb | null
authenticated호출에서auth.uid()를 owner로 사용한다.user_id매개변수는 없다.- 로그인 owner가 없으면
42501, mutation ID가 null이면22023으로 거부한다.anon은 함수 실행 권한이 없다. workout_mutation_receipts의(user_id, client_mutation_id)기본 키로 정확히 한 요청을 찾는다. 없는 요청과 타인 요청은 모두 SQL null을 반환한다.- 기존
get_session_mutation_receipt_v2(user_id, mutation_id, replayed)는 내부 함수로 유지하며 앱에 공개하지 않는다.
응답
| 필드 | 의미 |
|---|---|
contract_version | 항상 1. 저장 RPC의 영수증 v2와 별개의 복구 조회 계약이다. |
mutation_kind, client_mutation_id | 서버 장부에 커밋된 요청 종류와 정확한 식별자 |
session_id, source, source_ref | 커밋 당시 대상 식별자 |
request_hash, client_request_hash | 각각 서버와 클라이언트가 기록한 요청 hash. 다른 요청을 잘못 승인하지 않도록 클라이언트가 대조한다. |
server_revision, updated_at | 해당 커밋이 기록한 revision과 session timestamp |
stats_requested_version | 해당 커밋의 통계 요청 세대. 통계를 요청하지 않은 계획 작업의 0도 그대로 보존한다. |
committed_at, replayed | 장부의 커밋 시각과 항상 true인 조회 표시 |
children, set_scores | 각각 항상 [], {}. 현재 하위행·통계 내용을 의미하지 않는다. |
status와 현재 exercises 트리는 반환하지 않는다. 같은 세션이 후속 수정되거나 삭제돼도 원래 mutation의 응답 메타는 변하지 않는다. 삭제 영수증도 조회할 수 있으며, 삭제된 세션을 복원하거나 통계를 다시 요청하지 않는다.
소비자 규칙
- owner 수명과 정확한 mutation ID를 유지한 채 조회한다. 성공 응답은 종류·대상·hash까지 원래 요청과 대조한 뒤 채택한다.
- null은 요청이 아직 확정됐다는 증거가 없다는 뜻이다. 삭제·성공·실패를 추정하거나 원문을 지우는 근거로 쓰지 않는다.
- 네트워크·인증·서버 오류는 null로 바꿔 확정 결과처럼 다루지 않는다. 원문을 보존하고 기존 재시도/격리 정책을 적용한다.
- 이 조회는 현재 화면 상세를 공급하지 않는다. 확정 후 화면을 갱신할 때는 owner 범위 resource query와 revision 정책을 따른다.
검증은 supabase/tests/database/workout_recovery_receipt_v1.test.sql의 실제 저장·삭제 RPC 여정에서 실행한다. 완료·계획·삭제, owner 교차, 서로 다른 owner의 동일 mutation UUID, 익명 거부, 확정 메타의 안정성, 장부·세션·통계 무변경을 포함한다.
반영 순서
선택한 통합 대상의 최신 migration 꼬리에 번호를 맞춘 뒤 DB 함수·권한을 먼저 적용하고 이를 사용하는 클라이언트를 배포한다. migration은 함수 추가이며 기존 사용자 원본을 고치는 DML이 없다. 클라이언트를 이전 버전으로 되돌릴 때에도 이 읽기 전용 함수를 유지할 수 있다. 이 문서는 실제 운영 반영 또는 새 릴리스 브랜치 정책의 승인을 뜻하지 않는다.