From 1c961803e0e260f3fd97d664ac22fcf76887d0bb Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 7 Sep 2025 21:29:27 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B2=B0=EC=A0=9C=20=EC=8A=B9=EC=9D=B8?= =?UTF-8?q?=20/=20=EC=B7=A8=EC=86=8C=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/payment/docs/PaymentAPI.kt | 35 +++++++++++++++++ .../payment/web/PaymentController.kt | 39 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/main/kotlin/roomescape/payment/docs/PaymentAPI.kt create mode 100644 src/main/kotlin/roomescape/payment/web/PaymentController.kt diff --git a/src/main/kotlin/roomescape/payment/docs/PaymentAPI.kt b/src/main/kotlin/roomescape/payment/docs/PaymentAPI.kt new file mode 100644 index 00000000..98633997 --- /dev/null +++ b/src/main/kotlin/roomescape/payment/docs/PaymentAPI.kt @@ -0,0 +1,35 @@ +package roomescape.payment.docs + +import io.swagger.v3.oas.annotations.Operation +import io.swagger.v3.oas.annotations.Parameter +import io.swagger.v3.oas.annotations.responses.ApiResponse +import io.swagger.v3.oas.annotations.responses.ApiResponses +import jakarta.validation.Valid +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestParam +import roomescape.auth.web.support.LoginRequired +import roomescape.auth.web.support.MemberId +import roomescape.common.dto.response.CommonApiResponse +import roomescape.payment.web.PaymentCancelRequest +import roomescape.payment.web.PaymentConfirmRequest +import roomescape.payment.web.PaymentCreateResponse + +interface PaymentAPI { + + @LoginRequired + @Operation(summary = "결제 승인", tags = ["로그인이 필요한 API"]) + @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) + fun confirmPayment( + @RequestParam(required = true) reservationId: Long, + @Valid @RequestBody request: PaymentConfirmRequest + ): ResponseEntity> + + @LoginRequired + @Operation(summary = "결제 취소", tags = ["로그인이 필요한 API"]) + @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) + fun cancelPayment( + @MemberId @Parameter(hidden = true) memberId: Long, + @Valid @RequestBody request: PaymentCancelRequest + ): ResponseEntity> +} diff --git a/src/main/kotlin/roomescape/payment/web/PaymentController.kt b/src/main/kotlin/roomescape/payment/web/PaymentController.kt new file mode 100644 index 00000000..9e3dc906 --- /dev/null +++ b/src/main/kotlin/roomescape/payment/web/PaymentController.kt @@ -0,0 +1,39 @@ +package roomescape.payment.web + +import io.swagger.v3.oas.annotations.Parameter +import jakarta.validation.Valid +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController +import roomescape.auth.web.support.MemberId +import roomescape.common.dto.response.CommonApiResponse +import roomescape.payment.business.PaymentService +import roomescape.payment.docs.PaymentAPI + +@RestController +class PaymentController( + private val paymentService: PaymentService +) : PaymentAPI { + + @PostMapping("/payments") + override fun confirmPayment( + @RequestParam(required = true) reservationId: Long, + @Valid @RequestBody request: PaymentConfirmRequest + ): ResponseEntity> { + val response = paymentService.confirm(reservationId, request) + + return ResponseEntity.ok(CommonApiResponse(response)) + } + + @PostMapping("/payments/cancel") + override fun cancelPayment( + @MemberId @Parameter(hidden = true) memberId: Long, + @Valid @RequestBody request: PaymentCancelRequest + ): ResponseEntity> { + paymentService.cancel(memberId, request) + + return ResponseEntity.ok(CommonApiResponse()) + } +}