Skip to content

Commit 40940e7

Browse files
authored
Merge pull request #289 from mosu-dev/develop
prod : 환불액 조회 기능 추가 및 전화번호 검증 로직 추가
2 parents c3a029b + 96f7f5f commit 40940e7

12 files changed

Lines changed: 72 additions & 6 deletions

File tree

src/main/java/life/mosu/mosuserver/application/auth/processor/SignUpAccountStepProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ public class SignUpAccountStepProcessor implements StepProcessor<UserJpaEntity,
1818
@Transactional
1919
@Override
2020
public UserJpaEntity process(UserJpaEntity user) {
21-
if (userRepository.existsByLoginId(user.getLoginId())) {
21+
if (userRepository.existsByPhoneNumber(user.getPhoneNumber())
22+
|| userRepository.existsByLoginId(user.getLoginId())) {
2223
throw new CustomRuntimeException(ErrorCode.USER_ALREADY_EXISTS);
2324
}
2425
return userRepository.save(user);

src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserPersistenceProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class OAuthUserPersistenceProcessor implements StepProcessor<OAuthUserInf
1818
@Override
1919
@Transactional
2020
public UserJpaEntity process(final OAuthUserInfo info) {
21-
return userRepository.findByLoginId(info.email())
21+
return userRepository.findByPhoneNumber(info.phoneNumber())
2222
.map(existingUser -> {
2323
existingUser.updateOAuthUser(
2424
info.gender(),

src/main/java/life/mosu/mosuserver/application/refund/RefundService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import life.mosu.mosuserver.global.exception.ErrorCode;
1111
import life.mosu.mosuserver.infra.toss.dto.CancelTossPaymentResponse;
1212
import life.mosu.mosuserver.presentation.refund.dto.MergedRefundRequest;
13+
import life.mosu.mosuserver.presentation.refund.dto.RefundAmountResponse;
1314
import life.mosu.mosuserver.presentation.refund.dto.RefundRequest;
1415
import lombok.RequiredArgsConstructor;
1516
import lombok.extern.slf4j.Slf4j;
1617
import org.springframework.stereotype.Service;
18+
import org.springframework.transaction.annotation.Propagation;
1719
import org.springframework.transaction.annotation.Transactional;
1820

1921

@@ -28,6 +30,16 @@ public class RefundService {
2830
private final TossRefundProcessor tossRefundProcessor;
2931
private final PaymentJpaRepository paymentJpaRepository;
3032

33+
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
34+
public RefundAmountResponse getRefundAmount(String paymentKey, Long examApplicationId) {
35+
PaymentWithLunchProjection targetPayment = findPaymentOrThrow(paymentKey,
36+
examApplicationId);
37+
38+
int totalQuantity = getTotalPaymentCount(paymentKey);
39+
int refundAmount = calculateRefundAmount(totalQuantity, targetPayment.lunchChecked());
40+
return RefundAmountResponse.of(refundAmount);
41+
}
42+
3143
@Transactional
3244
public void doProcess(Long userId, MergedRefundRequest request) {
3345
RefundRequest details = request.details();

src/main/java/life/mosu/mosuserver/application/user/UserService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,8 @@ public UserInfoResponse getUserInfo(Long userId) {
5151

5252
return UserInfoResponse.from(user);
5353
}
54+
55+
public Boolean isPhoneNumberAvailable(String phoneNumber) {
56+
return !userJpaRepository.existsByPhoneNumber(phoneNumber);
57+
}
5458
}

src/main/java/life/mosu/mosuserver/domain/user/repository/UserJpaRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ public interface UserJpaRepository extends JpaRepository<UserJpaEntity, Long> {
1010

1111
boolean existsByLoginId(String loginId);
1212

13-
1413
Optional<UserJpaEntity> findByNameAndPhoneNumber(String name, String phoneNumber);
1514

1615
Optional<UserJpaEntity> findByPhoneNumber(String phoneNumber);
16+
17+
boolean existsByPhoneNumber(String phoneNumber);
1718
}

src/main/java/life/mosu/mosuserver/global/filter/Whitelist.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ public enum Whitelist {
4242
FAQ("/api/v1/faq", WhitelistMethod.GET),
4343
NOTICE("/api/v1/notice", WhitelistMethod.GET),
4444
USER_ID_CHECK("/api/v1/user/check-id", WhitelistMethod.GET),
45+
USER_PHONE_NUMBER_CHECK("/api/v1/user/check-phone-number", WhitelistMethod.GET),
46+
47+
CUSTOMER_KEY_CHECK("/api/v1/user/customer-key", WhitelistMethod.GET),
4548
EXAM("/api/v1/exam", WhitelistMethod.GET),
4649
EXAM_AREAS("/api/v1/exam/areas", WhitelistMethod.GET),
4750
EXAM_ALL("/api/v1/exam/all", WhitelistMethod.GET),

src/main/java/life/mosu/mosuserver/presentation/refund/RefundController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@
44
import life.mosu.mosuserver.global.annotation.UserId;
55
import life.mosu.mosuserver.global.util.ApiResponseWrapper;
66
import life.mosu.mosuserver.presentation.refund.dto.MergedRefundRequest;
7+
import life.mosu.mosuserver.presentation.refund.dto.RefundAmountResponse;
78
import life.mosu.mosuserver.presentation.refund.dto.RefundRequest;
89
import lombok.RequiredArgsConstructor;
910
import lombok.extern.slf4j.Slf4j;
1011
import org.springframework.http.HttpStatus;
1112
import org.springframework.http.ResponseEntity;
1213
import org.springframework.security.access.prepost.PreAuthorize;
14+
import org.springframework.web.bind.annotation.GetMapping;
1315
import org.springframework.web.bind.annotation.PathVariable;
1416
import org.springframework.web.bind.annotation.PostMapping;
1517
import org.springframework.web.bind.annotation.RequestBody;
1618
import org.springframework.web.bind.annotation.RequestMapping;
19+
import org.springframework.web.bind.annotation.RequestParam;
1720
import org.springframework.web.bind.annotation.RestController;
1821

1922
@RestController
@@ -24,6 +27,15 @@ public class RefundController {
2427

2528
private final RefundService refundService;
2629

30+
@GetMapping()
31+
ResponseEntity<ApiResponseWrapper<RefundAmountResponse>> getRefundAmount(
32+
@RequestParam(required = true) String paymentKey,
33+
@RequestParam(required = true) Long examApplicationId) {
34+
var response = refundService.getRefundAmount(paymentKey, examApplicationId);
35+
return ResponseEntity.ok(
36+
ApiResponseWrapper.success(HttpStatus.OK, "환불 금액 조회 성공", response));
37+
}
38+
2739
@PostMapping("/{paymentKey}")
2840
@PreAuthorize("isAuthenticated() and hasRole('USER')")
2941
ResponseEntity<ApiResponseWrapper<Void>> process(
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package life.mosu.mosuserver.presentation.refund.dto;
2+
3+
public record RefundAmountResponse(
4+
int amount
5+
) {
6+
7+
public static RefundAmountResponse of(int amount) {
8+
return new RefundAmountResponse(amount);
9+
}
10+
11+
}

src/main/java/life/mosu/mosuserver/presentation/user/UserController.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import life.mosu.mosuserver.application.user.UserService;
44
import life.mosu.mosuserver.global.annotation.LoginIdPattern;
5+
import life.mosu.mosuserver.global.annotation.PhoneNumberPattern;
56
import life.mosu.mosuserver.global.annotation.UserId;
67
import life.mosu.mosuserver.global.util.ApiResponseWrapper;
7-
import life.mosu.mosuserver.presentation.user.dto.request.IsLoginIdAvailableResponse;
88
import life.mosu.mosuserver.presentation.user.dto.response.CustomerKeyResponse;
9+
import life.mosu.mosuserver.presentation.user.dto.response.IsLoginIdAvailableResponse;
10+
import life.mosu.mosuserver.presentation.user.dto.response.IsPhoneNumberAvailableResponse;
911
import life.mosu.mosuserver.presentation.user.dto.response.UserInfoResponse;
1012
import lombok.RequiredArgsConstructor;
1113
import org.springframework.http.HttpStatus;
@@ -58,4 +60,14 @@ public ResponseEntity<ApiResponseWrapper<IsLoginIdAvailableResponse>> isLoginIdA
5860
IsLoginIdAvailableResponse.from(isLoginIdAvailable)));
5961
}
6062

63+
@GetMapping("/check-phone-number")
64+
public ResponseEntity<ApiResponseWrapper<IsPhoneNumberAvailableResponse>> isPhoneNumberAvailable(
65+
@PhoneNumberPattern @RequestParam String phoneNumber
66+
) {
67+
Boolean isPhoneNumberAvailable = userService.isPhoneNumberAvailable(phoneNumber);
68+
69+
return ResponseEntity.ok(
70+
ApiResponseWrapper.success(HttpStatus.OK, "User PhoneNumber 등록 가능 여부 조회 성공",
71+
IsPhoneNumberAvailableResponse.from(isPhoneNumberAvailable)));
72+
}
6173
}

src/main/java/life/mosu/mosuserver/presentation/user/UserControllerDocs.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import life.mosu.mosuserver.global.annotation.LoginIdPattern;
1111
import life.mosu.mosuserver.global.annotation.UserId;
1212
import life.mosu.mosuserver.global.util.ApiResponseWrapper;
13-
import life.mosu.mosuserver.presentation.user.dto.request.IsLoginIdAvailableResponse;
1413
import life.mosu.mosuserver.presentation.user.dto.response.CustomerKeyResponse;
14+
import life.mosu.mosuserver.presentation.user.dto.response.IsLoginIdAvailableResponse;
1515
import org.springframework.http.ResponseEntity;
1616
import org.springframework.validation.annotation.Validated;
1717
import org.springframework.web.bind.annotation.RequestParam;

0 commit comments

Comments
 (0)