Skip to content

Commit 50abb14

Browse files
authored
Merge pull request #176 from 9oormthon-univ/feat/prepay
Feat/prepay
2 parents 7d843b2 + 5ba5c82 commit 50abb14

File tree

6 files changed

+143
-79
lines changed

6 files changed

+143
-79
lines changed
Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,45 @@
11
package com.jangburich.domain.store.controller;
22

3+
import org.springframework.security.core.Authentication;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.PostMapping;
6+
import org.springframework.web.bind.annotation.RequestBody;
7+
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RequestParam;
9+
import org.springframework.web.bind.annotation.RestController;
10+
311
import com.jangburich.domain.store.dto.request.PrepayRequest;
412
import com.jangburich.domain.store.service.PrepayService;
513
import com.jangburich.global.payload.Message;
614
import com.jangburich.global.payload.ResponseCustom;
715
import com.jangburich.utils.parser.AuthenticationParser;
16+
817
import io.swagger.v3.oas.annotations.Operation;
918
import io.swagger.v3.oas.annotations.tags.Tag;
1019
import lombok.RequiredArgsConstructor;
11-
import org.springframework.security.core.Authentication;
12-
import org.springframework.web.bind.annotation.PathVariable;
13-
import org.springframework.web.bind.annotation.PostMapping;
14-
import org.springframework.web.bind.annotation.RequestBody;
15-
import org.springframework.web.bind.annotation.RequestMapping;
16-
import org.springframework.web.bind.annotation.RestController;
1720

1821
@Tag(name = "Prepay", description = "Prepay API")
1922
@RestController
2023
@RequiredArgsConstructor
2124
@RequestMapping("/prepay")
2225
public class PrepayController {
2326

24-
private final PrepayService prepayService;
27+
private final PrepayService prepayService;
28+
29+
@Operation(summary = "선결제", description = "팀과 매장 선결제를 진행합니다.")
30+
@PostMapping
31+
public ResponseCustom<Message> prepay(Authentication authentication,
32+
@RequestBody PrepayRequest prepayRequest) {
33+
return ResponseCustom.OK(prepayService.prepay(AuthenticationParser.parseUserId(authentication), prepayRequest));
34+
}
2535

26-
@Operation(summary = "선결제", description = "팀과 매장 선결제를 진행합니다.")
27-
@PostMapping
28-
public ResponseCustom<Message> prepay(Authentication authentication,
29-
@RequestBody PrepayRequest prepayRequest) {
30-
return ResponseCustom.OK(prepayService.prepay(AuthenticationParser.parseUserId(authentication), prepayRequest));
31-
}
36+
@Operation(summary = "선결제 정보 조회", description = "선결제 진행하기 위한 정보를 조회합니다.")
37+
@GetMapping("")
38+
public ResponseCustom<?> getPrepayInfo(Authentication authentication,
39+
@RequestParam(value = "storeId") Long storeId,
40+
@RequestParam(value = "teamId") Long teamId
41+
) {
42+
return ResponseCustom.OK(
43+
prepayService.getPrepayInfo(AuthenticationParser.parseUserId(authentication), storeId, teamId));
44+
}
3245
}

src/main/java/com/jangburich/domain/store/controller/StoreController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@
2121
import com.jangburich.domain.store.domain.Category;
2222
import com.jangburich.domain.store.domain.StoreCreateRequestDTO;
2323
import com.jangburich.domain.store.domain.StoreGetResponseDTO;
24-
import com.jangburich.domain.store.domain.StoreTeamResponseDTO;
2524
import com.jangburich.domain.store.domain.StoreUpdateRequestDTO;
2625
import com.jangburich.domain.store.dto.response.OrdersDetailResponse;
2726
import com.jangburich.domain.store.dto.response.OrdersGetResponse;
2827
import com.jangburich.domain.store.dto.response.OrdersTodayResponse;
2928
import com.jangburich.domain.store.dto.response.PaymentGroupDetailResponse;
3029
import com.jangburich.domain.store.dto.response.SearchStoresResponse;
30+
import com.jangburich.domain.store.dto.response.StoreTeamResponse;
3131
import com.jangburich.domain.store.service.StoreService;
3232
import com.jangburich.global.payload.Message;
3333
import com.jangburich.global.payload.ResponseCustom;
@@ -107,7 +107,7 @@ public ResponseCustom<StoreGetResponseDTO> getStoreInfo(Authentication authentic
107107

108108
@Operation(summary = "결제 그룹 조회", description = "장부 결제 그룹을 조회합니다.")
109109
@GetMapping("/payment_group")
110-
public ResponseCustom<List<com.jangburich.domain.store.dto.StoreTeamResponse>> getPaymentGroup(Authentication authentication) {
110+
public ResponseCustom<List<StoreTeamResponse>> getPaymentGroup(Authentication authentication) {
111111
return ResponseCustom.OK(
112112
storeService.getPaymentGroup(AuthenticationParser.parseUserId(authentication)));
113113
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.jangburich.domain.store.dto.response;
2+
3+
import lombok.Getter;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.Setter;
6+
7+
@Getter
8+
@Setter
9+
@RequiredArgsConstructor
10+
public class PrepaymentInfoResponse {
11+
private Long minPrepayAmount;
12+
private Integer wallet;
13+
private Integer remainPrepay;
14+
}

src/main/java/com/jangburich/domain/store/dto/StoreTeamResponse.java renamed to src/main/java/com/jangburich/domain/store/dto/response/StoreTeamResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.jangburich.domain.store.dto;
1+
package com.jangburich.domain.store.dto.response;
22

33
import java.time.LocalDateTime;
44
import java.time.format.DateTimeFormatter;
Lines changed: 98 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package com.jangburich.domain.store.service;
22

3+
import java.time.LocalDate;
4+
import java.util.Optional;
5+
6+
import org.springframework.stereotype.Service;
7+
import org.springframework.transaction.annotation.Transactional;
8+
39
import com.jangburich.domain.point.domain.PointTransaction;
410
import com.jangburich.domain.point.domain.TransactionType;
511
import com.jangburich.domain.point.domain.repository.PointTransactionRepository;
612
import com.jangburich.domain.store.domain.Store;
713
import com.jangburich.domain.store.domain.StoreTeam;
814
import com.jangburich.domain.store.dto.request.PrepayRequest;
15+
import com.jangburich.domain.store.dto.response.PrepaymentInfoResponse;
916
import com.jangburich.domain.store.repository.StoreRepository;
1017
import com.jangburich.domain.store.repository.StoreTeamRepository;
1118
import com.jangburich.domain.team.domain.Team;
@@ -15,72 +22,102 @@
1522
import com.jangburich.global.error.DefaultNullPointerException;
1623
import com.jangburich.global.payload.ErrorCode;
1724
import com.jangburich.global.payload.Message;
18-
import java.time.LocalDate;
19-
import java.util.Optional;
25+
2026
import lombok.RequiredArgsConstructor;
21-
import org.springframework.stereotype.Service;
22-
import org.springframework.transaction.annotation.Transactional;
2327

2428
@Service
2529
@Transactional(readOnly = true)
2630
@RequiredArgsConstructor
2731
public class PrepayService {
2832

29-
private final UserRepository userRepository;
30-
private final StoreRepository storeRepository;
31-
private final TeamRepository teamRepository;
32-
private final StoreTeamRepository storeTeamRepository;
33-
private final PointTransactionRepository pointTransactionRepository;
34-
35-
@Transactional
36-
public Message prepay(String userId, PrepayRequest prepayRequest) {
37-
User user = userRepository.findByProviderId(userId)
38-
.orElseThrow(() -> new DefaultNullPointerException(ErrorCode.INVALID_AUTHENTICATION));
39-
40-
Team team = teamRepository.findById(prepayRequest.teamId())
41-
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 팀 id 입니다."));
42-
43-
Store store = storeRepository.findById(prepayRequest.storeId())
44-
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 가게 id 입니다."));
45-
46-
team.validateIsTeamLeader(team.getTeamLeader().getUser_id(), user.getUserId());
47-
48-
user.validateHasPointWithPrepayAmount(prepayRequest.prepayAmount(), user.getPoint());
49-
50-
user.usePoint(prepayRequest.prepayAmount());
51-
PointTransaction pointTransaction = PointTransaction
52-
.builder()
53-
.transactionType(TransactionType.PREPAY)
54-
.transactionedPoint(prepayRequest.prepayAmount())
55-
.user(user)
56-
.store(store)
57-
.build();
58-
59-
pointTransactionRepository.save(pointTransaction);
60-
61-
LocalDate expirationDate = LocalDate.now().plusDays(store.getPrepaymentDuration());
62-
63-
StoreTeam buildedStoreTeam = StoreTeam
64-
.builder()
65-
.team(team)
66-
.store(store)
67-
.point(prepayRequest.prepayAmount())
68-
.personalAllocatedPoint(prepayRequest.personalAllocatedAmount())
69-
.remainPoint(prepayRequest.prepayAmount())
70-
.prepaidExpirationDate(expirationDate)
71-
.build();
72-
73-
Optional<StoreTeam> storeAndTeam = storeTeamRepository.findByStoreAndTeam(store, team);
74-
75-
if (storeAndTeam.isEmpty()) {
76-
storeAndTeam = Optional.of(storeTeamRepository.save(buildedStoreTeam));
77-
}
78-
79-
StoreTeam storeTeam = storeAndTeam.get();
80-
storeTeam.recharge(prepayRequest.prepayAmount());
81-
82-
return Message.builder()
83-
.message("매장 선결제가 완료되었습니다.")
84-
.build();
85-
}
33+
private final UserRepository userRepository;
34+
private final StoreRepository storeRepository;
35+
private final TeamRepository teamRepository;
36+
private final StoreTeamRepository storeTeamRepository;
37+
private final PointTransactionRepository pointTransactionRepository;
38+
39+
@Transactional
40+
public Message prepay(String userId, PrepayRequest prepayRequest) {
41+
User user = userRepository.findByProviderId(userId)
42+
.orElseThrow(() -> new DefaultNullPointerException(ErrorCode.INVALID_AUTHENTICATION));
43+
44+
Team team = teamRepository.findById(prepayRequest.teamId())
45+
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 팀 id 입니다."));
46+
47+
Store store = storeRepository.findById(prepayRequest.storeId())
48+
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 가게 id 입니다."));
49+
50+
team.validateIsTeamLeader(team.getTeamLeader().getUser_id(), user.getUserId());
51+
52+
user.validateHasPointWithPrepayAmount(prepayRequest.prepayAmount(), user.getPoint());
53+
if (!team.getTeamLeader().getUser_id().equals(user.getUserId())) {
54+
return Message.builder()
55+
.message("팀의 리더가 아닌 사람은 선결제를 할 수 없습니다.")
56+
.build();
57+
}
58+
59+
if (prepayRequest.prepayAmount() > user.getPoint()) {
60+
return Message.builder()
61+
.message("보유하고 있는 금액이 선결제 하려는 금액보다 적습니다.")
62+
.build();
63+
}
64+
65+
user.usePoint(prepayRequest.prepayAmount());
66+
PointTransaction pointTransaction = PointTransaction
67+
.builder()
68+
.transactionType(TransactionType.PREPAY)
69+
.transactionedPoint(prepayRequest.prepayAmount())
70+
.user(user)
71+
.store(store)
72+
.build();
73+
74+
pointTransactionRepository.save(pointTransaction);
75+
76+
LocalDate expirationDate = LocalDate.now().plusDays(store.getPrepaymentDuration());
77+
78+
StoreTeam buildedStoreTeam = StoreTeam
79+
.builder()
80+
.team(team)
81+
.store(store)
82+
.point(prepayRequest.prepayAmount())
83+
.personalAllocatedPoint(prepayRequest.personalAllocatedAmount())
84+
.remainPoint(prepayRequest.prepayAmount())
85+
.prepaidExpirationDate(expirationDate)
86+
.build();
87+
88+
Optional<StoreTeam> storeAndTeam = storeTeamRepository.findByStoreAndTeam(store, team);
89+
90+
if (storeAndTeam.isEmpty()) {
91+
storeAndTeam = Optional.of(storeTeamRepository.save(buildedStoreTeam));
92+
}
93+
94+
StoreTeam storeTeam = storeAndTeam.get();
95+
storeTeam.recharge(prepayRequest.prepayAmount());
96+
97+
return Message.builder()
98+
.message("매장 선결제가 완료되었습니다.")
99+
.build();
100+
}
101+
102+
@Transactional
103+
public PrepaymentInfoResponse getPrepayInfo(String userId, Long storeId, Long teamId) {
104+
User user = userRepository.findByProviderId(userId)
105+
.orElseThrow(() -> new DefaultNullPointerException(ErrorCode.INVALID_AUTHENTICATION));
106+
107+
StoreTeam storeTeam = storeTeamRepository.findByStoreIdAndTeamId(storeId, teamId)
108+
.orElse(null);
109+
110+
Store store = storeRepository.findById(storeId)
111+
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 가게 id 입니다."));
112+
113+
PrepaymentInfoResponse prepaymentInfoResponse = new PrepaymentInfoResponse();
114+
if (storeTeam == null) {
115+
prepaymentInfoResponse.setRemainPrepay(0);
116+
} else {
117+
prepaymentInfoResponse.setRemainPrepay(storeTeam.getRemainPoint());
118+
}
119+
prepaymentInfoResponse.setMinPrepayAmount(store.getMinPrepayment());
120+
prepaymentInfoResponse.setWallet(user.getPoint());
121+
return prepaymentInfoResponse;
122+
}
86123
}

src/main/java/com/jangburich/domain/store/service/StoreService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import com.jangburich.domain.store.domain.StoreGetResponseDTO;
3535
import com.jangburich.domain.store.domain.StoreTeam;
3636
import com.jangburich.domain.store.domain.StoreUpdateRequestDTO;
37-
import com.jangburich.domain.store.dto.StoreTeamResponse;
37+
import com.jangburich.domain.store.dto.response.StoreTeamResponse;
3838
import com.jangburich.domain.store.dto.response.OrdersDetailResponse;
3939
import com.jangburich.domain.store.dto.response.OrdersGetResponse;
4040
import com.jangburich.domain.store.dto.response.OrdersTodayResponse;
@@ -215,7 +215,7 @@ public StoreGetResponseDTO getStoreInfo(String authentication) {
215215
return new StoreGetResponseDTO().of(store, menus);
216216
}
217217

218-
public List<com.jangburich.domain.store.dto.StoreTeamResponse> getPaymentGroup(String userId) {
218+
public List<StoreTeamResponse> getPaymentGroup(String userId) {
219219
User user = userRepository.findByProviderId(userId)
220220
.orElseThrow(() -> new DefaultNullPointerException(ErrorCode.INVALID_AUTHENTICATION));
221221

0 commit comments

Comments
 (0)