Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,18 +48,24 @@ public class OrderDelivery {
@Column(name = "delivery_tip", nullable = false, updatable = false)
private Integer deliveryTip;

@NotNull
@Column(name = "provide_cutlery", nullable = false, updatable = false, columnDefinition = "TINYINT(1)")
private Boolean provideCutlery;

@Builder
public OrderDelivery(
Order order,
String address,
String toOwner,
String toRider,
Boolean provideCutlery,
Integer deliveryTip
) {
this.order = order;
this.address = address;
this.toOwner = toOwner;
this.toRider = toRider;
this.provideCutlery = provideCutlery;
this.deliveryTip = deliveryTip;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,18 @@ public class OrderTakeout {
@Column(name = "to_owner", length = 50, updatable = false)
private String toOwner;

@NotNull
@Column(name = "provide_cutlery", nullable = false, updatable = false, columnDefinition = "TINYINT(1)")
private Boolean provideCutlery;

@Builder
private OrderTakeout(
Order order,
String toOwner
String toOwner,
Boolean provideCutlery
) {
this.order = order;
this.toOwner = toOwner;
this.provideCutlery = provideCutlery;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package in.koreatech.koin.domain.order.repository;

import java.util.List;

import org.springframework.data.repository.Repository;

import in.koreatech.koin.domain.order.model.OrderMenu;

public interface OrderMenuRepository extends Repository<OrderMenu, Integer> {

void saveAll(Iterable<OrderMenu> orderMenus);

List<OrderMenu> findAllByOrderId(String orderId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,11 @@ default Payment getByPaymentKey(String paymentKey) {
return findByPaymentKey(paymentKey)
.orElseThrow(() -> PaymentNotFoundException.withDetail("paymentKey : " + paymentKey));
}

Optional<Payment> findById(Integer id);

default Payment getById(Integer id) {
return findById(id)
.orElseThrow(() -> PaymentNotFoundException.withDetail("id : " + id));
}
}
10 changes: 10 additions & 0 deletions src/main/java/in/koreatech/payment/controller/PaymentsApi.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package in.koreatech.payment.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
Expand All @@ -13,6 +14,7 @@
import in.koreatech.payment.dto.request.TemporaryTakeoutPaymentSaveRequest;
import in.koreatech.payment.dto.response.PaymentCancelResponse;
import in.koreatech.payment.dto.response.PaymentConfirmResponse;
import in.koreatech.payment.dto.response.PaymentResponse;
import in.koreatech.payment.dto.response.TemporaryPaymentResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
Expand Down Expand Up @@ -172,4 +174,12 @@ ResponseEntity<PaymentCancelResponse> cancelPayment(
@RequestBody @Valid final PaymentCancelRequest request,
@AccessToken final String accessToken
);

@Operation(summary = "결제 단건 조회를 한다.")
@GetMapping("/{paymentId}")
ResponseEntity<PaymentResponse> getPayment(
@Parameter(description = "결제 고유 ID", example = "1")
@PathVariable(value = "paymentId") final Integer paymentId,
@AccessToken final String accessToken
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
import java.util.List;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import in.koreatech.koin.domain.order.model.Payment;
import in.koreatech.koin.domain.order.model.PaymentCancel;
import in.koreatech.payment.common.auth.AccessToken;
import in.koreatech.payment.dto.request.PaymentCancelRequest;
Expand All @@ -18,6 +18,7 @@
import in.koreatech.payment.dto.request.TemporaryTakeoutPaymentSaveRequest;
import in.koreatech.payment.dto.response.PaymentCancelResponse;
import in.koreatech.payment.dto.response.PaymentConfirmResponse;
import in.koreatech.payment.dto.response.PaymentResponse;
import in.koreatech.payment.dto.response.TemporaryPaymentResponse;
import in.koreatech.payment.service.PaymentService;
import jakarta.validation.Valid;
Expand Down Expand Up @@ -71,4 +72,13 @@ public ResponseEntity<PaymentCancelResponse> cancelPayment(
PaymentCancelResponse response = PaymentCancelResponse.from(paymentCancels);
return ResponseEntity.ok(response);
}

@GetMapping("/{paymentId}")
public ResponseEntity<PaymentResponse> getPayment(
@PathVariable(value = "paymentId") final Integer paymentId,
@AccessToken final String accessToken
) {
PaymentResponse response = paymentService.getPayment(accessToken, paymentId);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ public record TemporaryDeliveryPaymentSaveRequest(
@NotNull(message = "배달 팁은 필수 입력사항입니다.")
Integer deliveryTip,

@Schema(description = "수저, 포크 수령 여부", example = "true", requiredMode = REQUIRED)
@NotNull(message = "수저, 포크 수령 여부는 필수 입력사항입니다.")
Boolean provideCutlery,

@Schema(description = "결제 금액", example = "10000", requiredMode = REQUIRED)
@NotNull(message = "결제 금액은 필수 입력사항입니다.")
Integer totalAmount
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ public record TemporaryTakeoutPaymentSaveRequest(
@Schema(description = "사장님에게", example = "리뷰 이벤트 감사합니다.", requiredMode = NOT_REQUIRED)
String toOwner,

@Schema(description = "수저, 포크 수령 여부", example = "true", requiredMode = REQUIRED)
@NotNull(message = "수저, 포크 수령 여부는 필수 입력사항입니다.")
Boolean provideCutlery,

@Schema(description = "메뉴 총 금액", example = "1234", requiredMode = REQUIRED)
@NotNull(message = "메뉴 총 금액은 필수 입력사항입니다.")
Integer totalMenuPrice,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ public record PaymentConfirmResponse(
@Schema(description = "라이더에게", example = "문 앞에 놔주세요.", requiredMode = NOT_REQUIRED)
String toRider,

@Schema(description = "수저, 포크 수령 여부", example = "true", requiredMode = REQUIRED)
Boolean provideCutlery,

@Schema(description = "결제 금액", example = "1000", requiredMode = REQUIRED)
Integer amount,

Expand Down Expand Up @@ -118,15 +121,18 @@ public static PaymentConfirmResponse of(
String deliveryAddress = null;
String toOwner = null;
String toRider = null;
Boolean provideCutlery = null;

if (order.getOrderType() == DELIVERY) {
OrderDelivery delivery = order.getOrderDelivery();
deliveryAddress = delivery.getAddress();
toOwner = delivery.getToOwner();
toRider = delivery.getToRider();
provideCutlery = delivery.getProvideCutlery();
} else if (order.getOrderType() == TAKE_OUT) {
OrderTakeout takeout = order.getOrderTakeout();
toOwner = takeout.getToOwner();
provideCutlery = takeout.getProvideCutlery();
}

return new PaymentConfirmResponse(
Expand All @@ -135,6 +141,7 @@ public static PaymentConfirmResponse of(
shop.getAddress(),
toOwner,
toRider,
provideCutlery,
payment.getAmount(),
shop.getName(),
orderMenus.stream()
Expand Down
156 changes: 156 additions & 0 deletions src/main/java/in/koreatech/payment/dto/response/PaymentResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package in.koreatech.payment.dto.response;

import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy;
import static in.koreatech.koin.domain.order.model.OrderType.DELIVERY;
import static in.koreatech.koin.domain.order.model.OrderType.TAKE_OUT;
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED;
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import in.koreatech.koin.domain.order.model.Order;
import in.koreatech.koin.domain.order.model.OrderDelivery;
import in.koreatech.koin.domain.order.model.OrderMenu;
import in.koreatech.koin.domain.order.model.OrderMenuOption;
import in.koreatech.koin.domain.order.model.OrderTakeout;
import in.koreatech.koin.domain.order.model.Payment;
import in.koreatech.koin.domain.order.shop.model.entity.shop.OrderableShop;
import in.koreatech.koin.domain.shop.model.shop.Shop;
import io.swagger.v3.oas.annotations.media.Schema;

@JsonNaming(value = SnakeCaseStrategy.class)
public record PaymentResponse(
@Schema(description = "결제 고유 id", example = "1", requiredMode = REQUIRED)
Integer id,

@Schema(description = "배달 주소", example = "충청남도 천안시 동남구 병천면 충절로 1600 은솔관 422호", requiredMode = NOT_REQUIRED)
String deliveryAddress,

@Schema(description = "가게 주소", example = "충청남도 천안시 동남구 병천면 충절로 1600 은솔관 422호", requiredMode = NOT_REQUIRED)
String shopAddress,

@Schema(description = "사장님에게", example = "리뷰 이벤트 감사합니다.", requiredMode = NOT_REQUIRED)
String toOwner,

@Schema(description = "라이더에게", example = "문 앞에 놔주세요.", requiredMode = NOT_REQUIRED)
String toRider,

@Schema(description = "수저, 포크 수령 여부", example = "true", requiredMode = REQUIRED)
Boolean provideCutlery,

@Schema(description = "결제 금액", example = "1000", requiredMode = REQUIRED)
Integer amount,

@Schema(description = "상점 이름", example = "굿모닝 살로만 치킨", requiredMode = REQUIRED)
String shopName,

@Schema(description = "주문 메뉴 목록", requiredMode = REQUIRED)
List<InnerCartItemResponse> menus,

@Schema(description = "주문 방법", example = "DELIVERY", requiredMode = REQUIRED)
String orderType,

@Schema(description = "결제 요청 일시", example = "2025.06.21 21:00", requiredMode = REQUIRED)
@JsonFormat(pattern = "yyyy.MM.dd HH:mm")
LocalDateTime requestedAt,

@Schema(description = "결제 승인 일시", example = "2025.06.21 21:00", requiredMode = REQUIRED)
@JsonFormat(pattern = "yyyy.MM.dd HH:mm")
LocalDateTime approvedAt,

@Schema(description = "결제 수단", example = "카드", requiredMode = REQUIRED)
String paymentMethod
) {

@JsonNaming(value = SnakeCaseStrategy.class)
public record InnerCartItemResponse(
@Schema(description = "메뉴 이름", example = "허니콤보", requiredMode = REQUIRED)
String name,

@Schema(description = "수량", example = "1", requiredMode = REQUIRED)
Integer quantity,

@Schema(description = "선택한 옵션 목록", requiredMode = NOT_REQUIRED)
List<InnerMenuOptionResponse> options
) {
public static InnerCartItemResponse from(OrderMenu orderMenu) {
List<InnerMenuOptionResponse> optionResponses = new ArrayList<>();

if (orderMenu.getOrderMenuOptions() != null && !orderMenu.getOrderMenuOptions().isEmpty()) {
optionResponses = orderMenu.getOrderMenuOptions().stream()
.map(InnerMenuOptionResponse::from)
.toList();
}

return new InnerCartItemResponse(
orderMenu.getMenuName(),
orderMenu.getQuantity(),
optionResponses
);
}
}

@JsonNaming(value = SnakeCaseStrategy.class)
public record InnerMenuOptionResponse(
@Schema(description = "옵션 그룹 이름", example = "소스 추가", requiredMode = NOT_REQUIRED)
String optionGroupName,
@Schema(description = "옵션 이름", example = "레드디핑 소스", requiredMode = REQUIRED)
String optionName
) {
public static InnerMenuOptionResponse from(OrderMenuOption orderMenuOption) {
return new InnerMenuOptionResponse(
orderMenuOption.getOptionGroupName(),
orderMenuOption.getOptionName()
);
}
}

public static PaymentResponse of(
Payment payment,
Order order,
List<OrderMenu> orderMenus
) {
OrderableShop orderableShop = order.getOrderableShop();
Shop shop = orderableShop.getShop();

String deliveryAddress = null;
String toOwner = null;
String toRider = null;
Boolean provideCutlery = null;

if (order.getOrderType() == DELIVERY) {
OrderDelivery delivery = order.getOrderDelivery();
deliveryAddress = delivery.getAddress();
toOwner = delivery.getToOwner();
toRider = delivery.getToRider();
provideCutlery = delivery.getProvideCutlery();
} else if (order.getOrderType() == TAKE_OUT) {
OrderTakeout takeout = order.getOrderTakeout();
toOwner = takeout.getToOwner();
provideCutlery = takeout.getProvideCutlery();
}

return new PaymentResponse(
payment.getId(),
deliveryAddress,
shop.getAddress(),
toOwner,
toRider,
provideCutlery,
payment.getAmount(),
shop.getName(),
orderMenus.stream()
.map(InnerCartItemResponse::from)
.toList(),
order.getOrderType().name(),
payment.getRequestedAt(),
payment.getApprovedAt(),
payment.getPaymentMethod().getDisplayName()
);
}
}
Loading
Loading