Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/#52/요청받은 정산 관련 api 개발 #61

Merged
merged 34 commits into from
Aug 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
1e0167d
refactor : 회원가입 생성 request의 이메일 형식 조건 수정
seongjunnoh Jul 31, 2024
634c226
refactor : 로그인 api request dto의 이메일 형식 조건 수정
seongjunnoh Jul 31, 2024
ab73f6c
refactor : 로컬 로그인 api response dto 삭제
seongjunnoh Jul 31, 2024
fe40baa
refactor : 스페이스 생성 api url 수정
seongjunnoh Jul 31, 2024
e7fba83
Merge branch 'develop' of https://github.com/KUIT-Space/KUIT_Space_Ba…
seongjunnoh Jul 31, 2024
8de2715
refactor : 이미지 파일 validator 관련 코드 수정
seongjunnoh Jul 31, 2024
1a394b0
refactor : 이미지 file validator 삭제
seongjunnoh Jul 31, 2024
3edbd31
feat : application.yml 파일에 MultipartFile 용량 제한 설정 추가
seongjunnoh Jul 31, 2024
e7b1054
refactor : 스페이스 생성 api request 이미지파일 nullable로 변경 & 이미지 파일 확장자 검증 로직 추가
seongjunnoh Jul 31, 2024
658e4dd
refactor : 스페이스 생성 api 이미지 파일 검증 컨트롤러 코드 리펙토링
seongjunnoh Jul 31, 2024
ded8b2b
refactor : 스페이스 생성 api response dto 삭제
seongjunnoh Jul 31, 2024
93adc8a
refactor : getSpaceChoiceView 메서드 return dto 구성 변경
seongjunnoh Aug 1, 2024
089b25d
refactor : getSpaceChoiceView 메서드 리펙토링(메서드 책임 분리)
seongjunnoh Aug 1, 2024
188e30e
refactor : dto 내부 static class 외부로 분리
seongjunnoh Aug 1, 2024
6d1b79b
refactor : 스페이스 선택 뷰 response 필드 구성 변경
seongjunnoh Aug 1, 2024
57d088f
refactor : user, space, pay dto 계층구조로 분리
seongjunnoh Aug 1, 2024
dbb69d5
refactor : 스페이스의 모든 유저 정보 조회 api 의 response 필드 구성 변경
seongjunnoh Aug 1, 2024
70422d8
refactor : 스페이스의 모든 유저 조회 api dao 메서드명 변경 & 리펙토링
seongjunnoh Aug 1, 2024
171367f
refactor : 스페이스의 모든 유저 조회 api response key 이름 변경
seongjunnoh Aug 1, 2024
613d314
refactor : 내가 요청한 정산 데이터 조회 api response에 정산id 추가
seongjunnoh Aug 1, 2024
5047201
refactor : 주석 변경
seongjunnoh Aug 1, 2024
199568b
feat : 정산 상세정보 조회 api dto 추가
seongjunnoh Aug 2, 2024
d197777
refactor : 요청한 정산 정보 얻는 코드 리펙토링(메서드 분리)
seongjunnoh Aug 2, 2024
4d38ea1
feat : 하나의 정산에 대한 상세정보 조회 api 서비스단 코드 개발
seongjunnoh Aug 2, 2024
509127b
refactor : 서비스단 코드 리펙토링
seongjunnoh Aug 2, 2024
1661a2e
feat : 정산 상세정보 조회 api 컨트롤러 개발
seongjunnoh Aug 2, 2024
7c41a47
refactor : 요청받은 정산 목록 조회 서비스단 코드 메서드 분리
seongjunnoh Aug 3, 2024
19ac0ea
feat : 내가 요청받은 정산 목록 조회 api 컨트롤러 & response dto 개발
seongjunnoh Aug 3, 2024
14ddf6b
feat : 정산 완료 처리 api 서비스단 코드 작성
seongjunnoh Aug 3, 2024
677b91b
refactor : 정산 완료 처리 api 서비스단 코드 return 타입 변경
seongjunnoh Aug 3, 2024
f96ba01
refactor : 서비스단 코드 메서드 분리
seongjunnoh Aug 3, 2024
b4e1f9b
feat : 정산완료처리 api 컨트롤러 코드 개발
seongjunnoh Aug 3, 2024
373c8fc
refactor : controller -> service 사용하지 않는 파라미터 제거
seongjunnoh Aug 3, 2024
ab80292
refactor : response dto에 success msg 제거
seongjunnoh Aug 3, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 54 additions & 5 deletions src/main/java/space/space_spring/controller/PayController.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import space.space_spring.argument_resolver.jwtLogin.JwtLoginAuth;
import space.space_spring.dto.pay.*;
import space.space_spring.entity.UserSpace;
import space.space_spring.dto.pay.dto.PayReceiveInfoDto;
import space.space_spring.dto.pay.dto.PayRequestInfoDto;
import space.space_spring.dto.pay.dto.PayTargetInfoDto;
import space.space_spring.dto.pay.dto.TotalPayInfoDto;
import space.space_spring.dto.pay.request.PostPayCompleteRequest;
import space.space_spring.dto.pay.request.PostPayCreateRequest;
import space.space_spring.dto.pay.response.*;
import space.space_spring.response.BaseResponse;
import space.space_spring.service.PayService;
import space.space_spring.util.userSpace.UserSpaceUtils;

import java.util.List;
import java.util.Optional;

@RestController
@RequiredArgsConstructor
Expand Down Expand Up @@ -47,7 +51,7 @@ private void validateIsUserInSpace(Long userId, Long spaceId) {
}

/**
* 내가 요청한 정산 view
* 내가 요청한 정산 조회
*/
@GetMapping("/space/{spaceId}/pay/request")
public BaseResponse<GetRequestPayViewResponse> showRequestPayListForUser(@JwtLoginAuth Long userId, @PathVariable Long spaceId) {
Expand All @@ -63,6 +67,24 @@ public BaseResponse<GetRequestPayViewResponse> showRequestPayListForUser(@JwtLog
return new BaseResponse<>(new GetRequestPayViewResponse(payRequestInfoDtoListInComplete, payRequestInfoDtoListComplete));
}

/**
* 내가 요청받은 정산 조회
*/
@GetMapping("/space/{spaceId}/pay/receive")
public BaseResponse<GetReceivePayViewResponse> showReceivePayListForUser(@JwtLoginAuth Long userId, @PathVariable Long spaceId) {
// TODO 1. 유저가 스페이스에 속하는 지 검증 -> 추후에 인터셉터에서 처리하게끔 리펙토링 필요
validateIsUserInSpace(userId, spaceId);

// TODO 2. 유저가 요청받은 정산 중 현재 진행중인 정산 리스트 get -> 정산 타겟 유저가 정산 안했을 경우 : isComplete = false
List<PayReceiveInfoDto> payReceiveInfoDtoListInComplete = payService.getPayReceiveInfoForUser(userId, spaceId, false);

// TODO 3. 유저가 요청받은 정산 중 완료한 정산 리스트 get -> 정산 타겟 유저가 정산 했을 경우 : isComplete = true
List<PayReceiveInfoDto> payReceiveInfoDtoListComplete = payService.getPayReceiveInfoForUser(userId, spaceId, true);

return new BaseResponse<>(new GetReceivePayViewResponse(payReceiveInfoDtoListInComplete, payReceiveInfoDtoListComplete));
}


/**
* 유저가 최근 정산받은 은행 계좌 정보 조회
* 해당 api는 유저가 속한 스페이스의 정보가 필요없다고 판단해서 spaceId 를 request로 받지 않음
Expand Down Expand Up @@ -92,11 +114,38 @@ public BaseResponse<String> createPay(@JwtLoginAuth Long userId, @PathVariable L
}

// TODO 3. PostPayCreateRequest의 bankName, bankAccountNum 검증
// 이거 해야할까?? 프론트단 분들과 논의 필요
// 만약 이걸 해야할 경우, @RequestBody 를 validate 하는 방식으로 검증 수행해야 할 듯

// TODO 4. 정산 생성
payService.createPay(userId, spaceId, postPayCreateRequest);

return new BaseResponse<>("정산 생성 성공");
Comment on lines 119 to 122
Copy link
Collaborator

@drbug2000 drbug2000 Aug 8, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p2: response에 payRequestId를 넣어 주는 건 어떻게 생각하시나요
프론트 측에서 정산 생성 후 바로 정산 상세보기 화면으로 넘어가는 요구사항이 생기면 필요하다고 생각합니다.
다른 기능들에서도 "생성" API에 response로 성공 여부 뿐만 아니라 생성한 자원의 Id를 넘겨주는 걸 고려하면 좋을 것 같아요

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

앗 post and get 구조를 위해서 id를 넘겨주는거도 좋다고 생각했지만, 프론트 측에서 정산 생성 후 바로 정산 상세보기 화면으로 넘어가는 플로우가 아니라 자신이 생성한 정산목록으로부터 해당 정산 id를 다시 알기 때문에 굳이 response로 넘겨줄필요가 있을까 싶어서 일단 빼봤습니다!
프론트단과 api 연동과정에서 서로 소통후에 생성 관련 api들의 response로 생성된 리소스의 id를 넘겨주는 방식을 고려해보겠습니다!!

}

/**
* 하나의 정산에 대한 상세정보 조회
*/
@GetMapping("/space/{spaceId}/pay/{payRequestId}")
public BaseResponse<TotalPayInfoDto> showTotalPayInfo(@JwtLoginAuth Long userId, @PathVariable Long spaceId, @PathVariable Long payRequestId) {

// TODO 1. 유저가 스페이스에 속하는 지 검증
validateIsUserInSpace(userId, spaceId);

// TODO 2. 정산 상세 정보 조회
return new BaseResponse<>(payService.getTotalPayInfo(spaceId, payRequestId));
}

/**
* 정산 타겟 유저의 정산 완료 처리
*/
@PostMapping("/space/{spaceId}/pay/complete")
public BaseResponse<PostPayCompleteResponse> setPayComplete(@JwtLoginAuth Long userId, @PathVariable Long spaceId, @RequestBody PostPayCompleteRequest postPayCompleteRequest) {

// TODO 1. 유저가 스페이스에 속하는 지 검증
validateIsUserInSpace(userId, spaceId);

Comment on lines +144 to +146
Copy link
Collaborator

@drbug2000 drbug2000 Aug 8, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p1: 해당PayRequestTargetId가 user꺼가 맞는지 확인하는 과정이 있으면 좋을 것 같습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아하 이런 검증 로직이 있어도 좋을거같네요!! 코드 리펙토링 시에 추가해보겠습니다!!

// TODO 2. 정산 타겟 유저의 정산 완료 처리
return new BaseResponse<>(payService.setPayRequestTargetToComplete(postPayCompleteRequest.getPayRequestTargetId()));
}

}
43 changes: 23 additions & 20 deletions src/main/java/space/space_spring/controller/SpaceController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,21 @@
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import space.space_spring.argument_resolver.jwtLogin.JwtLoginAuth;
import space.space_spring.dto.space.GetUserInfoBySpaceResponse;
import space.space_spring.dto.space.PostSpaceCreateRequest;
import space.space_spring.dto.space.PostSpaceCreateResponse;
import space.space_spring.dto.space.response.GetUserInfoBySpaceResponse;
import space.space_spring.dto.space.request.PostSpaceCreateRequest;

import space.space_spring.entity.UserSpace;
import space.space_spring.exception.MultipartFileException;
import space.space_spring.exception.SpaceException;
import space.space_spring.response.BaseResponse;
import space.space_spring.service.S3Uploader;
import space.space_spring.service.SpaceService;
import space.space_spring.util.userSpace.UserSpaceUtils;

import java.io.IOException;
import java.util.Optional;

import static space.space_spring.response.status.BaseExceptionResponseStatus.INVALID_SPACE_CREATE;
import static space.space_spring.response.status.BaseExceptionResponseStatus.IS_NOT_IMAGE_FILE;
import static space.space_spring.util.bindingResult.BindingResultUtils.getErrorMessage;

@RestController
Expand All @@ -30,33 +29,37 @@
public class SpaceController {

private final SpaceService spaceService;
private final UserSpaceUtils userSpaceUtils;
private final S3Uploader s3Uploader;
private final String spaceImgDirName = "spaceImg";

@PostMapping("/create")
public BaseResponse<PostSpaceCreateResponse> createSpace(@JwtLoginAuth Long userId, @Validated @ModelAttribute PostSpaceCreateRequest postSpaceCreateRequest, BindingResult bindingResult) throws IOException {
@PostMapping("")
public BaseResponse<String> createSpace(@JwtLoginAuth Long userId, @Validated @ModelAttribute PostSpaceCreateRequest postSpaceCreateRequest, BindingResult bindingResult) throws IOException {
if (bindingResult.hasErrors()) {
throw new SpaceException(INVALID_SPACE_CREATE, getErrorMessage(bindingResult));
}

// TODO 1. 스페이스 썸네일을 s3에 upload
String spaceImgUrl = s3Uploader.upload(postSpaceCreateRequest.getSpaceProfileImg(), spaceImgDirName);
String spaceImgUrl = processSpaceImage(postSpaceCreateRequest.getSpaceProfileImg());

// TODO 2. s3에 저장하고 받은 이미지 url 정보와 spaceName 정보로 space create 작업 수행
return new BaseResponse<>(spaceService.createSpace(userId, postSpaceCreateRequest.getSpaceName(), spaceImgUrl));
spaceService.createSpace(userId, postSpaceCreateRequest.getSpaceName(), spaceImgUrl);

return new BaseResponse<>("스페이스 생성 성공");
}

/**
* 테스트 용
*/
@GetMapping("/{spaceId}")
public BaseResponse<String> getSpaceHome(@JwtLoginAuth Long userId, @PathVariable Long spaceId) {
Optional<UserSpace> userInSpace = userSpaceUtils.isUserInSpace(userId, spaceId);
log.info("userInSpace.get().getUserName() = {}", userInSpace.get().getUserName());
log.info("userInspace.get().getUserSpaceAuth() = {}", userInSpace.get().getUserSpaceAuth());
private String processSpaceImage(MultipartFile spaceProfileImg) throws IOException {
if (spaceProfileImg == null) {
return null;
}
validateImageFile(spaceProfileImg);
return s3Uploader.upload(spaceProfileImg, spaceImgDirName);

return new BaseResponse<>("스페이스에 속한 유저만 걸러내는 작업 테스트 성공");
}

private void validateImageFile(MultipartFile spaceProfileImg) {
if (!s3Uploader.isFileImage(spaceProfileImg)) {
throw new MultipartFileException(IS_NOT_IMAGE_FILE);
}
}

/**
Expand Down
20 changes: 11 additions & 9 deletions src/main/java/space/space_spring/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import space.space_spring.argument_resolver.jwtLogin.JwtLoginAuth;
import space.space_spring.dto.user.*;
import space.space_spring.dto.user.request.PostUserLoginRequest;
import space.space_spring.dto.user.request.PostUserSignupRequest;
import space.space_spring.dto.user.response.GetSpaceInfoForUserResponse;
import space.space_spring.exception.UserException;
import space.space_spring.response.BaseResponse;
import space.space_spring.service.UserService;
import space.space_spring.util.userSpace.UserSpaceUtils;

import java.util.List;

import static space.space_spring.response.status.BaseExceptionResponseStatus.*;
import static space.space_spring.util.bindingResult.BindingResultUtils.getErrorMessage;

Expand All @@ -31,25 +31,29 @@ public class UserController {
* 회원가입
*/
@PostMapping("/signup")
public BaseResponse<PostUserSignupResponse> signup(@Validated @RequestBody PostUserSignupRequest postUserSignupRequest, BindingResult bindingResult) {
public BaseResponse<String> signup(@Validated @RequestBody PostUserSignupRequest postUserSignupRequest, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
throw new UserException(INVALID_USER_SIGNUP, getErrorMessage(bindingResult));
}
return new BaseResponse<>(userService.signup(postUserSignupRequest));

userService.signup(postUserSignupRequest);

return new BaseResponse<>("로컬 회원가입 성공");
}

/**
* 로그인
*/
@PostMapping("/login")
public BaseResponse<PostUserLoginResponse> login(@Validated @RequestBody PostUserLoginRequest postUserLoginRequest, BindingResult bindingResult, HttpServletResponse response) {
public BaseResponse<String> login(@Validated @RequestBody PostUserLoginRequest postUserLoginRequest, BindingResult bindingResult, HttpServletResponse response) {
if (bindingResult.hasErrors()) {
throw new UserException(INVALID_USER_LOGIN, getErrorMessage(bindingResult));
}

String jwtLogin = userService.login(postUserLoginRequest);
response.setHeader("Authorization", "Bearer " + jwtLogin);
return new BaseResponse<>(new PostUserLoginResponse("로그인 성공"));

return new BaseResponse<>("로컬 로그인 성공");
}

/**
Expand All @@ -61,8 +65,6 @@ public BaseResponse<GetSpaceInfoForUserResponse> showUserSpaceList(@JwtLoginAuth
@RequestParam int size,
@RequestParam Long lastUserSpaceId) {

log.info("userId = {}", userId);

return new BaseResponse<>(userService.getSpaceListForUser(userId, size, lastUserSpaceId));
}

Expand Down
15 changes: 13 additions & 2 deletions src/main/java/space/space_spring/dao/PayDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.TypedQuery;
import org.springframework.stereotype.Repository;
import space.space_spring.dto.pay.RecentPayRequestBankInfoDto;
import space.space_spring.dto.pay.dto.PayRequestInfoDto;
import space.space_spring.dto.pay.dto.RecentPayRequestBankInfoDto;
import space.space_spring.dto.pay.dto.TotalPayInfoDto;
import space.space_spring.entity.PayRequest;
import space.space_spring.entity.PayRequestTarget;
import space.space_spring.entity.Space;
import space.space_spring.entity.User;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -88,4 +89,14 @@ public PayRequestTarget createPayRequestTarget(PayRequest payRequest, Long targe
em.persist(payRequestTarget);
return payRequestTarget;
}

public PayRequest findPayRequestById(Long payRequestId) {

return em.find(PayRequest.class, payRequestId);
}

public PayRequestTarget findPayRequestTargetById(Long payRequestTargetId) {
return em.find(PayRequestTarget.class, payRequestTargetId);
}

}
5 changes: 0 additions & 5 deletions src/main/java/space/space_spring/dao/SpaceDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,6 @@
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import space.space_spring.entity.Space;
import space.space_spring.entity.User;
import space.space_spring.entity.UserSpace;
import space.space_spring.dto.space.PostSpaceCreateRequest;

import static space.space_spring.entity.enumStatus.UserSpaceAuth.MANAGER;

@Repository
public class SpaceDao {
Expand Down
1 change: 0 additions & 1 deletion src/main/java/space/space_spring/dao/UserDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import jakarta.persistence.TypedQuery;
import org.springframework.stereotype.Repository;
import space.space_spring.entity.User;
import space.space_spring.dto.user.PostUserSignupRequest;
import space.space_spring.entity.enumStatus.UserSignupType;

@Repository
Expand Down
Loading
Loading