Sequence Diagrams
Sequence Diagrams
1. 사용자 탐색(모바일/웹 공통)
User -> Client: 앱/웹 열기
Client -> Location: 현재 위치 요청(웹은 fallback 가능)
Client -> Supabase RPC: public_get_nearby_slots(center, filters)
Supabase RPC -> Postgres: slots view/query
Postgres -> Supabase RPC: 결과 반환
Supabase RPC -> Client: slot summaries
Client -> User: 리스트/필터 화면 표시2. 확보(Reservation 생성)
User -> Client: 슬롯 상세에서 "확보"
Client -> Supabase RPC: rpc_create_reservation(slotId)
Supabase RPC -> Postgres:
- user RESERVED 중복 검사(UNIQUE partial)
- penalty 차단/override 검사
- reservation 생성(status=RESERVED)
- expiresAt = slot.startAt + grace
Postgres -> Supabase RPC: reservation 반환
Supabase RPC -> Client: reservation(expiresAt 포함)
Client -> User: Reserved 화면(서버 기반 타이머)3. 사용 확정(REDEEMED 확정 + 수량 차감)
User -> Client: "도착 체크인"
Client -> Location: 최신 위치 1회 갱신
Client -> Supabase RPC: rpc_redeem(reservationId, location)
Supabase RPC -> Postgres (transaction):
- reservation 상태/만료 검사(serverNow < expiresAt)
- 위치/정확도/반경 검사
- slot.remainingQuantity > 0 검사
- reservation -> REDEEMED
- slot.remainingQuantity -= 1
Postgres -> Supabase RPC: updated reservation + slot
Supabase RPC -> Client: 결과 반환
Client -> User: REDEEMED 상태 표시4. 만료(EXPIRED) 확정(조회 기반)
Client -> Supabase RPC: get_reservation(reservationId)
Supabase RPC -> Postgres:
- if status=RESERVED and serverNow >= expiresAt then EXPIRED 확정
- (선택) penalty 평가 트리거
Postgres -> Supabase RPC: updated reservation
Supabase RPC -> Client: 결과 반환
Client -> User: 만료 안내 + 홈 복귀5. 가맹점 구독 결제(웹)
Merchant -> Merchant Web: 구독 시작
Merchant Web -> Stripe Checkout: 결제 세션 생성/이동
Stripe -> Merchant: 결제 완료
Stripe -> Webhook Endpoint: subscription event
Webhook -> Supabase: subscriptions/merchants 업데이트
Merchant Web -> Supabase: 구독 상태 조회
Supabase -> Merchant Web: plan/status 반환