Skip to content

Commit b1c6485

Browse files
authored
Merge pull request #105 from GTable/feature/#104-Payment-Method
Feat: 주점 결제 정보 CRUD 및 예외처리 추가
2 parents 3d5da18 + 41d3068 commit b1c6485

File tree

23 files changed

+536
-17
lines changed

23 files changed

+536
-17
lines changed

.github/ISSUE_TEMPLATE/백엔드-이슈.md

Lines changed: 0 additions & 14 deletions
This file was deleted.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/controller/StoreController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ public ResponseEntity<?> createStore(@Valid @RequestBody StoreCreateRequest requ
5454
@GetMapping("/{storeId}")
5555
@Operation(summary = "주점 조회", description = "주점 ID로 주점을 조회합니다.")
5656
@ApiResponse(responseCode = "200", description = "주점 조회 성공")
57-
public ResponseEntity<?> getStoreById(@PathVariable Long storeId,@AuthenticationPrincipal MemberDetails memberDetails) {
57+
public ResponseEntity<?> getStoreById(@PathVariable Long storeId, @AuthenticationPrincipal MemberDetails memberDetails) {
5858
return ResponseEntity
5959
.status(HttpStatus.OK)
6060
.body(
6161
ApiUtils.success(
62-
storeService.getStoreByStoreId(storeId,memberDetails)
62+
storeService.getStoreByStoreId(storeId, memberDetails)
6363
)
6464
);
6565
}
@@ -84,7 +84,7 @@ public ResponseEntity<?> updateStore(
8484
@DeleteMapping("/{storeId}")
8585
@Operation(summary = "주점 삭제", description = "주점 ID로 주점을 삭제합니다.")
8686
@ApiResponse(responseCode = "200", description = "주점 삭제 성공")
87-
public ResponseEntity<?> deleteStore(@PathVariable Long storeId,@AuthenticationPrincipal MemberDetails memberDetails) {
87+
public ResponseEntity<?> deleteStore(@PathVariable Long storeId, @AuthenticationPrincipal MemberDetails memberDetails) {
8888
return ResponseEntity
8989
.ok()
9090
.body(

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreServiceImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
56
import org.springframework.stereotype.Service;
67
import org.springframework.transaction.annotation.Transactional;
78

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.nowait.applicationadmin.storePayment.controller;
2+
3+
import org.springframework.http.HttpStatus;
4+
import org.springframework.http.ResponseEntity;
5+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
6+
import org.springframework.web.bind.annotation.GetMapping;
7+
import org.springframework.web.bind.annotation.PatchMapping;
8+
import org.springframework.web.bind.annotation.PostMapping;
9+
import org.springframework.web.bind.annotation.RequestBody;
10+
import org.springframework.web.bind.annotation.RequestMapping;
11+
import org.springframework.web.bind.annotation.RestController;
12+
13+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateRequest;
14+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateResponse;
15+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentUpdateRequest;
16+
import com.nowait.applicationadmin.storePayment.service.StorePaymentService;
17+
import com.nowait.common.api.ApiUtils;
18+
import com.nowait.domaincorerdb.user.entity.MemberDetails;
19+
20+
import io.swagger.v3.oas.annotations.Operation;
21+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
22+
import io.swagger.v3.oas.annotations.tags.Tag;
23+
import jakarta.validation.Valid;
24+
import lombok.RequiredArgsConstructor;
25+
import lombok.extern.slf4j.Slf4j;
26+
27+
@Tag(name = "Store Payment API", description = "주점 결제 정보 API")
28+
@RestController
29+
@RequestMapping("admin/store-payments")
30+
@RequiredArgsConstructor
31+
@Slf4j
32+
public class StorePaymentController {
33+
34+
private final StorePaymentService storePaymentService;
35+
36+
@PostMapping("/create")
37+
@Operation(summary = "주점 결제 Url 등록 및 생성", description = "새로운 주점 결제 정보를 생성합니다.")
38+
@ApiResponse(responseCode = "201", description = "주점 결제 정보 생성 성공")
39+
public ResponseEntity<?> createStorePayment(@Valid @RequestBody StorePaymentCreateRequest request, @AuthenticationPrincipal MemberDetails memberDetails) {
40+
StorePaymentCreateResponse response = storePaymentService.createStorePayment(request, memberDetails);
41+
42+
return ResponseEntity
43+
.status(HttpStatus.CREATED)
44+
.body(
45+
ApiUtils.success(
46+
response
47+
)
48+
);
49+
}
50+
51+
@GetMapping()
52+
@Operation(summary = "주점 결제 정보 조회", description = "인증된 사용자의 주점 결제 정보를 조회합니다.")
53+
@ApiResponse(responseCode = "200", description = "주점 결제 정보 조회 성공")
54+
public ResponseEntity<?> getStorePaymentByStoreId(@AuthenticationPrincipal MemberDetails memberDetails) {
55+
return ResponseEntity
56+
.status(HttpStatus.OK)
57+
.body(
58+
ApiUtils.success(
59+
storePaymentService.getStorePaymentByStoreId(memberDetails)
60+
)
61+
);
62+
}
63+
64+
@PatchMapping("/update")
65+
@Operation(summary = "주점 결제 정보 수정", description = "주점 결제 정보를 수정합니다.")
66+
@ApiResponse(responseCode = "200", description = "주점 결제 정보 수정 성공")
67+
public ResponseEntity<?> updateStorePayment(@RequestBody StorePaymentUpdateRequest request, @AuthenticationPrincipal MemberDetails memberDetails) {
68+
return ResponseEntity
69+
.status(HttpStatus.OK)
70+
.body(
71+
ApiUtils.success(
72+
storePaymentService.updateStorePayment(request, memberDetails)
73+
)
74+
);
75+
}
76+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.nowait.applicationadmin.storePayment.dto;
2+
3+
import com.nowait.domaincorerdb.storepayment.entity.StorePayment;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
@Getter
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class StorePaymentCreateRequest {
13+
14+
private String tossUrl;
15+
private String kakaoPayUrl;
16+
private String naverPayUrl;
17+
18+
public StorePayment toEntity(Long storeId) {
19+
return StorePayment.builder()
20+
.storeId(storeId)
21+
.tossUrl(tossUrl)
22+
.kakaoPayUrl(kakaoPayUrl)
23+
.naverPayUrl(naverPayUrl)
24+
.build();
25+
}
26+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.nowait.applicationadmin.storePayment.dto;
2+
3+
import java.time.LocalDateTime;
4+
5+
import com.nowait.domaincorerdb.storepayment.entity.StorePayment;
6+
7+
import lombok.AllArgsConstructor;
8+
import lombok.Builder;
9+
import lombok.Getter;
10+
11+
@Getter
12+
@AllArgsConstructor
13+
@Builder
14+
public class StorePaymentCreateResponse {
15+
16+
private Long paymentMethodId;
17+
private Long storeId;
18+
private String tossUrl;
19+
private String kakaoPayUrl;
20+
private String naverPayUrl;
21+
private LocalDateTime createdAt;
22+
23+
public static StorePaymentCreateResponse fromEntity(StorePayment storePayment) {
24+
return StorePaymentCreateResponse.builder()
25+
.paymentMethodId(storePayment.getPaymentMethodId())
26+
.storeId(storePayment.getStoreId())
27+
.tossUrl(storePayment.getTossUrl())
28+
.kakaoPayUrl(storePayment.getKakaoPayUrl())
29+
.naverPayUrl(storePayment.getNaverPayUrl())
30+
.createdAt(storePayment.getCreatedAt())
31+
.build();
32+
}
33+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.nowait.applicationadmin.storePayment.dto;
2+
3+
import java.time.LocalDateTime;
4+
5+
import com.nowait.domaincorerdb.storepayment.entity.StorePayment;
6+
7+
import lombok.AllArgsConstructor;
8+
import lombok.Builder;
9+
import lombok.Getter;
10+
11+
@Getter
12+
@AllArgsConstructor
13+
@Builder
14+
public class StorePaymentReadDto {
15+
private Long paymentMethodId;
16+
private Long storeId;
17+
private String tossUrl;
18+
private String kakaoPayUrl;
19+
private String naverPayUrl;
20+
private LocalDateTime createdAt;
21+
22+
public static StorePaymentReadDto fromEntity(StorePayment storePayment) {
23+
return StorePaymentReadDto.builder()
24+
.paymentMethodId(storePayment.getPaymentMethodId())
25+
.storeId(storePayment.getStoreId())
26+
.tossUrl(storePayment.getTossUrl())
27+
.kakaoPayUrl(storePayment.getKakaoPayUrl())
28+
.naverPayUrl(storePayment.getNaverPayUrl())
29+
.createdAt(storePayment.getCreatedAt())
30+
.build();
31+
}
32+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.nowait.applicationadmin.storePayment.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@AllArgsConstructor
10+
@NoArgsConstructor
11+
@Builder
12+
public class StorePaymentUpdateRequest {
13+
private String tossUrl;
14+
private String kakaoPayUrl;
15+
private String naverPayUrl;
16+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.nowait.applicationadmin.storePayment.service;
2+
3+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateRequest;
4+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateResponse;
5+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentReadDto;
6+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentUpdateRequest;
7+
import com.nowait.domaincorerdb.user.entity.MemberDetails;
8+
9+
public interface StorePaymentService {
10+
11+
StorePaymentCreateResponse createStorePayment(StorePaymentCreateRequest request, MemberDetails memberDetails);
12+
StorePaymentReadDto getStorePaymentByStoreId(MemberDetails memberDetails);
13+
StorePaymentReadDto updateStorePayment(StorePaymentUpdateRequest request, MemberDetails memberDetails);
14+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.nowait.applicationadmin.storePayment.service;
2+
3+
import org.springframework.stereotype.Service;
4+
import org.springframework.transaction.annotation.Transactional;
5+
6+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateRequest;
7+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateResponse;
8+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentReadDto;
9+
import com.nowait.applicationadmin.storePayment.dto.StorePaymentUpdateRequest;
10+
import com.nowait.common.enums.Role;
11+
import com.nowait.domaincorerdb.storepayment.entity.StorePayment;
12+
import com.nowait.domaincorerdb.storepayment.exception.StorePaymentAlreadyExistsException;
13+
import com.nowait.domaincorerdb.storepayment.exception.StorePaymentCreationUnauthorizedException;
14+
import com.nowait.domaincorerdb.storepayment.exception.StorePaymentNotFoundException;
15+
import com.nowait.domaincorerdb.storepayment.exception.StorePaymentParamEmptyException;
16+
import com.nowait.domaincorerdb.storepayment.exception.StorePaymentUpdateUnauthorizedException;
17+
import com.nowait.domaincorerdb.storepayment.exception.StorePaymentViewUnauthorizedException;
18+
import com.nowait.domaincorerdb.storepayment.repository.StorePaymentRepository;
19+
import com.nowait.domaincorerdb.user.entity.MemberDetails;
20+
import com.nowait.domaincorerdb.user.entity.User;
21+
import com.nowait.domaincorerdb.user.exception.UserNotFoundException;
22+
import com.nowait.domaincorerdb.user.repository.UserRepository;
23+
24+
import lombok.RequiredArgsConstructor;
25+
26+
@Service
27+
@RequiredArgsConstructor
28+
public class StorePaymentServiceImpl implements StorePaymentService {
29+
30+
private final StorePaymentRepository storePaymentRepository;
31+
private final UserRepository userRepository;
32+
33+
@Override
34+
@Transactional
35+
public StorePaymentCreateResponse createStorePayment(StorePaymentCreateRequest request, MemberDetails memberDetails) {
36+
if (request == null) throw new StorePaymentParamEmptyException();
37+
38+
User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new);
39+
Long storeId = user.getStoreId();
40+
if (storePaymentRepository.findByStoreId(storeId).isPresent()) {
41+
throw new StorePaymentAlreadyExistsException();
42+
}
43+
if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(storeId)) {
44+
throw new StorePaymentCreationUnauthorizedException();
45+
}
46+
StorePayment toSave = request.toEntity(storeId);
47+
StorePayment saved = storePaymentRepository.save(toSave);
48+
49+
return StorePaymentCreateResponse.fromEntity(saved);
50+
}
51+
52+
@Override
53+
@Transactional(readOnly = true)
54+
public StorePaymentReadDto getStorePaymentByStoreId(MemberDetails memberDetails) {
55+
if (memberDetails == null) throw new StorePaymentParamEmptyException();
56+
57+
User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new);
58+
Long storeId = user.getStoreId();
59+
if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(storeId)) {
60+
throw new StorePaymentViewUnauthorizedException();
61+
}
62+
StorePayment storePayment = storePaymentRepository.findByStoreId(storeId)
63+
.orElseThrow(StorePaymentNotFoundException::new);
64+
65+
return StorePaymentReadDto.fromEntity(storePayment);
66+
}
67+
68+
@Override
69+
@Transactional
70+
public StorePaymentReadDto updateStorePayment(StorePaymentUpdateRequest request, MemberDetails memberDetails) {
71+
if (request == null) throw new StorePaymentParamEmptyException();
72+
73+
User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new);
74+
Long storeId = user.getStoreId();
75+
if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(storeId)) {
76+
throw new StorePaymentUpdateUnauthorizedException();
77+
}
78+
StorePayment storePayment = storePaymentRepository.findByStoreId(storeId)
79+
.orElseThrow(StorePaymentNotFoundException::new);
80+
81+
storePayment.updatePaymentMethodUrl(
82+
request.getTossUrl(),
83+
request.getKakaoPayUrl(),
84+
request.getNaverPayUrl()
85+
);
86+
storePaymentRepository.save(storePayment);
87+
88+
return StorePaymentReadDto.fromEntity(storePayment);
89+
}
90+
}

0 commit comments

Comments
 (0)