Skip to content

chore: 릴리즈 — 내 주문 목록 할인율·매장 지역 - #552

Merged
chanwoo7 merged 3 commits into
mainfrom
develop
Nov 2, 2026
Merged

chanwoo7 merged 3 commits into
mainfrom
develop

Conversation

@chanwoo7

@chanwoo7 chanwoo7 commented Nov 2, 2026 •

Copy link
Copy Markdown
Member

마이페이지 주문상황 화면 카드에 쓸 할인율과 매장 지역 값을 운영에 반영합니다.

  • feat: 내 주문 목록에 할인율·매장 지역 추가 #551 내 주문 목록에 할인율·매장 지역 추가
    • MyOrderSummary에 discountRate: Int!(주문 기준 할인 금액 ÷ 할인 전 합계, 할인이 없으면 0)와 regionLabel: String(주문 시점 매장 지역 표기)을 추가했습니다.
    • 지역은 order_item.store_region_label_snapshot에 주문 생성 때 저장합니다.
    • 할인율 계산 함수 calcDiscountRate를 src/common/utils로 옮겼습니다(동작 변화 없음).

운영 반영 사항입니다.

  • 마이그레이션 1건(20261102144339_order_item_region_label_snapshot)이 적용됩니다.
    • order_item에 nullable 컬럼을 하나 추가합니다.
    • 기존 품목은 현재 매장 주소·지역으로 채우는 UPDATE가 함께 돕니다.
  • SDL은 필드를 추가만 하므로 FE 파괴적 변경은 없습니다.
  • 시크릿 변경은 없습니다.

Summary by CodeRabbit

  • 새로운 기능
    • 내 주문 목록에 주문 할인율이 표시됩니다. 할인율은 할인 전 금액과 할인액을 기준으로 계산되며, 할인 금액이 없거나 할인 전 금액이 0이면 0%로 표시됩니다.
    • 내 주문 목록에 매장 지역 표기가 추가됩니다. 주문 당시의 주소 정보를 바탕으로 시·동 또는 지역명을 표시하며, 정보가 없으면 비워 둡니다.
  • 개선 사항
    • 할인율 계산 결과가 상품 및 주문 화면에서 일관되게 제공됩니다.

- calcDiscountRate를 product-storefront-mappers.helper에서 common/utils/discount-rate로 옮김.
  주문 목록도 같은 규칙을 쓰게 돼 buildRegionLabel처럼 공용 표시 규칙으로 둠.
- product 쪽 import 3곳 변경, spec은 it.each 표로 옮김(7케이스).
FE 마이페이지 주문상황 카드("매장명 · 지역", "할인율 % 금액")에 쓸 값이 MyOrderSummary에 없었음.

- 할인율: 주문 기준 discount_price ÷ subtotal_price 반올림(0~100, 할인 없으면 0).
  옆에 붙는 금액이 주문 총액이라 숫자를 맞춤. 옵션 추가금은 할인 대상이 아니라 옵션 주문은 상품 카드 할인율보다 낮게 나옴.
- 지역: order_item.store_region_label_snapshot(nullable) 추가, 주문 생성 때 buildRegionLabel로 저장.
  매장 실시간 조인은 read-boundary 허용 목록(Order.items.store.region)을 늘려 스냅샷으로 감.
  - 마이그레이션 백필은 현재 매장 기준 같은 규칙. 빈 값 판정은 CHAR_LENGTH(NULLIF는 PAD SPACE로 공백값까지 비움).
  - ProductRepository.findProductDetailById의 store select에 주소·지역 추가(Product·Store·Region 모두 catalog라 경계 항목 증가 없음).
- SDL: MyOrderSummary.discountRate: Int!, regionLabel: String (필드 추가만, FE 파괴적 변경 없음).
- 팩토리 createOrderItem은 미지정 시 생성 경로 규칙으로 지역 스냅샷을 채움.
- 시드 o1·o4: p1(정가 40,000·판매가 35,000)인데 subtotal 35,000/discount 0이던 것을 생성 경로 규칙(40,000/5,000)으로 맞춤.

테스트 17건 추가
- order-my.service: discountRate 4(옵션 포함·subtotal 0 반증), regionLabel 2(주문 뒤 매장 주소 변경 반증)
- order-checkout.service: 지역 스냅샷 3(시·동 / 지역명 / null)
- 백필 migration spec 8: buildRegionLabel과 결과 비교, 공백값 케이스는 NULLIF 버전에서 실패하는 것 확인
- order-my.resolver: 전체 경로 단언에 두 필드
feat: 내 주문 목록에 할인율·매장 지역 추가
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-02T15:08:32.748452Z 87f1e70 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@coderabbitai

coderabbitai Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Findings

Actionable comments posted: 2

Caution

Review failed

The pull request is closed.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 19c5189 and 87f1e70.

Files selected for processing: 22
  • prisma/migrations/20261102144339_order_item_region_label_snapshot/migration.sql
  • prisma/schema.prisma
  • prisma/seed/orders.ts
  • src/common/utils/discount-rate.spec.ts
  • src/common/utils/discount-rate.ts
  • src/features/order/order-my.graphql
  • src/features/order/repositories/order-item-region-label-snapshot.migration.spec.ts
  • src/features/order/repositories/order.repository.spec.ts
  • src/features/order/repositories/order.repository.ts
  • src/features/order/resolvers/order-my.resolver.spec.ts
  • src/features/order/services/order-checkout.service.spec.ts
  • src/features/order/services/order-checkout.service.ts
  • src/features/order/services/order-my.service.spec.ts
  • src/features/order/services/order-my.service.ts
  • src/features/order/types/order-my-output.type.ts
  • src/features/product/repositories/product.repository.ts
  • src/features/product/services/product-card.service.ts
  • src/features/product/services/product-detail-mappers.helper.ts
  • src/features/product/services/product-review-mappers.helper.ts
  • src/features/product/services/product-storefront-mappers.helper.spec.ts
  • src/features/product/services/product-storefront-mappers.helper.ts
  • src/test/factories/order.factory.ts
Files with no reviewable changes: 1
  • src/features/product/services/product-storefront-mappers.helper.ts

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

Walkthrough

주문 품목에 주문 시점의 매장 지역 표기를 저장하고, 주문 요약에 할인율과 nullable 지역 표기를 추가합니다. 할인율 계산을 공통 유틸리티로 옮기고, 상품 상세 조회의 매장 정보에 주소와 지역명을 포함합니다.

Changes: 주문 요약 및 지역 스냅샷

Layer / File(s) Summary
지역 스냅샷 저장 구조 및 백필
prisma/schema.prisma, prisma/migrations/.../migration.sql, src/features/order/repositories/order-item-region-label-snapshot.migration.spec.ts
OrderItem에 nullable 지역 표기 스냅샷 컬럼을 추가합니다. 기존 주문 품목의 스냅샷을 매장 주소와 지역명으로 백필하며, 주소 및 지역 상태별 결과를 DB 테스트로 검증합니다.
주문 생성 시 지역 스냅샷 저장
src/features/order/services/order-checkout.service.ts, src/features/order/repositories/order.repository.ts, src/test/factories/order.factory.ts, prisma/seed/orders.ts, 관련 테스트
체크아웃이 매장 지역 표기를 주문 품목에 전달하고 저장합니다. 시드 데이터, 테스트 팩토리와 테스트도 스냅샷 값을 처리합니다.
주문 요약 할인율 및 지역 표기
src/common/utils/discount-rate*, src/features/order/order-my.graphql, src/features/order/services/order-my.service.ts, src/features/order/types/order-my-output.type.ts, src/features/product/services/*
할인율 계산을 공통 유틸리티로 추가하고 상품 서비스의 사용처를 옮깁니다. 주문 요약은 할인율과 저장된 지역 표기를 반환하며 관련 테스트가 계산 및 null 처리를 확인합니다.

상품 상세 매장 위치 정보

Layer / File(s) Summary
상품 상세 매장 조회 확장
src/features/product/repositories/product.repository.ts
상품 상세 조회 결과의 매장 정보에 시·동네 주소와 지역명을 추가합니다.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant OrderCheckoutService
  participant buildRegionLabel
  participant OrderRepository
  participant order_item
  OrderCheckoutService->>buildRegionLabel: 매장 주소와 지역으로 표기 생성
  buildRegionLabel-->>OrderCheckoutService: 지역 표기 반환
  OrderCheckoutService->>OrderRepository: 지역 스냅샷 전달
  OrderRepository->>order_item: 스냅샷 저장
Loading
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

Share

@codecov

codecov Bot commented Nov 2, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown

🧹 knip — dead-code 리포트

요약 항목 없음
전체 리포트
(knip 출력 없음 — 이슈 0이거나 실행 실패)

청소 후보(오탐 가능) · 기준 docs/guide/architecture-conventions.md

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown

🩺 NestJS Doctor — 90/100 (Excellent)

진단 493건 (error 13).

Category error warning info
architecture 1 1 44
correctness 0 269 0
performance 0 41 28
schema 0 0 76
security 12 21 0
architecture / security 상위 항목
  • error security/security/no-hardcoded-secrets: Variable 'SEED_PASSWORD' appears to contain a hardcoded secret.
  • error architecture/architecture/no-manual-instantiation: Manual instantiation of 'OutboxRepository' detected. Use dependency injection instead.
  • info architecture/architecture/no-barrel-export-internals: Barrel file re-exports internal type 'IAuditLogRepository'.
  • warning security/security/no-exposed-env-vars: Direct 'process.env.NODE_ENV' access in 'AuthController'. Use ConfigService instead.
  • warning security/security/require-guards-on-endpoints: Endpoint 'start' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'callback' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'refresh' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'logout' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'sellerLogin' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'sellerRefresh' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'sellerLogout' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'devIssueToken' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'adminLogin' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'adminRefresh' has no @UseGuards() at class or method level.
  • warning security/security/require-guards-on-endpoints: Endpoint 'adminLogout' has no @UseGuards() at class or method level.

오탐 포함 가능 · 기준 docs/guide/architecture-conventions.md

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown

Coverage report

St.❔
Category Percentage Covered / Total
🟢 Statements
98.02% (+0% 🔼)
10814/11032
🟢 Branches
92.97% (+0% 🔼)
4126/4438
🟢 Functions 97.56% 2157/2211
🟢 Lines
98.6% (+0% 🔼)
9837/9977
Show new covered files 🐣
St.❔
File Statements Branches Functions Lines
🟢
... / discount-rate.ts
100% 100% 100% 100%

Test suite run success

4352 tests passing in 391 suites.

Report generated by 🧪jest coverage report action from 87f1e70

@chanwoo7
chanwoo7 merged commit 130b831 into main Nov 2, 2026
26 of 27 checks passed
@chanwoo7
chanwoo7 deleted the develop branch November 2, 2026 15:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant