Skip to content

Commit a680a2f

Browse files
Merge pull request #36 from DearObjet/feature/payment
[FEAT] 결제 내역 조회 기능 구현
2 parents 02c5e70 + ea987cc commit a680a2f

File tree

5 files changed

+112
-0
lines changed

5 files changed

+112
-0
lines changed

src/main/java/app/dearobjet/backend/domain/payment/PaymentController.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.springframework.security.core.annotation.AuthenticationPrincipal;
88
import org.springframework.web.bind.annotation.*;
99

10+
import java.time.LocalDate;
11+
1012
@RestController
1113
@RequiredArgsConstructor
1214
@RequestMapping("/api/v1")
@@ -41,4 +43,17 @@ public ApiResponse<Void> cancel(
4143
paymentService.cancelPayment(userDetails.getUserId(), paymentId, req);
4244
return ApiResponse.of(null);
4345
}
46+
47+
@GetMapping("/payments")
48+
public ApiResponse<PaymentListResponse> getPayments(
49+
@AuthenticationPrincipal CustomUserDetails userDetails,
50+
@RequestParam LocalDate from,
51+
@RequestParam LocalDate to,
52+
@RequestParam(defaultValue = "1") int page,
53+
@RequestParam(defaultValue = "20") int size
54+
) {
55+
return ApiResponse.of(
56+
paymentService.getPayments(userDetails.getUserId(), from, to, page, size)
57+
);
58+
}
4459
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
11
package app.dearobjet.backend.domain.payment;
22

33
import app.dearobjet.backend.domain.payment.entity.Payment;
4+
import org.springframework.data.domain.Page;
5+
import org.springframework.data.domain.Pageable;
46
import org.springframework.data.jpa.repository.JpaRepository;
57

8+
import java.time.LocalDateTime;
69
import java.util.Optional;
710

811
public interface PaymentRepository extends JpaRepository<Payment, Long> {
912
Optional<Payment> findByPaymentKey(String paymentKey);
13+
14+
Page<Payment> findByOrder_User_IdAndCreatedAtBetween(
15+
Long userId,
16+
LocalDateTime from,
17+
LocalDateTime to,
18+
Pageable pageable
19+
);
1020
}

src/main/java/app/dearobjet/backend/domain/payment/PaymentService.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,19 @@
1010
import app.dearobjet.backend.domain.payment.toss.TossPaymentsClient;
1111
import app.dearobjet.backend.domain.payment.toss.TossPaymentsProperties;
1212
import lombok.RequiredArgsConstructor;
13+
import org.springframework.data.domain.Page;
14+
import org.springframework.data.domain.PageRequest;
15+
import org.springframework.data.domain.Pageable;
16+
import org.springframework.data.domain.Sort;
1317
import org.springframework.stereotype.Service;
1418
import org.springframework.transaction.annotation.Transactional;
1519

20+
import java.time.LocalDate;
21+
import java.time.LocalDateTime;
22+
import java.time.LocalTime;
23+
import java.util.ArrayList;
24+
import java.util.List;
25+
1626
@Service
1727
@RequiredArgsConstructor
1828
public class PaymentService {
@@ -132,4 +142,44 @@ public void handleWebhookToss(String paymentKey) {
132142
payment.getOrder().updateStatus(OrderStatus.PAID);
133143
}
134144
}
145+
146+
@Transactional(readOnly = true)
147+
public PaymentListResponse getPayments(Long userId, LocalDate from, LocalDate to, int page, int size) {
148+
LocalDateTime fromDt = from.atStartOfDay();
149+
LocalDateTime toDt = LocalDateTime.of(to, LocalTime.of(23, 59, 59));
150+
151+
Pageable pageable = PageRequest.of(
152+
Math.max(page - 1, 0),
153+
size,
154+
Sort.by(Sort.Direction.DESC, "paymentId")
155+
);
156+
157+
Page<Payment> paymentPage = paymentRepository.findByOrder_User_IdAndCreatedAtBetween(
158+
userId, fromDt, toDt, pageable
159+
);
160+
161+
List<PaymentResponse> items = new ArrayList<>();
162+
for (Payment payment : paymentPage.getContent()) {
163+
items.add(toResponse(payment));
164+
}
165+
166+
return new PaymentListResponse(items, page, paymentPage.getTotalPages());
167+
}
168+
169+
private PaymentResponse toResponse(Payment payment) {
170+
Order order = payment.getOrder();
171+
172+
return new PaymentResponse(
173+
payment.getPaymentId(),
174+
order.getOrdersId(),
175+
order.getOrderNumber(),
176+
payment.getProvider(),
177+
payment.getStatus(),
178+
payment.getAmount(),
179+
payment.getPaymentKey(),
180+
payment.getApprovedAt(),
181+
payment.getCanceledAt(),
182+
payment.getFailReason()
183+
);
184+
}
135185
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package app.dearobjet.backend.domain.payment.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
import java.util.List;
7+
8+
@Getter
9+
@AllArgsConstructor
10+
public class PaymentListResponse {
11+
private final List<PaymentResponse> items;
12+
private final int page;
13+
private final int totalPages;
14+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package app.dearobjet.backend.domain.payment.dto;
2+
3+
import app.dearobjet.backend.domain.payment.entity.PaymentProvider;
4+
import app.dearobjet.backend.domain.payment.entity.PaymentStatus;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
8+
import java.time.OffsetDateTime;
9+
10+
@Getter
11+
@AllArgsConstructor
12+
public class PaymentResponse {
13+
private final Long paymentId;
14+
private final Long orderId;
15+
private final String orderNo;
16+
private final PaymentProvider provider;
17+
private final PaymentStatus status;
18+
private final Long amount;
19+
private final String paymentKey;
20+
private final OffsetDateTime approvedAt;
21+
private final OffsetDateTime canceledAt;
22+
private final String failReason;
23+
}

0 commit comments

Comments
 (0)