feat(user): 리뷰 작성 가능 주문 아이템 목록(myReviewableOrderItems) - #188
Conversation
figma 마이페이지 리뷰 탭(MyPage_Review_Tab) '리뷰 남기기' 목록 대응. 기존에는 myOrders.hasReviewableItem + myOrder.canWriteReview 조합으로만 접근 가능해 아이템 플랫 목록·탭 카운트를 구할 수 없었다. - SDL user-review.graphql에 myReviewableOrderItems(input): MyReviewableOrderItemConnection! 추가 (totalCount = '리뷰 남기기 N' 탭 카운트) - 판정 조건은 기존 canWriteReview/findReviewableOrderIds와 동일: 픽업 완료(PICKED_UP) + 활성 리뷰 미존재(soft-delete 리뷰는 재작성 가능). 삭제된 주문 제외(nested soft-delete 가드 명시) - 카드 필드: orderItemId(writeReview 입력용)·productId·케이크명 스냅샷· 대표 이미지·매장명·지역 표기(buildRegionLabel 재사용)·pickedUpAt - 정렬은 픽업 최신순(picked_up_at desc, id desc). offset 페이지네이션 - OrderRepository.listReviewableOrderItems 추가, UserReviewService에서 조합 회귀 테스트 6건: 픽업 최신순·카운트, 카드 매핑, 활성 리뷰 제외·soft-delete 리뷰 재포함, 비픽업·삭제 주문·타인 주문 제외, offset/hasMore, resolver 통합 1건(작성 후 목록에서 빠짐).
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🧹 knip — dead-code 리포트전체 리포트
|
🩺 NestJS Doctor — 89/100 (Good)진단 277건 (error 0).
architecture / security 상위 항목
|
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
Coverage report
Test suite run success1552 tests passing in 182 suites. Report generated by 🧪jest coverage report action from 1935739 |
배경
마이페이지 리뷰 탭의 '리뷰 남기기' 목록에 대응하는 조회 API가 없었다.
기존 수단은 두 가지뿐이다.
myOrders의hasReviewableItem은 주문 단위 불리언이고, 아이템 단위canWriteReview는myOrder상세를 열어야 나온다.이 조합으로 화면을 만들면 주문 수만큼 상세 조회가 따라붙고, 탭 카운트("리뷰 남기기 2")는 구할 방법이 없다.
그래서 작성 가능 아이템을 아이템 단위 플랫 목록으로 주는 쿼리를 추가했다.
변경 내용
myReviewableOrderItems(input): MyReviewableOrderItemConnection!— 로그인 필수.totalCount가 그대로 탭 카운트다.orderItemId,productId, 케이크명(주문 시점 스냅샷), 대표 이미지, 매장명,regionLabel,pickedUpAt.orderItemId는 "리뷰 작성" 버튼에서writeReview입력으로 그대로 쓴다.picked_up_at desc, 동률 시id desc). 방금 받은 케이크가 위로 온다."작성 가능" 판정은 새로 정의하지 않았다. 기존
canWriteReview/findReviewableOrderIds와 같은 기준이다 — 픽업 완료(PICKED_UP) + 활성 리뷰 없음.리뷰를 삭제하면 soft-delete만 되므로 그 아이템은 이 목록에 다시 나타난다.
writeReview의 create-or-restore 동작과 짝이 맞는다.비활성 상품·매장의 건도 목록에 남긴다. 이미 픽업까지 끝난 주문의 리뷰 권리는 현재 판매 여부와 무관해서다.
구현은
OrderRepository.listReviewableOrderItems(목록 + count 단일 트랜잭션)와UserReviewService의 매핑이다. 지역 표기는 매장 카드들과 같은buildRegionLabel을 재사용한다.남겨둔 것
새 쿼리에는
order.deleted_at IS NULL을 명시했다. soft-delete extension이 nested relation 필터에는 닿지 않기 때문이다.같은 가드가 기존
findReviewableOrderIds에는 없는데, 그쪽은 이미 조회된(=삭제되지 않은) 주문 id 집합을 입력받는 구조라 실해가 없어 손대지 않았다.테스트
real DB 6건을 추가했다. 픽업 최신순·카운트, 카드 필드 매핑, 리뷰 삭제 후 재포함, 비픽업·삭제 주문·타인 주문 제외, offset/hasMore 경계, 그리고 조회 → 작성 → 목록에서 빠지는 통합 흐름 1건.
yarn validate통과.