Skip to content

feat(community): Try 포스트 백엔드 — parent_post_id, tries API, OpenAPI/Orval #24

@cocoyoon

Description

@cocoyoon

목표

FLW-08 스펙대로 Try 포스트를 DB·API·웹 훅까지 연결해, 포스트 상세의 Try 갤러리가 실데이터를 표시하게 한다.

#29 통합: 스팟 소유 자가신고 + 사진 리뷰를 별도 spot_reviews 테이블 대신 Try 포스트 + 스팟 태깅으로 통합. Try 생성 시 원본 포스트의 스팟(아이템)을 optional로 태깅할 수 있으며, 이를 통해 "이 아이템 갖고 있어요" 리뷰 역할도 겸함.

배경 / 현재 코드

구분 상태
packages/web/lib/hooks/useTries.ts fetchTries가 항상 { tries: [], total: 0 } 반환 (TODO 주석)
packages/api-server/src/entities/posts.rs parent_post_id, post_type 컬럼 없음
OpenAPI (packages/api-server/openapi.json) /posts/{id}/tries 경로 없음
스펙 specs/flows/FLW-08-my-try.md (컬럼·응답 JSON·엔드포인트 표)

구현 체크리스트

1) DB (Supabase 마이그레이션)

  • postsparent_post_id (UUID, FK → posts(id), ON DELETE SET NULL), post_type (varchar, default 'original', 값: original | try)
  • 인덱스: idx_posts_parent_post_id, idx_posts_post_type
  • try_spot_tags 테이블: (try_post_id, spot_id) PK, FK → posts/spots, ON DELETE CASCADE
  • 인덱스: idx_try_spot_tags_spot_id
  • 마이그레이션 등록: packages/api-server/migration/ + lib.rs

2) Rust (api-server)

  • entities/posts.rs 및 관련 DTO에 parent_post_id, post_type 컬럼 반영; Try는 별도 테이블 없이 posts 행으로 저장
  • try_spot_tags entity/DTO 추가
  • GET /api/v1/posts/{post_id}/triespost_type = try AND parent_post_id = post_id 목록, 스펙의 tries[] + total (+ 필요 시 cursor 페이지네이션)
  • (스펙에 있으면) GET /api/v1/posts/{post_id}/tries/count
  • GET /api/v1/spots/{spot_id}/tries — 특정 스팟을 태깅한 Try 목록 (스팟별 리뷰 조회)
  • 기존 포스트 생성 멀티파트 흐름에서 parent_post_id, post_type, spot_ids 파싱·저장 — Try 생성 시 try_spot_tags에도 insert
  • 목록/피드 정책: Try 포스트가 일반 탐색 그리드에 섞이면 안 되는지 제품 확인 후, list_posts 등에서 post_type != try 필터 여부 결정
  • utoipa / openapi.json 갱신

3) 웹

  • packages/api-server/openapi.json 커밋 후 cd packages/web && bun run generate:api
  • useTries.ts: 생성된 클라이언트로 실제 GET .../tries 호출
  • 응답 필드명이 스펙과 Rust 모델 불일치 시 어댑터 또는 API alias 명시

수용 기준 (Definition of Done)

  1. DB에 Try 행이 있으면 useTries(parentPostId)가 비어 있지 않은 목록을 반환한다.
  2. OpenAPI에 tries 관련 path가 등록되고, 웹에서 수동 편집 없이 생성 훅/함수로 호출 가능하다.
  3. Try 전용 업로드 UI는 feat(community): Try 업로드 페이지 /request/try 및 CTA 라우트 정합 #25와 함께 E2E로 원본 포스트로 돌아왔을 때 갤러리가 갱신된다(쿼리 invalidate).
  4. 스팟 태깅된 Try는 GET /api/v1/spots/{spotId}/tries로 조회 가능하다.

의존 / 관련 이슈

참고 파일

  • specs/flows/FLW-08-my-try.md
  • packages/api-server/src/domains/posts/
  • packages/web/lib/components/detail/TryGallerySection.tsx

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type
No fields configured for issues without a type.

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions