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()) + } +}