Skip to content

저장 복구 영수증 조회 계약 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의 응답 메타는 변하지 않는다. 삭제 영수증도 조회할 수 있으며, 삭제된 세션을 복원하거나 통계를 다시 요청하지 않는다.

소비자 규칙

  1. owner 수명과 정확한 mutation ID를 유지한 채 조회한다. 성공 응답은 종류·대상·hash까지 원래 요청과 대조한 뒤 채택한다.
  2. null은 요청이 아직 확정됐다는 증거가 없다는 뜻이다. 삭제·성공·실패를 추정하거나 원문을 지우는 근거로 쓰지 않는다.
  3. 네트워크·인증·서버 오류는 null로 바꿔 확정 결과처럼 다루지 않는다. 원문을 보존하고 기존 재시도/격리 정책을 적용한다.
  4. 이 조회는 현재 화면 상세를 공급하지 않는다. 확정 후 화면을 갱신할 때는 owner 범위 resource query와 revision 정책을 따른다.

검증은 supabase/tests/database/workout_recovery_receipt_v1.test.sql의 실제 저장·삭제 RPC 여정에서 실행한다. 완료·계획·삭제, owner 교차, 서로 다른 owner의 동일 mutation UUID, 익명 거부, 확정 메타의 안정성, 장부·세션·통계 무변경을 포함한다.

반영 순서

선택한 통합 대상의 최신 migration 꼬리에 번호를 맞춘 뒤 DB 함수·권한을 먼저 적용하고 이를 사용하는 클라이언트를 배포한다. migration은 함수 추가이며 기존 사용자 원본을 고치는 DML이 없다. 클라이언트를 이전 버전으로 되돌릴 때에도 이 읽기 전용 함수를 유지할 수 있다. 이 문서는 실제 운영 반영 또는 새 릴리스 브랜치 정책의 승인을 뜻하지 않는다.