From 1a486d92037f8824d605b3bcb6062c3d6d39dec4 Mon Sep 17 00:00:00 2001 From: baebae02 Date: Thu, 9 Nov 2023 19:14:22 +0900 Subject: [PATCH 01/18] feat: add today pray --- .../uspray/controller/PrayController.java | 158 ++++++++++-------- .../java/com/uspray/uspray/domain/Pray.java | 4 + .../uspray/uspray/exception/ErrorStatus.java | 57 +++---- .../uspray/exception/SuccessStatus.java | 93 ++++++----- .../uspray/infrastructure/PrayRepository.java | 21 ++- .../uspray/uspray/service/PrayService.java | 138 ++++++++------- 6 files changed, 248 insertions(+), 223 deletions(-) diff --git a/src/main/java/com/uspray/uspray/controller/PrayController.java b/src/main/java/com/uspray/uspray/controller/PrayController.java index cc8231df..0fc837be 100644 --- a/src/main/java/com/uspray/uspray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/controller/PrayController.java @@ -36,77 +36,89 @@ @RequiredArgsConstructor @SecurityRequirement(name = "JWT Auth") public class PrayController { - - private final PrayService prayService; - - @Operation(summary = "기도제목 목록 조회") - - @ApiResponse( - responseCode = "200", - description = "기도제목 목록 반환", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) - - @GetMapping() - public ApiResponseDto> getPrayList( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "정렬 기준 (date, count)", required = true, example = "date") String orderType - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, - prayService.getPrayList(user.getUsername(), orderType)); - } - - @GetMapping("/{prayId}") - @ApiResponse( - responseCode = "200", - description = "기도제목 조회", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) - @Operation(summary = "기도제목 조회") - public ApiResponseDto getPrayDetail( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_SUCCESS, - prayService.getPrayDetail(prayId, user.getUsername())); - } - - @PostMapping() - @ApiResponse( - responseCode = "201", - description = "기도제목 생성", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) - @Operation(summary = "기도제목 생성") - @ResponseStatus(HttpStatus.CREATED) - public ApiResponseDto createPray( - @RequestBody @Valid PrayRequestDto prayRequestDto, - @Parameter(hidden = true) @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, - prayService.createPray(prayRequestDto, user.getUsername())); - } - - @DeleteMapping("/{prayId}") - @ApiResponse(responseCode = "204", description = "기도제목 삭제") - @Operation(summary = "기도제목 삭제") - public ApiResponseDto deletePray( - @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, - @Parameter(hidden = true) @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, - prayService.deletePray(prayId, user.getUsername())); - } - - @PutMapping("/{prayId}") - @ApiResponse( - responseCode = "200", - description = "기도제목 수정", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) - @Operation(summary = "기도제목 수정") - public ApiResponseDto updatePray( - @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, - @RequestBody @Valid PrayRequestDto prayRequestDto, - @Parameter(hidden = true) @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, - prayService.updatePray(prayId, user.getUsername(), prayRequestDto)); - } + + private final PrayService prayService; + + @Operation(summary = "기도제목 목록 조회") + @ApiResponse( + responseCode = "200", + description = "기도제목 목록 반환", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + @GetMapping() + public ApiResponseDto> getPrayList( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @Parameter(description = "정렬 기준 (date, count)", required = true, example = "date") String orderType + ) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, + prayService.getPrayList(user.getUsername(), orderType)); + } + + @GetMapping("/{prayId}") + @ApiResponse( + responseCode = "200", + description = "기도제목 조회", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + @Operation(summary = "기도제목 조회") + public ApiResponseDto getPrayDetail( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId + ) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_SUCCESS, + prayService.getPrayDetail(prayId, user.getUsername())); + } + + @PostMapping() + @ApiResponse( + responseCode = "201", + description = "기도제목 생성", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + @Operation(summary = "기도제목 생성") + @ResponseStatus(HttpStatus.CREATED) + public ApiResponseDto createPray( + @RequestBody @Valid PrayRequestDto prayRequestDto, + @Parameter(hidden = true) @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, + prayService.createPray(prayRequestDto, user.getUsername())); + } + + @DeleteMapping("/{prayId}") + @ApiResponse(responseCode = "204", description = "기도제목 삭제") + @Operation(summary = "기도제목 삭제") + public ApiResponseDto deletePray( + @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, + @Parameter(hidden = true) @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, + prayService.deletePray(prayId, user.getUsername())); + } + + @PutMapping("/{prayId}") + @ApiResponse( + responseCode = "200", + description = "기도제목 수정", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + @Operation(summary = "기도제목 수정") + public ApiResponseDto updatePray( + @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, + @RequestBody @Valid PrayRequestDto prayRequestDto, + @Parameter(hidden = true) @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, + prayService.updatePray(prayId, user.getUsername(), prayRequestDto)); + } + + @Operation(summary = "오늘 기도하기") + @ApiResponse( + responseCode = "200", + description = "오늘 기도하기", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + @PutMapping("/{prayId}/today") + public ApiResponseDto> todayPray( + @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, + @Parameter(hidden = true) @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, + prayService.todayPray(prayId, user.getUsername())); + } } diff --git a/src/main/java/com/uspray/uspray/domain/Pray.java b/src/main/java/com/uspray/uspray/domain/Pray.java index b19debdb..ff3baa0a 100644 --- a/src/main/java/com/uspray/uspray/domain/Pray.java +++ b/src/main/java/com/uspray/uspray/domain/Pray.java @@ -87,4 +87,8 @@ public void update(PrayRequestDto prayRequestDto) { public String getContent() { return new String(Base64.getDecoder().decode(content)); } + + public void countUp() { + this.count++; + } } diff --git a/src/main/java/com/uspray/uspray/exception/ErrorStatus.java b/src/main/java/com/uspray/uspray/exception/ErrorStatus.java index 73d2979e..8b71e988 100644 --- a/src/main/java/com/uspray/uspray/exception/ErrorStatus.java +++ b/src/main/java/com/uspray/uspray/exception/ErrorStatus.java @@ -8,26 +8,27 @@ @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public enum ErrorStatus { - - /* - * 400 BAD_REQUEST - */ - VALIDATION_EXCEPTION(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), - ALREADY_EXIST_ID_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 사용중인 아이디입니다."), - INVALID_TOKEN_INFO_EXCEPTION(HttpStatus.BAD_REQUEST, "토큰 혹은 만료시간 설정이 잘못되었습니다."), - SENDER_RECEIVER_SAME_EXCEPTION(HttpStatus.BAD_REQUEST, "자신에게는 기도제목을 공유할 수 없습니다."), - CATEGORY_ALREADY_EXIST_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 카테고리입니다."), - CATEGORY_LIMIT_EXCEPTION(HttpStatus.BAD_REQUEST, "카테고리는 최대 7개까지 생성 가능합니다."), - - /* - * 401 UNAUTHORIZED - */ - PRAY_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "해당 기도제목에 대한 권한이 없습니다."), - TOKEN_NOT_VALID_EXCEPTION(HttpStatus.UNAUTHORIZED, "유효하지 않는 토큰입니다."), - SHARE_NOT_AUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "기도제목을 공유할 권한이 없습니다."), - DELETE_NOT_AUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "기도제목을 삭제할 권한이 없습니다."), - CATEGORY_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "해당 카테고리에 대한 권한이 없습니다."), - + + /* + * 400 BAD_REQUEST + */ + VALIDATION_EXCEPTION(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), + ALREADY_EXIST_ID_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 사용중인 아이디입니다."), + INVALID_TOKEN_INFO_EXCEPTION(HttpStatus.BAD_REQUEST, "토큰 혹은 만료시간 설정이 잘못되었습니다."), + SENDER_RECEIVER_SAME_EXCEPTION(HttpStatus.BAD_REQUEST, "자신에게는 기도제목을 공유할 수 없습니다."), + CATEGORY_ALREADY_EXIST_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 카테고리입니다."), + CATEGORY_LIMIT_EXCEPTION(HttpStatus.BAD_REQUEST, "카테고리는 최대 7개까지 생성 가능합니다."), + ALREADY_PRAYED_TODAY(HttpStatus.BAD_REQUEST, "오늘은 이미 기도하셨습니다."), + + /* + * 401 UNAUTHORIZED + */ + PRAY_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "해당 기도제목에 대한 권한이 없습니다."), + TOKEN_NOT_VALID_EXCEPTION(HttpStatus.UNAUTHORIZED, "유효하지 않는 토큰입니다."), + SHARE_NOT_AUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "기도제목을 공유할 권한이 없습니다."), + DELETE_NOT_AUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "기도제목을 삭제할 권한이 없습니다."), + CATEGORY_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "해당 카테고리에 대한 권한이 없습니다."), + /** * 404 NOT FOUND */ @@ -37,12 +38,12 @@ public enum ErrorStatus { PRAY_NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "해당 기도제목을 찾을 수 없습니다."), PRAY_ALREADY_DELETED_EXCEPTION(HttpStatus.NOT_FOUND, "원본 기도제목이 삭제되었습니다."), NOT_FOUND_SHARED_PRAY_EXCEPTION(HttpStatus.NOT_FOUND, "해당 공유기도제목을 찾을 수 없습니다."), - ; - - private final HttpStatus httpStatus; - private final String message; - - public int getHttpStatusCode() { - return httpStatus.value(); - } + ; + + private final HttpStatus httpStatus; + private final String message; + + public int getHttpStatusCode() { + return httpStatus.value(); + } } diff --git a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java index 689faac0..b1836b88 100644 --- a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java +++ b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java @@ -8,50 +8,51 @@ @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public enum SuccessStatus { - - /** - * 200 OK - */ - LOGIN_SUCCESS(HttpStatus.OK, "로그인에 성공했습니다."), - GET_PRAY_LIST_SUCCESS(HttpStatus.OK, "기도제목 목록 조회에 성공했습니다."), - GET_GROUP_PRAY_LIST_SUCCESS(HttpStatus.OK, "기도제목 목록 조회에 성공했습니다."), - GET_PRAY_SUCCESS(HttpStatus.OK, "기도제목 조회에 성공했습니다."), - SEND_SMS_SUCCESS(HttpStatus.OK, "SMS를 성공적으로 전송했습니다."), - CERTIFICATION_SUCCESS(HttpStatus.OK, "전화번호 인증에 성공했습니다."), - CHANGE_PHONE_SUCCESS(HttpStatus.OK, "전화번호를 성공적으로 변경했습니다."), - FIND_USER_ID_SUCCESS(HttpStatus.OK, "아이디를 성공적으로 조회했습니다."), - CHANGE_USER_PW_SUCCESS(HttpStatus.OK, "비밀번호를 성공적으로 변경했습니다."), - CHECK_USER_ID_SUCCESS(HttpStatus.OK, "사용 가능한 아이디입니다."), - UPDATE_PRAY_SUCCESS(HttpStatus.OK, "기도제목 수정에 성공했습니다."), - UPDATE_GROUP_PRAY_SUCCESS(HttpStatus.OK, "기도제목 수정에 성공했습니다."), - REISSUE_SUCCESS(HttpStatus.OK, "토큰 재발급에 성공했습니다."), - PUSH_SUCCESS(HttpStatus.OK, "푸쉬 알림을 성공적으로 전송했습니다."), - CHANGE_PUSH_AGREE_SUCCESS(HttpStatus.OK, "푸쉬 알림 설정을 성공적으로 변경했습니다."), - UPDATE_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 수정에 성공했습니다."), - GET_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 조회에 성공했습니다."), - GET_HISTORY_LIST_SUCCESS(HttpStatus.OK, "히스토리 목록 조회에 성공했습니다."), - GET_HISTORY_DETAIL_SUCCESS(HttpStatus.OK, "히스토리 상세 조회에 성공했습니다."), - - /* - * 201 created - */ - SIGNUP_SUCCESS(HttpStatus.CREATED, "회원가입이 완료되었습니다."), - CREATE_PRAY_SUCCESS(HttpStatus.CREATED, "기도제목 생성에 성공했습니다."), - CREATE_GROUP_PRAY_SUCCESS(HttpStatus.CREATED, "모임 기도제목 생성에 성공했습니다."), - CREATE_CATEGORY_SUCCESS(HttpStatus.CREATED, "카테고리 생성에 성공했습니다."), - SHARE_PRAY_SUCCESS(HttpStatus.CREATED, "기도제목 공유에 성공했습니다."), - SHARE_PRAY_AGREE_SUCCESS(HttpStatus.CREATED, "기도제목 공유 수락에 성공했습니다."), - - /* - * 204 deleted - */ - DELETE_PRAY_SUCCESS(HttpStatus.NO_CONTENT, "기도제목 삭제에 성공했습니다."), - DELETE_GROUP_PRAY_SUCCESS(HttpStatus.NO_CONTENT, "모임 기도제목 삭제에 성공했습니다."), - WITHDRAWAL_SUCCESS(HttpStatus.NO_CONTENT, "회원 탈퇴에 성공했습니다."), - DELETE_CATEGORY_SUCCESS(HttpStatus.NO_CONTENT, "카테고리 삭제에 성공했습니다."); - - - private final HttpStatus httpStatus; - private final String message; - + + /** + * 200 OK + */ + LOGIN_SUCCESS(HttpStatus.OK, "로그인에 성공했습니다."), + GET_PRAY_LIST_SUCCESS(HttpStatus.OK, "기도제목 목록 조회에 성공했습니다."), + GET_GROUP_PRAY_LIST_SUCCESS(HttpStatus.OK, "기도제목 목록 조회에 성공했습니다."), + GET_PRAY_SUCCESS(HttpStatus.OK, "기도제목 조회에 성공했습니다."), + SEND_SMS_SUCCESS(HttpStatus.OK, "SMS를 성공적으로 전송했습니다."), + CERTIFICATION_SUCCESS(HttpStatus.OK, "전화번호 인증에 성공했습니다."), + CHANGE_PHONE_SUCCESS(HttpStatus.OK, "전화번호를 성공적으로 변경했습니다."), + FIND_USER_ID_SUCCESS(HttpStatus.OK, "아이디를 성공적으로 조회했습니다."), + CHANGE_USER_PW_SUCCESS(HttpStatus.OK, "비밀번호를 성공적으로 변경했습니다."), + CHECK_USER_ID_SUCCESS(HttpStatus.OK, "사용 가능한 아이디입니다."), + UPDATE_PRAY_SUCCESS(HttpStatus.OK, "기도제목 수정에 성공했습니다."), + UPDATE_GROUP_PRAY_SUCCESS(HttpStatus.OK, "기도제목 수정에 성공했습니다."), + REISSUE_SUCCESS(HttpStatus.OK, "토큰 재발급에 성공했습니다."), + PUSH_SUCCESS(HttpStatus.OK, "푸쉬 알림을 성공적으로 전송했습니다."), + CHANGE_PUSH_AGREE_SUCCESS(HttpStatus.OK, "푸쉬 알림 설정을 성공적으로 변경했습니다."), + UPDATE_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 수정에 성공했습니다."), + GET_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 조회에 성공했습니다."), + GET_HISTORY_LIST_SUCCESS(HttpStatus.OK, "히스토리 목록 조회에 성공했습니다."), + GET_HISTORY_DETAIL_SUCCESS(HttpStatus.OK, "히스토리 상세 조회에 성공했습니다."), + INCREASE_PRAY_COUNT_SUCCESS(HttpStatus.OK, "기도제목 카운트 증가에 성공했습니다."), + + /* + * 201 created + */ + SIGNUP_SUCCESS(HttpStatus.CREATED, "회원가입이 완료되었습니다."), + CREATE_PRAY_SUCCESS(HttpStatus.CREATED, "기도제목 생성에 성공했습니다."), + CREATE_GROUP_PRAY_SUCCESS(HttpStatus.CREATED, "모임 기도제목 생성에 성공했습니다."), + CREATE_CATEGORY_SUCCESS(HttpStatus.CREATED, "카테고리 생성에 성공했습니다."), + SHARE_PRAY_SUCCESS(HttpStatus.CREATED, "기도제목 공유에 성공했습니다."), + SHARE_PRAY_AGREE_SUCCESS(HttpStatus.CREATED, "기도제목 공유 수락에 성공했습니다."), + + /* + * 204 deleted + */ + DELETE_PRAY_SUCCESS(HttpStatus.NO_CONTENT, "기도제목 삭제에 성공했습니다."), + DELETE_GROUP_PRAY_SUCCESS(HttpStatus.NO_CONTENT, "모임 기도제목 삭제에 성공했습니다."), + WITHDRAWAL_SUCCESS(HttpStatus.NO_CONTENT, "회원 탈퇴에 성공했습니다."), + DELETE_CATEGORY_SUCCESS(HttpStatus.NO_CONTENT, "카테고리 삭제에 성공했습니다."); + + + private final HttpStatus httpStatus; + private final String message; + } diff --git a/src/main/java/com/uspray/uspray/infrastructure/PrayRepository.java b/src/main/java/com/uspray/uspray/infrastructure/PrayRepository.java index 27660e0a..1679441c 100644 --- a/src/main/java/com/uspray/uspray/infrastructure/PrayRepository.java +++ b/src/main/java/com/uspray/uspray/infrastructure/PrayRepository.java @@ -11,14 +11,23 @@ @Repository public interface PrayRepository extends JpaRepository, PrayRepositoryCustom { - + default Pray getPrayById(Long id) { - return findById(id).orElseThrow( - () -> new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION, - ErrorStatus.PRAY_NOT_FOUND_EXCEPTION.getMessage())); + return findById(id).orElseThrow( + () -> new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION, + ErrorStatus.PRAY_NOT_FOUND_EXCEPTION.getMessage())); } - + + default Pray getPrayByIdAndMemberId(Long prayId, String username) throws NotFoundException { + return findById(prayId) + .filter(pray -> pray.getMember().getUserId().equals(username)) + .orElseThrow(() -> new NotFoundException( + ErrorStatus.PRAY_NOT_FOUND_EXCEPTION, + ErrorStatus.PRAY_NOT_FOUND_EXCEPTION.getMessage() + )); + } + List findAllByIdIn(List prayIds); - + List findAllByDeadlineBefore(LocalDate date); } diff --git a/src/main/java/com/uspray/uspray/service/PrayService.java b/src/main/java/com/uspray/uspray/service/PrayService.java index 14e627d5..b3f36ca9 100644 --- a/src/main/java/com/uspray/uspray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/service/PrayService.java @@ -12,6 +12,7 @@ import com.uspray.uspray.infrastructure.CategoryRepository; import com.uspray.uspray.infrastructure.MemberRepository; import com.uspray.uspray.infrastructure.PrayRepository; +import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.Objects; @@ -23,79 +24,76 @@ @Service @RequiredArgsConstructor public class PrayService { - - private final PrayRepository prayRepository; - private final MemberRepository memberRepository; - private final CategoryRepository categoryRepository; - - @Transactional - public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username) { - Member member = memberRepository.getMemberByUserId(username); - Category category = categoryRepository.getCategoryById(prayRequestDto.getCategoryId()); - if (!Objects.equals(category.getMember().getId(), member.getId())) { - throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); + + private final PrayRepository prayRepository; + private final MemberRepository memberRepository; + private final CategoryRepository categoryRepository; + + @Transactional + public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username) { + Member member = memberRepository.getMemberByUserId(username); + Category category = categoryRepository.getCategoryById(prayRequestDto.getCategoryId()); + if (!Objects.equals(category.getMember().getId(), member.getId())) { + throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, + ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); + } + Pray pray = prayRequestDto.toEntity(member, category, PrayType.PERSONAL); + prayRepository.save(pray); + return PrayResponseDto.of(pray); } - Pray pray = prayRequestDto.toEntity(member, category, PrayType.PERSONAL); - prayRepository.save(pray); - return PrayResponseDto.of(pray); - } - - @Transactional - public PrayResponseDto getPrayDetail(Long prayId, String username) { - Pray pray = prayRepository.getPrayById(prayId); - if (!pray.getMember().getId().equals(memberRepository.getMemberByUserId(username).getId())) { - throw new NotFoundException(ErrorStatus.PRAY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.PRAY_UNAUTHORIZED_EXCEPTION.getMessage()); + + @Transactional + public PrayResponseDto getPrayDetail(Long prayId, String username) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + return PrayResponseDto.of(pray); } - return PrayResponseDto.of(pray); - } - - @Transactional - public PrayResponseDto deletePray(Long prayId, String username) { - Pray pray = prayRepository.findById(prayId) - .orElseThrow(() -> new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION, - ErrorStatus.PRAY_NOT_FOUND_EXCEPTION.getMessage())); - if (!pray.getMember().getId().equals(memberRepository.getMemberByUserId(username).getId())) { - throw new NotFoundException(ErrorStatus.PRAY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.PRAY_UNAUTHORIZED_EXCEPTION.getMessage()); + + @Transactional + public PrayResponseDto deletePray(Long prayId, String username) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + prayRepository.delete(pray); + return PrayResponseDto.of(pray); } - prayRepository.delete(pray); - return PrayResponseDto.of(pray); - } - - @Transactional - public PrayResponseDto updatePray(Long prayId, String username, PrayRequestDto prayRequestDto) { - Pray pray = prayRepository.findById(prayId) - .orElseThrow(() -> new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION, - ErrorStatus.PRAY_NOT_FOUND_EXCEPTION.getMessage())); - if (!pray.getMember().getId().equals(memberRepository.getMemberByUserId(username).getId())) { - throw new NotFoundException(ErrorStatus.PRAY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.PRAY_UNAUTHORIZED_EXCEPTION.getMessage()); + + @Transactional + public PrayResponseDto updatePray(Long prayId, String username, PrayRequestDto prayRequestDto) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + Category category = categoryRepository.getCategoryById(prayRequestDto.getCategoryId()); + if (!Objects.equals(category.getMember().getId(), pray.getMember().getId())) { + throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, + ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); + } + pray.update(prayRequestDto); + return PrayResponseDto.of(pray); } - Category category = categoryRepository.getCategoryById(prayRequestDto.getCategoryId()); - if (!Objects.equals(category.getMember().getId(), pray.getMember().getId())) { - throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); + + @Transactional + public List getPrayList(String username, String orderType) { + List prays = prayRepository.findAllWithOrder(orderType, username); + + // Pray 엔티티를 categoryId를 기준으로 그룹화한 맵 생성 + Map> prayMap = prays.stream() + .collect(Collectors.groupingBy(pray -> pray.getCategory().getId())); + + // 그룹화된 맵을 PrayListResponseDto 변환하여 반환 + return prayMap.entrySet().stream() + .map(entry -> new PrayListResponseDto(entry.getKey(), + entry.getValue().stream() + .map(PrayResponseDto::of) + .collect(Collectors.toList()))) + .collect(Collectors.toList()); + } + + @Transactional + public List todayPray(Long prayId, String username) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + LocalDate today = LocalDate.now(); + if (pray.getUpdatedAt().toLocalDate().isBefore(today)) { + pray.countUp(); + } else { + throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY, + ErrorStatus.ALREADY_PRAYED_TODAY.getMessage()); + } + return getPrayList(username, "date"); } - pray.update(prayRequestDto); - return PrayResponseDto.of(pray); - } - - @Transactional - public List getPrayList(String username, String orderType) { - List prays = prayRepository.findAllWithOrder(orderType, username); - - // Pray 엔티티를 categoryId를 기준으로 그룹화한 맵 생성 - Map> prayMap = prays.stream() - .collect(Collectors.groupingBy(pray -> pray.getCategory().getId())); - - // 그룹화된 맵을 PrayListResponseDto 변환하여 반환 - return prayMap.entrySet().stream() - .map(entry -> new PrayListResponseDto(entry.getKey(), - entry.getValue().stream() - .map(PrayResponseDto::of) - .collect(Collectors.toList()))) - .collect(Collectors.toList()); - } } From dfa1ef4ed2537dc3cf474a3c23ff4679b04caed3 Mon Sep 17 00:00:00 2001 From: baebae02 Date: Sat, 11 Nov 2023 22:16:24 +0900 Subject: [PATCH 02/18] refactor: add lastPrayedAt at Pray domain and PrayDto --- .../com/uspray/uspray/DTO/pray/PrayDto.java | 14 ++- .../DTO/pray/request/PrayResponseDto.java | 57 +++++---- .../java/com/uspray/uspray/domain/Pray.java | 111 +++++++++--------- 3 files changed, 95 insertions(+), 87 deletions(-) diff --git a/src/main/java/com/uspray/uspray/DTO/pray/PrayDto.java b/src/main/java/com/uspray/uspray/DTO/pray/PrayDto.java index 1910e13f..e73b695b 100644 --- a/src/main/java/com/uspray/uspray/DTO/pray/PrayDto.java +++ b/src/main/java/com/uspray/uspray/DTO/pray/PrayDto.java @@ -1,19 +1,19 @@ package com.uspray.uspray.DTO.pray; import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDate; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDate; -import java.time.LocalDateTime; - @Getter @AllArgsConstructor @Builder @NoArgsConstructor public class PrayDto { + @Schema(description = "기도제목 ID", example = "1") private Long id; @Schema(description = "기도제목 작성자 ID", example = "1") @@ -24,10 +24,16 @@ public class PrayDto { private LocalDate deadline; @Schema(description = "기도 횟수", example = "10") private Integer count; + @Schema(description = "기도제목 공유 여부", example = "true") + private Boolean isShared; + @Schema(description = "기도제목 종류", example = "PERSONAL") + private String prayType; + @Schema(description = "기도제목 마지막 기도일, example = 2021-01-01") + private LocalDate lastPrayDate; @Schema(description = "기도제목 생성일", example = "2021-01-01 00:00:00") private LocalDateTime createdAt; @Schema(description = "기도제목 수정일", example = "2021-01-01 00:00:00") private LocalDateTime updatedAt; - + } diff --git a/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java b/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java index 04d5bff3..8e5f29b3 100644 --- a/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java +++ b/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java @@ -14,30 +14,35 @@ @Builder @Schema(description = "기도제목 응답 DTO") public class PrayResponseDto { - - @Schema(description = "기도제목 id", example = "3") - private Long prayId; - - @NotNull - @Schema(description = "기도제목 내용", example = "@@이가 $$ 할 수 있도록") - private String content; - - @NotNull - @Schema(description = "기도제목 마감일", example = "2025-01-01") - private LocalDate deadline; - - @Schema(description = "기도 횟수", example = "10") - private Integer count; - - @Schema(description = "기도제목 생성일", example = "2021-01-01 00:00:00") - private LocalDateTime createdAt; - - @Schema(description = "기도제목 카테고리", example = "1") - private Long categoryId; - - public static PrayResponseDto of(Pray pray) { - return new PrayResponseDto(pray.getId(), pray.getContent(), pray.getDeadline(), - pray.getCount(), pray.getCreatedAt(), pray.getCategory().getId()); - } - + + @Schema(description = "기도제목 id", example = "3") + private Long prayId; + + @NotNull + @Schema(description = "기도제목 내용", example = "@@이가 $$ 할 수 있도록") + private String content; + + @NotNull + @Schema(description = "기도제목 마감일", example = "2025-01-01") + private LocalDate deadline; + + @Schema(description = "기도 횟수", example = "10") + private Integer count; + + @Schema(description = "기도제목 생성일", example = "2021-01-01 00:00:00") + private LocalDateTime createdAt; + + @Schema(description = "기도제목 카테고리", example = "1") + private Long categoryId; + + @Schema(description = "기도제목 마지막 기도일, example = 2021-01-01") + private LocalDate lastPrayDate; + + + public static PrayResponseDto of(Pray pray) { + return new PrayResponseDto(pray.getId(), pray.getContent(), pray.getDeadline(), + pray.getCount(), pray.getCreatedAt(), pray.getCategory().getId(), + pray.getLastPrayedAt()); + } + } diff --git a/src/main/java/com/uspray/uspray/domain/Pray.java b/src/main/java/com/uspray/uspray/domain/Pray.java index ff3baa0a..65aac6b5 100644 --- a/src/main/java/com/uspray/uspray/domain/Pray.java +++ b/src/main/java/com/uspray/uspray/domain/Pray.java @@ -30,65 +30,62 @@ @SQLDelete(sql = "UPDATE pray SET deleted = true WHERE pray_id = ?") @Where(clause = "deleted=false") public class Pray extends AuditingTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "pray_id") - private Long id; - - @ManyToOne - @JoinColumn(name = "member_id", nullable = false) - private Member member; - - private String content; - - private Integer count; - - private LocalDate deadline; - - private final Boolean deleted = false; - - private Boolean isShared = false; - - @Column(name = "origin_pray_id") - private Long originPrayId; - - @NotNull - @Enumerated(EnumType.STRING) - private PrayType prayType; - - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) - @JoinColumn(name = "grouppray_id") - private GroupPray groupPray; - - @NotNull - @ManyToOne - @JoinColumn(name = "category_id") - private Category category; - - @Builder - public Pray(Member member, String content, LocalDate deadline, Long originPrayId, - Category category, PrayType prayType) { - this.member = member; - this.content = new String(Base64.getEncoder().encode(content.getBytes())); - this.count = 0; - this.deadline = deadline; - this.originPrayId = originPrayId; - this.isShared = (originPrayId != null); - this.category = category; - this.prayType = prayType; - } - - public void update(PrayRequestDto prayRequestDto) { - this.content = prayRequestDto.getContent(); - this.deadline = prayRequestDto.getDeadline(); - } - - public String getContent() { - return new String(Base64.getDecoder().decode(content)); - } + + private final Boolean deleted = false; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "pray_id") + private Long id; + @ManyToOne + @JoinColumn(name = "member_id", nullable = false) + private Member member; + private String content; + private Integer count; + private LocalDate deadline; + private Boolean isShared = false; + + @Column(name = "origin_pray_id") + private Long originPrayId; + + @NotNull + @Enumerated(EnumType.STRING) + private PrayType prayType; + + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumn(name = "group_pray_id") + private GroupPray groupPray; + + @NotNull + @ManyToOne + @JoinColumn(name = "category_id") + private Category category; + + private LocalDate lastPrayedAt; + + @Builder + public Pray(Member member, String content, LocalDate deadline, Long originPrayId, + Category category, PrayType prayType) { + this.member = member; + this.content = new String(Base64.getEncoder().encode(content.getBytes())); + this.count = 0; + this.deadline = deadline; + this.originPrayId = originPrayId; + this.isShared = (originPrayId != null); + this.category = category; + this.prayType = prayType; + } + + public void update(PrayRequestDto prayRequestDto) { + this.content = prayRequestDto.getContent(); + this.deadline = prayRequestDto.getDeadline(); + } + + public String getContent() { + return new String(Base64.getDecoder().decode(content)); + } public void countUp() { this.count++; + this.lastPrayedAt = LocalDate.now(); } } From 076ef47fa85bb7a1737432a373f63703cd37585c Mon Sep 17 00:00:00 2001 From: baebae02 Date: Sat, 11 Nov 2023 23:34:19 +0900 Subject: [PATCH 03/18] feat: edit get pray list, delete orderType and add prayType --- .../com/uspray/uspray/Enums/PrayType.java | 14 ++++++---- .../uspray/controller/PrayController.java | 4 +-- .../uspray/exception/SuccessStatus.java | 2 +- .../querydsl/pray/PrayRepositoryCustom.java | 6 ++--- .../querydsl/pray/PrayRepositoryImpl.java | 27 ++++++++++--------- .../uspray/uspray/service/PrayService.java | 10 ++++--- 6 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/uspray/uspray/Enums/PrayType.java b/src/main/java/com/uspray/uspray/Enums/PrayType.java index 44bf9fb2..1fea6bfb 100644 --- a/src/main/java/com/uspray/uspray/Enums/PrayType.java +++ b/src/main/java/com/uspray/uspray/Enums/PrayType.java @@ -7,9 +7,13 @@ @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public enum PrayType { - SHARED("공유 기도"), - PERSONAL("개인 기도"), - GROUP("그룹 기도"), - ; - private final String title; + SHARED("공유 기도"), + PERSONAL("개인 기도"), + GROUP("그룹 기도"), + ; + private final String title; + + public String stringValue() { + return this.name(); + } } diff --git a/src/main/java/com/uspray/uspray/controller/PrayController.java b/src/main/java/com/uspray/uspray/controller/PrayController.java index 0fc837be..c0ef69da 100644 --- a/src/main/java/com/uspray/uspray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/controller/PrayController.java @@ -47,10 +47,10 @@ public class PrayController { @GetMapping() public ApiResponseDto> getPrayList( @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "정렬 기준 (date, count)", required = true, example = "date") String orderType + @Parameter(description = "기도제목 종류(personal, shared)", required = true, example = "personal") String prayType ) { return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, - prayService.getPrayList(user.getUsername(), orderType)); + prayService.getPrayList(user.getUsername(), prayType)); } @GetMapping("/{prayId}") diff --git a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java index b1836b88..ac6f0554 100644 --- a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java +++ b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java @@ -31,7 +31,7 @@ public enum SuccessStatus { GET_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 조회에 성공했습니다."), GET_HISTORY_LIST_SUCCESS(HttpStatus.OK, "히스토리 목록 조회에 성공했습니다."), GET_HISTORY_DETAIL_SUCCESS(HttpStatus.OK, "히스토리 상세 조회에 성공했습니다."), - INCREASE_PRAY_COUNT_SUCCESS(HttpStatus.OK, "기도제목 카운트 증가에 성공했습니다."), + INCREASE_PRAY_COUNT_SUCCESS(HttpStatus.OK, "기도 횟수 추가에 성공했습니다."), /* * 201 created diff --git a/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryCustom.java b/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryCustom.java index 15013da0..00f96e9c 100644 --- a/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryCustom.java +++ b/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryCustom.java @@ -4,7 +4,7 @@ import java.util.List; public interface PrayRepositoryCustom { - - List findAllWithOrder(String orderType, String username); - + + List findAllWithOrderAndType(String username, String prayType); + } diff --git a/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryImpl.java b/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryImpl.java index fac9907a..e8cb7d0f 100644 --- a/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryImpl.java +++ b/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryImpl.java @@ -12,18 +12,19 @@ @Repository @RequiredArgsConstructor public class PrayRepositoryImpl implements PrayRepositoryCustom { - - private final JPAQueryFactory queryFactory; - - @Override - public List findAllWithOrder(String orderType, String username) { - return queryFactory - .select(pray) - .from(pray) - .join(pray.category, category) - .where(category.member.userId.eq(username)) - .orderBy(orderType.equals("date") ? pray.createdAt.desc() : pray.count.asc()) - .fetch(); - } + + private final JPAQueryFactory queryFactory; + + @Override + public List findAllWithOrderAndType(String username, String prayType) { + return queryFactory + .select(pray) + .from(pray) + .join(pray.category, category) + .where(category.member.userId.eq(username)) + .where(pray.prayType.stringValue().likeIgnoreCase(prayType)) + .orderBy(pray.createdAt.asc()) + .fetch(); + } } diff --git a/src/main/java/com/uspray/uspray/service/PrayService.java b/src/main/java/com/uspray/uspray/service/PrayService.java index b3f36ca9..3c3ca8bb 100644 --- a/src/main/java/com/uspray/uspray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/service/PrayService.java @@ -68,8 +68,9 @@ public PrayResponseDto updatePray(Long prayId, String username, PrayRequestDto p } @Transactional - public List getPrayList(String username, String orderType) { - List prays = prayRepository.findAllWithOrder(orderType, username); + public List getPrayList(String username, String prayType) { + + List prays = prayRepository.findAllWithOrderAndType(username, prayType); // Pray 엔티티를 categoryId를 기준으로 그룹화한 맵 생성 Map> prayMap = prays.stream() @@ -78,6 +79,7 @@ public List getPrayList(String username, String orderType) // 그룹화된 맵을 PrayListResponseDto 변환하여 반환 return prayMap.entrySet().stream() .map(entry -> new PrayListResponseDto(entry.getKey(), + entry.getValue().get(0).getCategory().getName(), entry.getValue().stream() .map(PrayResponseDto::of) .collect(Collectors.toList()))) @@ -88,12 +90,12 @@ public List getPrayList(String username, String orderType) public List todayPray(Long prayId, String username) { Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); LocalDate today = LocalDate.now(); - if (pray.getUpdatedAt().toLocalDate().isBefore(today)) { + if (pray.getLastPrayedAt() == null || !pray.getLastPrayedAt().equals(today)) { pray.countUp(); } else { throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY, ErrorStatus.ALREADY_PRAYED_TODAY.getMessage()); } - return getPrayList(username, "date"); + return getPrayList(username, PrayType.PERSONAL.stringValue()); } } From 57a2fb1ada8f0d48bf99aeedfe0c8ef1dd38aafc Mon Sep 17 00:00:00 2001 From: baebae02 Date: Sat, 11 Nov 2023 23:34:46 +0900 Subject: [PATCH 04/18] feat: add categoryName at PrayResponseDto and PrayListResponseDto --- .../uspray/uspray/DTO/pray/PrayListResponseDto.java | 11 +++++++---- .../uspray/DTO/pray/request/PrayResponseDto.java | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/uspray/uspray/DTO/pray/PrayListResponseDto.java b/src/main/java/com/uspray/uspray/DTO/pray/PrayListResponseDto.java index c961e08d..df71933d 100644 --- a/src/main/java/com/uspray/uspray/DTO/pray/PrayListResponseDto.java +++ b/src/main/java/com/uspray/uspray/DTO/pray/PrayListResponseDto.java @@ -13,8 +13,11 @@ @Builder @NoArgsConstructor public class PrayListResponseDto { - - @Schema(description = "카테고리 ID", example = "1") - private Long categoryId; - private List prays; + + @Schema(description = "카테고리 ID", example = "1") + private Long categoryId; + @Schema(description = "카테고리 이름", example = "카테고리 이름") + private String categoryName; + private List prays; + } diff --git a/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java b/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java index 8e5f29b3..82579551 100644 --- a/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java +++ b/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java @@ -35,6 +35,9 @@ public class PrayResponseDto { @Schema(description = "기도제목 카테고리", example = "1") private Long categoryId; + @Schema(description = "기도제목 카테고리 이름", example = "카테고리 이름") + private String categoryName; + @Schema(description = "기도제목 마지막 기도일, example = 2021-01-01") private LocalDate lastPrayDate; @@ -42,6 +45,7 @@ public class PrayResponseDto { public static PrayResponseDto of(Pray pray) { return new PrayResponseDto(pray.getId(), pray.getContent(), pray.getDeadline(), pray.getCount(), pray.getCreatedAt(), pray.getCategory().getId(), + pray.getCategory().getName(), pray.getLastPrayedAt()); } From c5c562e9cff6f4de919392bf755a8ae591ca2104 Mon Sep 17 00:00:00 2001 From: Seo Hyeon Bae <76519535+baebae02@users.noreply.github.com> Date: Sat, 11 Nov 2023 23:39:56 +0900 Subject: [PATCH 05/18] Update src/main/java/com/uspray/uspray/exception/ErrorStatus.java Co-authored-by: Sion Shin <82511301+Sion99@users.noreply.github.com> --- src/main/java/com/uspray/uspray/exception/ErrorStatus.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/uspray/uspray/exception/ErrorStatus.java b/src/main/java/com/uspray/uspray/exception/ErrorStatus.java index 8b71e988..3cfcc2f8 100644 --- a/src/main/java/com/uspray/uspray/exception/ErrorStatus.java +++ b/src/main/java/com/uspray/uspray/exception/ErrorStatus.java @@ -18,7 +18,7 @@ public enum ErrorStatus { SENDER_RECEIVER_SAME_EXCEPTION(HttpStatus.BAD_REQUEST, "자신에게는 기도제목을 공유할 수 없습니다."), CATEGORY_ALREADY_EXIST_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 카테고리입니다."), CATEGORY_LIMIT_EXCEPTION(HttpStatus.BAD_REQUEST, "카테고리는 최대 7개까지 생성 가능합니다."), - ALREADY_PRAYED_TODAY(HttpStatus.BAD_REQUEST, "오늘은 이미 기도하셨습니다."), + ALREADY_PRAYED_TODAY(HttpStatus.BAD_REQUEST, "오늘 이미 기도한 기도제목입니다."), /* * 401 UNAUTHORIZED From d2d5975bf152f498a2e5d4a6055e3c7e5c4690cd Mon Sep 17 00:00:00 2001 From: baebae02 Date: Sat, 11 Nov 2023 23:54:41 +0900 Subject: [PATCH 06/18] refactor: add orderBy category order at get pray list --- .../DTO/category/CategoryRequestDto.java | 37 +++---- src/main/java/com/uspray/uspray/InitDb.java | 52 ++++++++-- .../querydsl/pray/PrayRepositoryImpl.java | 1 + .../uspray/service/CategoryService.java | 96 ++++++++++--------- 4 files changed, 113 insertions(+), 73 deletions(-) diff --git a/src/main/java/com/uspray/uspray/DTO/category/CategoryRequestDto.java b/src/main/java/com/uspray/uspray/DTO/category/CategoryRequestDto.java index 60d357e0..43060e71 100644 --- a/src/main/java/com/uspray/uspray/DTO/category/CategoryRequestDto.java +++ b/src/main/java/com/uspray/uspray/DTO/category/CategoryRequestDto.java @@ -15,22 +15,23 @@ @Builder @Schema(description = "카테고리 DTO") public class CategoryRequestDto { - - @NotNull - @Schema(description = "카테고리 이름", example = "카테고리 이름") - private String name; - - @NotNull - @Schema(description = "카테고리 색상", example = "#FFFFFF") - private String color; - - - public Category toEntity(Member member) { - return Category.builder() - .name(name) - .color(color) - .member(member) - .build(); - } - + + @NotNull + @Schema(description = "카테고리 이름", example = "카테고리 이름") + private String name; + + @NotNull + @Schema(description = "카테고리 색상", example = "#FFFFFF") + private String color; + + + public Category toEntity(Member member, Integer order) { + return Category.builder() + .name(name) + .color(color) + .member(member) + .order(order) + .build(); + } + } diff --git a/src/main/java/com/uspray/uspray/InitDb.java b/src/main/java/com/uspray/uspray/InitDb.java index 6281b3cf..ea9ef927 100644 --- a/src/main/java/com/uspray/uspray/InitDb.java +++ b/src/main/java/com/uspray/uspray/InitDb.java @@ -17,21 +17,22 @@ @Component @RequiredArgsConstructor public class InitDb { - + private final InitService initService; + @PostConstruct public void init() { initService.dbInit(); } - + @Component @Transactional @RequiredArgsConstructor static class InitService { - + private final EntityManager em; private final PasswordEncoder passwordEncoder; - + @Transactional public void dbInit() { Member member = Member.builder() @@ -44,14 +45,22 @@ public void dbInit() { .authority(Authority.ROLE_USER) .build(); em.persist(member); - + Category category = Category.builder() .name("기타 카테고리") .color("#FFFFFF") .member(member) .build(); em.persist(category); - + + Category category1 = Category.builder() + .name("가족") + .color("#408CFF") + .member(member) + .order(1) + .build(); + em.persist(category1); + Pray pray = Pray.builder() .content("테스트 기도") .deadline(LocalDate.parse("2025-01-01")) @@ -60,12 +69,39 @@ public void dbInit() { .prayType(PrayType.PERSONAL) .build(); em.persist(pray); - + + Pray pray1 = Pray.builder() + .content("기도합니다") + .deadline(LocalDate.parse("2025-02-24")) + .member(member) + .category(category) + .prayType(PrayType.SHARED) + .build(); + em.persist(pray1); + + Pray pray2 = Pray.builder() + .content("기도할게요") + .deadline(LocalDate.parse("2024-02-24")) + .member(member) + .category(category1) + .prayType(PrayType.SHARED) + .build(); + em.persist(pray2); + + Pray pray3 = Pray.builder() + .content("기도할게요") + .deadline(LocalDate.parse("2024-02-02")) + .member(member) + .category(category1) + .prayType(PrayType.PERSONAL) + .build(); + em.persist(pray3); + History history = History.builder() .pray(pray) .build(); em.persist(history); } - + } } diff --git a/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryImpl.java b/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryImpl.java index e8cb7d0f..5ea1f47d 100644 --- a/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryImpl.java +++ b/src/main/java/com/uspray/uspray/infrastructure/querydsl/pray/PrayRepositoryImpl.java @@ -24,6 +24,7 @@ public List findAllWithOrderAndType(String username, String prayType) { .where(category.member.userId.eq(username)) .where(pray.prayType.stringValue().likeIgnoreCase(prayType)) .orderBy(pray.createdAt.asc()) + .orderBy(pray.category.order.asc()) .fetch(); } } diff --git a/src/main/java/com/uspray/uspray/service/CategoryService.java b/src/main/java/com/uspray/uspray/service/CategoryService.java index b183d208..a341b23a 100644 --- a/src/main/java/com/uspray/uspray/service/CategoryService.java +++ b/src/main/java/com/uspray/uspray/service/CategoryService.java @@ -14,55 +14,57 @@ @Service @RequiredArgsConstructor public class CategoryService { - - private final MemberRepository memberRepository; - private final CategoryRepository categoryRepository; - - public CategoryResponseDto createCategory(String username, - CategoryRequestDto categoryRequestDto) { - Member member = memberRepository.getMemberByUserId(username); - if (categoryRepository.existsCategoryByNameAndMember(categoryRequestDto.getName(), member)) { - throw new NotFoundException(ErrorStatus.CATEGORY_ALREADY_EXIST_EXCEPTION, - ErrorStatus.CATEGORY_ALREADY_EXIST_EXCEPTION.getMessage()); - } - if (categoryRepository.countCategoryByMember(member) > 7) { - throw new NotFoundException(ErrorStatus.CATEGORY_LIMIT_EXCEPTION, - ErrorStatus.CATEGORY_LIMIT_EXCEPTION.getMessage()); + + private final MemberRepository memberRepository; + private final CategoryRepository categoryRepository; + + public CategoryResponseDto createCategory(String username, + CategoryRequestDto categoryRequestDto) { + Member member = memberRepository.getMemberByUserId(username); + if (categoryRepository.existsCategoryByNameAndMember(categoryRequestDto.getName(), + member)) { + throw new NotFoundException(ErrorStatus.CATEGORY_ALREADY_EXIST_EXCEPTION, + ErrorStatus.CATEGORY_ALREADY_EXIST_EXCEPTION.getMessage()); + } + int categoryCount = categoryRepository.countCategoryByMember(member); + if (categoryCount > 7) { + throw new NotFoundException(ErrorStatus.CATEGORY_LIMIT_EXCEPTION, + ErrorStatus.CATEGORY_LIMIT_EXCEPTION.getMessage()); + } + Category category = categoryRequestDto.toEntity(member, categoryCount); + categoryRepository.save(category); + return CategoryResponseDto.of(category); } - Category category = categoryRequestDto.toEntity(member); - categoryRepository.save(category); - return CategoryResponseDto.of(category); - } - - public CategoryResponseDto deleteCategory(String username, Long categoryId) { - Category category = categoryRepository.getCategoryById(categoryId); - if (categoryRepository.existsCategoryByIdAndMember(categoryId, - memberRepository.getMemberByUserId(username))) { - throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); + + public CategoryResponseDto deleteCategory(String username, Long categoryId) { + Category category = categoryRepository.getCategoryById(categoryId); + if (categoryRepository.existsCategoryByIdAndMember(categoryId, + memberRepository.getMemberByUserId(username))) { + throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, + ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); + } + return CategoryResponseDto.of(category); } - return CategoryResponseDto.of(category); - } - - public CategoryResponseDto updateCategory(String username, Long categoryId, - CategoryRequestDto categoryRequestDto) { - Category category = categoryRepository.getCategoryById(categoryId); - if (categoryRepository.existsCategoryByIdAndMember(categoryId, - memberRepository.getMemberByUserId(username))) { - throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); + + public CategoryResponseDto updateCategory(String username, Long categoryId, + CategoryRequestDto categoryRequestDto) { + Category category = categoryRepository.getCategoryById(categoryId); + if (categoryRepository.existsCategoryByIdAndMember(categoryId, + memberRepository.getMemberByUserId(username))) { + throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, + ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); + } + category.update(categoryRequestDto); + return CategoryResponseDto.of(category); } - category.update(categoryRequestDto); - return CategoryResponseDto.of(category); - } - - public CategoryResponseDto getCategory(String username, Long categoryId) { - Category category = categoryRepository.getCategoryById(categoryId); - if (categoryRepository.existsCategoryByIdAndMember(categoryId, - memberRepository.getMemberByUserId(username))) { - throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); + + public CategoryResponseDto getCategory(String username, Long categoryId) { + Category category = categoryRepository.getCategoryById(categoryId); + if (categoryRepository.existsCategoryByIdAndMember(categoryId, + memberRepository.getMemberByUserId(username))) { + throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, + ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); + } + return CategoryResponseDto.of(category); } - return CategoryResponseDto.of(category); - } } From 72626d6248d4232e5fd83ac321a75da77acf39b2 Mon Sep 17 00:00:00 2001 From: baebae02 Date: Sun, 12 Nov 2023 00:43:02 +0900 Subject: [PATCH 07/18] feat: add createPray at HistoryService --- .../uspray/controller/HistoryController.java | 49 ++++++++++++++----- .../uspray/uspray/exception/ErrorStatus.java | 2 +- .../infrastructure/HistoryRepository.java | 8 +-- .../uspray/uspray/service/HistoryService.java | 48 ++++++++++++------ 4 files changed, 74 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/uspray/uspray/controller/HistoryController.java b/src/main/java/com/uspray/uspray/controller/HistoryController.java index fbc8abf1..d0f08a7b 100644 --- a/src/main/java/com/uspray/uspray/controller/HistoryController.java +++ b/src/main/java/com/uspray/uspray/controller/HistoryController.java @@ -3,17 +3,26 @@ import com.uspray.uspray.DTO.ApiResponseDto; import com.uspray.uspray.DTO.history.response.HistoryDetailResponseDto; import com.uspray.uspray.DTO.history.response.HistoryListResponseDto; +import com.uspray.uspray.DTO.pray.request.PrayRequestDto; import com.uspray.uspray.exception.SuccessStatus; import com.uspray.uspray.service.HistoryService; +import com.uspray.uspray.service.PrayService; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import java.time.LocalDate; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.User; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/history") @@ -21,8 +30,10 @@ @RequiredArgsConstructor @SecurityRequirement(name = "JWT Auth") public class HistoryController { + private final HistoryService historyService; - + private final PrayService prayService; + @GetMapping public ApiResponseDto getHistoryList( @Parameter(hidden = true) @AuthenticationPrincipal User user, @@ -32,24 +43,25 @@ public ApiResponseDto getHistoryList( return ApiResponseDto.success(SuccessStatus.GET_HISTORY_LIST_SUCCESS, historyService.getHistoryList(user.getUsername(), type, page, size)); } - + // 이름, 내용, 카테고리에 해당되는 키워드 전부를 찾아서 검색 // 내가 쓴 기도제목, 공유받은 기도제목 체크박스 (최소 한 개 이상 선택) // 날짜까지 (옵션) @GetMapping("/search") public ApiResponseDto searchHistoryList( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @RequestParam(required = false) String keyword, - @RequestParam Boolean isPersonal, - @RequestParam Boolean isShared, - @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate, - @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate, - @RequestParam(value = "page", defaultValue = "0") int page, - @RequestParam(value = "size", defaultValue = "10") int size) { + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @RequestParam(required = false) String keyword, + @RequestParam Boolean isPersonal, + @RequestParam Boolean isShared, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate, + @RequestParam(value = "page", defaultValue = "0") int page, + @RequestParam(value = "size", defaultValue = "10") int size) { return ApiResponseDto.success(SuccessStatus.GET_HISTORY_LIST_SUCCESS, - historyService.searchHistoryList(user.getUsername(), keyword, isPersonal, isShared, startDate, endDate, page, size)); + historyService.searchHistoryList(user.getUsername(), keyword, isPersonal, isShared, + startDate, endDate, page, size)); } - + @GetMapping("/detail/{historyId}") public ApiResponseDto getHistoryDetail( @Parameter(hidden = true) @AuthenticationPrincipal User user, @@ -57,4 +69,15 @@ public ApiResponseDto getHistoryDetail( return ApiResponseDto.success(SuccessStatus.GET_HISTORY_DETAIL_SUCCESS, historyService.getHistoryDetail(user.getUsername(), historyId)); } + + @PostMapping("/pray/{historyId}") + public ApiResponseDto createPray( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @PathVariable Long historyId, + @RequestBody @Valid PrayRequestDto prayRequestDto) { + prayService.createPray(prayRequestDto, user.getUsername()); + historyService.deleteHistory(historyId, user.getUsername()); + return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, + historyService.getHistoryList(user.getUsername(), "PERSONAL", 0, 10)); + } } diff --git a/src/main/java/com/uspray/uspray/exception/ErrorStatus.java b/src/main/java/com/uspray/uspray/exception/ErrorStatus.java index 3cfcc2f8..e1ea5c76 100644 --- a/src/main/java/com/uspray/uspray/exception/ErrorStatus.java +++ b/src/main/java/com/uspray/uspray/exception/ErrorStatus.java @@ -38,7 +38,7 @@ public enum ErrorStatus { PRAY_NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "해당 기도제목을 찾을 수 없습니다."), PRAY_ALREADY_DELETED_EXCEPTION(HttpStatus.NOT_FOUND, "원본 기도제목이 삭제되었습니다."), NOT_FOUND_SHARED_PRAY_EXCEPTION(HttpStatus.NOT_FOUND, "해당 공유기도제목을 찾을 수 없습니다."), - ; + HISTORY_NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "해당 히스토리를 찾을 수 없습니다."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/com/uspray/uspray/infrastructure/HistoryRepository.java b/src/main/java/com/uspray/uspray/infrastructure/HistoryRepository.java index e159c8af..79ba2215 100644 --- a/src/main/java/com/uspray/uspray/infrastructure/HistoryRepository.java +++ b/src/main/java/com/uspray/uspray/infrastructure/HistoryRepository.java @@ -1,7 +1,6 @@ package com.uspray.uspray.infrastructure; import com.uspray.uspray.domain.History; - import com.uspray.uspray.domain.Member; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -10,8 +9,11 @@ @Repository public interface HistoryRepository extends JpaRepository, HistoryRepositoryCustom { - + Page findByMemberAndOriginPrayIdIsNull(Member member, Pageable pageable); - + Page findByMemberAndOriginPrayIdIsNotNull(Member member, Pageable pageable); + + + History findByIdAndMember(Long historyId, Member member); } diff --git a/src/main/java/com/uspray/uspray/service/HistoryService.java b/src/main/java/com/uspray/uspray/service/HistoryService.java index 7f92190a..f914b008 100644 --- a/src/main/java/com/uspray/uspray/service/HistoryService.java +++ b/src/main/java/com/uspray/uspray/service/HistoryService.java @@ -7,13 +7,13 @@ import com.uspray.uspray.domain.History; import com.uspray.uspray.domain.Member; import com.uspray.uspray.domain.Pray; +import com.uspray.uspray.exception.ErrorStatus; +import com.uspray.uspray.exception.model.NotFoundException; import com.uspray.uspray.infrastructure.HistoryRepository; - +import com.uspray.uspray.infrastructure.MemberRepository; import com.uspray.uspray.infrastructure.PrayRepository; import java.time.LocalDate; import java.util.List; - -import com.uspray.uspray.infrastructure.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -25,20 +25,21 @@ @Service @RequiredArgsConstructor public class HistoryService { - + private final HistoryRepository historyRepository; private final MemberRepository memberRepository; private final PrayRepository prayRepository; - + @Transactional(readOnly = true) public HistoryListResponseDto getHistoryList(String username, String type, int page, int size) { // type은 대소문자 구분하지 않습니다 - + Pageable pageable = PageRequest.of(page, size, Sort.by("deadline").descending()); Member member = memberRepository.getMemberByUserId(username); Page historyList; if (PrayType.PERSONAL.name().equalsIgnoreCase(type)) { - historyList = historyRepository.findByMemberAndOriginPrayIdIsNull(member, pageable).map(HistoryResponseDto::of); + historyList = historyRepository.findByMemberAndOriginPrayIdIsNull(member, pageable) + .map(HistoryResponseDto::of); } else if (PrayType.SHARED.name().equalsIgnoreCase(type)) { historyList = historyRepository.findByMemberAndOriginPrayIdIsNotNull( member, pageable).map(HistoryResponseDto::of); @@ -48,29 +49,35 @@ public HistoryListResponseDto getHistoryList(String username, String type, int p return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); } - + @Transactional(readOnly = true) - public HistoryListResponseDto searchHistoryList(String username, String keyword, Boolean isPersonal, Boolean isShared, LocalDate startDate, LocalDate endDate, int page, int size) { - + public HistoryListResponseDto searchHistoryList(String username, String keyword, + Boolean isPersonal, Boolean isShared, LocalDate startDate, LocalDate endDate, int page, + int size) { + // 전체 파라미터가 null 인 경우 예외처리 - if (keyword == null && isPersonal == null && isShared == null && startDate == null && endDate == null) { + if (keyword == null && isPersonal == null && isShared == null && startDate == null + && endDate == null) { throw new IllegalArgumentException("검색 조건이 없습니다."); } Pageable pageable = PageRequest.of(page, size, Sort.by("deadline").descending()); - Page historyList = historyRepository.findBySearchOption(username, keyword, isPersonal, isShared, startDate, endDate, pageable).map(HistoryResponseDto::of); + Page historyList = historyRepository.findBySearchOption(username, + keyword, isPersonal, isShared, startDate, endDate, pageable) + .map(HistoryResponseDto::of); return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); } - + @Transactional(readOnly = true) public HistoryDetailResponseDto getHistoryDetail(String username, Long historyId) { Member member = memberRepository.getMemberByUserId(username); - History history = historyRepository.findById(historyId).orElseThrow(() -> new IllegalArgumentException("해당 히스토리가 없습니다. id=" + historyId)); + History history = historyRepository.findById(historyId) + .orElseThrow(() -> new IllegalArgumentException("해당 히스토리가 없습니다. id=" + historyId)); if (!history.getMember().equals(member)) { throw new IllegalArgumentException("해당 히스토리에 대한 권한이 없습니다."); } return HistoryDetailResponseDto.of(history); } - + @Transactional public void convertPrayToHistory() { List prayList = prayRepository.findAllByDeadlineBefore(LocalDate.now()); @@ -82,5 +89,14 @@ public void convertPrayToHistory() { prayRepository.delete(pray); } } - + + public void deleteHistory(Long historyId, String username) { + Member member = memberRepository.getMemberByUserId(username); + History history = historyRepository.findByIdAndMember(historyId, member); + if (history == null) { + throw new NotFoundException(ErrorStatus.HISTORY_NOT_FOUND_EXCEPTION, + ErrorStatus.HISTORY_NOT_FOUND_EXCEPTION.getMessage()); + } + historyRepository.delete(history); + } } From acae24fa5f3a5050064059368f9e405fe44907ce Mon Sep 17 00:00:00 2001 From: baebae02 Date: Sun, 12 Nov 2023 00:48:24 +0900 Subject: [PATCH 08/18] refactor: edit default prayType to lowercase --- .../java/com/uspray/uspray/controller/HistoryController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/uspray/uspray/controller/HistoryController.java b/src/main/java/com/uspray/uspray/controller/HistoryController.java index d0f08a7b..51eba0a3 100644 --- a/src/main/java/com/uspray/uspray/controller/HistoryController.java +++ b/src/main/java/com/uspray/uspray/controller/HistoryController.java @@ -37,7 +37,7 @@ public class HistoryController { @GetMapping public ApiResponseDto getHistoryList( @Parameter(hidden = true) @AuthenticationPrincipal User user, - @RequestParam(value = "type", defaultValue = "PERSONAL") String type, + @RequestParam(value = "type", defaultValue = "personal") String type, @RequestParam(value = "page", defaultValue = "0") int page, @RequestParam(value = "size", defaultValue = "10") int size) { return ApiResponseDto.success(SuccessStatus.GET_HISTORY_LIST_SUCCESS, From ee7d21f5c6f1627734416fe70bd1e6363458d9bf Mon Sep 17 00:00:00 2001 From: baebae02 Date: Sun, 12 Nov 2023 01:29:21 +0900 Subject: [PATCH 09/18] feat: complete pray and create history --- .../uspray/controller/PrayController.java | 17 +++++++++++++++++ .../java/com/uspray/uspray/domain/Pray.java | 4 ++++ .../uspray/uspray/exception/SuccessStatus.java | 2 +- .../uspray/uspray/service/HistoryService.java | 9 +++++++++ .../com/uspray/uspray/service/PrayService.java | 8 ++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/uspray/uspray/controller/PrayController.java b/src/main/java/com/uspray/uspray/controller/PrayController.java index c0ef69da..bc5c84c9 100644 --- a/src/main/java/com/uspray/uspray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/controller/PrayController.java @@ -6,6 +6,7 @@ import com.uspray.uspray.DTO.pray.request.PrayRequestDto; import com.uspray.uspray.DTO.pray.request.PrayResponseDto; import com.uspray.uspray.exception.SuccessStatus; +import com.uspray.uspray.service.HistoryService; import com.uspray.uspray.service.PrayService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -38,6 +39,7 @@ public class PrayController { private final PrayService prayService; + private final HistoryService historyService; @Operation(summary = "기도제목 목록 조회") @ApiResponse( @@ -121,4 +123,19 @@ public ApiResponseDto> todayPray( return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, prayService.todayPray(prayId, user.getUsername())); } + + @Operation(summary = "기도 완료하기") + @ApiResponse( + responseCode = "200", + description = "기도 완료하기", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + @PutMapping("/{prayId}/complete") + public ApiResponseDto> completePray( + @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, + @Parameter(hidden = true) @AuthenticationPrincipal User user + ) { + historyService.createHistory(user.getUsername(), prayId); + return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, + prayService.completePray(prayId, user.getUsername())); + } } diff --git a/src/main/java/com/uspray/uspray/domain/Pray.java b/src/main/java/com/uspray/uspray/domain/Pray.java index 65aac6b5..05a95c62 100644 --- a/src/main/java/com/uspray/uspray/domain/Pray.java +++ b/src/main/java/com/uspray/uspray/domain/Pray.java @@ -88,4 +88,8 @@ public void countUp() { this.count++; this.lastPrayedAt = LocalDate.now(); } + + public void complete() { + this.deadline = LocalDate.now(); + } } diff --git a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java index ac6f0554..3d57a079 100644 --- a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java +++ b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java @@ -32,7 +32,7 @@ public enum SuccessStatus { GET_HISTORY_LIST_SUCCESS(HttpStatus.OK, "히스토리 목록 조회에 성공했습니다."), GET_HISTORY_DETAIL_SUCCESS(HttpStatus.OK, "히스토리 상세 조회에 성공했습니다."), INCREASE_PRAY_COUNT_SUCCESS(HttpStatus.OK, "기도 횟수 추가에 성공했습니다."), - + COMPLETE_PRAY_SUCCESS(HttpStatus.OK, "기도제목 완료에 성공했습니다."), /* * 201 created */ diff --git a/src/main/java/com/uspray/uspray/service/HistoryService.java b/src/main/java/com/uspray/uspray/service/HistoryService.java index f914b008..635278b6 100644 --- a/src/main/java/com/uspray/uspray/service/HistoryService.java +++ b/src/main/java/com/uspray/uspray/service/HistoryService.java @@ -90,6 +90,15 @@ public void convertPrayToHistory() { } } + public void createHistory(String username, Long prayId) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + pray.complete(); + History history = History.builder() + .pray(pray) + .build(); + historyRepository.save(history); + } + public void deleteHistory(Long historyId, String username) { Member member = memberRepository.getMemberByUserId(username); History history = historyRepository.findByIdAndMember(historyId, member); diff --git a/src/main/java/com/uspray/uspray/service/PrayService.java b/src/main/java/com/uspray/uspray/service/PrayService.java index 3c3ca8bb..f21ae34e 100644 --- a/src/main/java/com/uspray/uspray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/service/PrayService.java @@ -98,4 +98,12 @@ public List todayPray(Long prayId, String username) { } return getPrayList(username, PrayType.PERSONAL.stringValue()); } + + @Transactional + public List completePray(Long prayId, String username) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + prayRepository.delete(pray); + + return getPrayList(username, pray.getPrayType().stringValue()); + } } From 5da74206fdc09587576f78d52bd12f1c84c78d1f Mon Sep 17 00:00:00 2001 From: baebae02 Date: Sun, 12 Nov 2023 01:37:09 +0900 Subject: [PATCH 10/18] Revert "feat: complete pray and create history" This reverts commit ee7d21f5c6f1627734416fe70bd1e6363458d9bf. --- .../uspray/controller/PrayController.java | 17 ----------------- .../java/com/uspray/uspray/domain/Pray.java | 4 ---- .../uspray/uspray/exception/SuccessStatus.java | 2 +- .../uspray/uspray/service/HistoryService.java | 9 --------- .../com/uspray/uspray/service/PrayService.java | 8 -------- 5 files changed, 1 insertion(+), 39 deletions(-) diff --git a/src/main/java/com/uspray/uspray/controller/PrayController.java b/src/main/java/com/uspray/uspray/controller/PrayController.java index bc5c84c9..c0ef69da 100644 --- a/src/main/java/com/uspray/uspray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/controller/PrayController.java @@ -6,7 +6,6 @@ import com.uspray.uspray.DTO.pray.request.PrayRequestDto; import com.uspray.uspray.DTO.pray.request.PrayResponseDto; import com.uspray.uspray.exception.SuccessStatus; -import com.uspray.uspray.service.HistoryService; import com.uspray.uspray.service.PrayService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -39,7 +38,6 @@ public class PrayController { private final PrayService prayService; - private final HistoryService historyService; @Operation(summary = "기도제목 목록 조회") @ApiResponse( @@ -123,19 +121,4 @@ public ApiResponseDto> todayPray( return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, prayService.todayPray(prayId, user.getUsername())); } - - @Operation(summary = "기도 완료하기") - @ApiResponse( - responseCode = "200", - description = "기도 완료하기", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) - @PutMapping("/{prayId}/complete") - public ApiResponseDto> completePray( - @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, - @Parameter(hidden = true) @AuthenticationPrincipal User user - ) { - historyService.createHistory(user.getUsername(), prayId); - return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, - prayService.completePray(prayId, user.getUsername())); - } } diff --git a/src/main/java/com/uspray/uspray/domain/Pray.java b/src/main/java/com/uspray/uspray/domain/Pray.java index 05a95c62..65aac6b5 100644 --- a/src/main/java/com/uspray/uspray/domain/Pray.java +++ b/src/main/java/com/uspray/uspray/domain/Pray.java @@ -88,8 +88,4 @@ public void countUp() { this.count++; this.lastPrayedAt = LocalDate.now(); } - - public void complete() { - this.deadline = LocalDate.now(); - } } diff --git a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java index 3d57a079..ac6f0554 100644 --- a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java +++ b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java @@ -32,7 +32,7 @@ public enum SuccessStatus { GET_HISTORY_LIST_SUCCESS(HttpStatus.OK, "히스토리 목록 조회에 성공했습니다."), GET_HISTORY_DETAIL_SUCCESS(HttpStatus.OK, "히스토리 상세 조회에 성공했습니다."), INCREASE_PRAY_COUNT_SUCCESS(HttpStatus.OK, "기도 횟수 추가에 성공했습니다."), - COMPLETE_PRAY_SUCCESS(HttpStatus.OK, "기도제목 완료에 성공했습니다."), + /* * 201 created */ diff --git a/src/main/java/com/uspray/uspray/service/HistoryService.java b/src/main/java/com/uspray/uspray/service/HistoryService.java index 635278b6..f914b008 100644 --- a/src/main/java/com/uspray/uspray/service/HistoryService.java +++ b/src/main/java/com/uspray/uspray/service/HistoryService.java @@ -90,15 +90,6 @@ public void convertPrayToHistory() { } } - public void createHistory(String username, Long prayId) { - Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); - pray.complete(); - History history = History.builder() - .pray(pray) - .build(); - historyRepository.save(history); - } - public void deleteHistory(Long historyId, String username) { Member member = memberRepository.getMemberByUserId(username); History history = historyRepository.findByIdAndMember(historyId, member); diff --git a/src/main/java/com/uspray/uspray/service/PrayService.java b/src/main/java/com/uspray/uspray/service/PrayService.java index f21ae34e..3c3ca8bb 100644 --- a/src/main/java/com/uspray/uspray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/service/PrayService.java @@ -98,12 +98,4 @@ public List todayPray(Long prayId, String username) { } return getPrayList(username, PrayType.PERSONAL.stringValue()); } - - @Transactional - public List completePray(Long prayId, String username) { - Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); - prayRepository.delete(pray); - - return getPrayList(username, pray.getPrayType().stringValue()); - } } From bcaeed21320e7e4c57f0525b40effc134093f8a2 Mon Sep 17 00:00:00 2001 From: baebae02 Date: Sun, 12 Nov 2023 01:40:01 +0900 Subject: [PATCH 11/18] Revert "Revert "feat: complete pray and create history"" This reverts commit 5da74206fdc09587576f78d52bd12f1c84c78d1f. --- .../uspray/controller/PrayController.java | 17 +++++++++++++++++ .../java/com/uspray/uspray/domain/Pray.java | 4 ++++ .../uspray/uspray/exception/SuccessStatus.java | 2 +- .../uspray/uspray/service/HistoryService.java | 9 +++++++++ .../com/uspray/uspray/service/PrayService.java | 8 ++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/uspray/uspray/controller/PrayController.java b/src/main/java/com/uspray/uspray/controller/PrayController.java index c0ef69da..bc5c84c9 100644 --- a/src/main/java/com/uspray/uspray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/controller/PrayController.java @@ -6,6 +6,7 @@ import com.uspray.uspray.DTO.pray.request.PrayRequestDto; import com.uspray.uspray.DTO.pray.request.PrayResponseDto; import com.uspray.uspray.exception.SuccessStatus; +import com.uspray.uspray.service.HistoryService; import com.uspray.uspray.service.PrayService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -38,6 +39,7 @@ public class PrayController { private final PrayService prayService; + private final HistoryService historyService; @Operation(summary = "기도제목 목록 조회") @ApiResponse( @@ -121,4 +123,19 @@ public ApiResponseDto> todayPray( return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, prayService.todayPray(prayId, user.getUsername())); } + + @Operation(summary = "기도 완료하기") + @ApiResponse( + responseCode = "200", + description = "기도 완료하기", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + @PutMapping("/{prayId}/complete") + public ApiResponseDto> completePray( + @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, + @Parameter(hidden = true) @AuthenticationPrincipal User user + ) { + historyService.createHistory(user.getUsername(), prayId); + return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, + prayService.completePray(prayId, user.getUsername())); + } } diff --git a/src/main/java/com/uspray/uspray/domain/Pray.java b/src/main/java/com/uspray/uspray/domain/Pray.java index 65aac6b5..05a95c62 100644 --- a/src/main/java/com/uspray/uspray/domain/Pray.java +++ b/src/main/java/com/uspray/uspray/domain/Pray.java @@ -88,4 +88,8 @@ public void countUp() { this.count++; this.lastPrayedAt = LocalDate.now(); } + + public void complete() { + this.deadline = LocalDate.now(); + } } diff --git a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java index ac6f0554..3d57a079 100644 --- a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java +++ b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java @@ -32,7 +32,7 @@ public enum SuccessStatus { GET_HISTORY_LIST_SUCCESS(HttpStatus.OK, "히스토리 목록 조회에 성공했습니다."), GET_HISTORY_DETAIL_SUCCESS(HttpStatus.OK, "히스토리 상세 조회에 성공했습니다."), INCREASE_PRAY_COUNT_SUCCESS(HttpStatus.OK, "기도 횟수 추가에 성공했습니다."), - + COMPLETE_PRAY_SUCCESS(HttpStatus.OK, "기도제목 완료에 성공했습니다."), /* * 201 created */ diff --git a/src/main/java/com/uspray/uspray/service/HistoryService.java b/src/main/java/com/uspray/uspray/service/HistoryService.java index f914b008..635278b6 100644 --- a/src/main/java/com/uspray/uspray/service/HistoryService.java +++ b/src/main/java/com/uspray/uspray/service/HistoryService.java @@ -90,6 +90,15 @@ public void convertPrayToHistory() { } } + public void createHistory(String username, Long prayId) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + pray.complete(); + History history = History.builder() + .pray(pray) + .build(); + historyRepository.save(history); + } + public void deleteHistory(Long historyId, String username) { Member member = memberRepository.getMemberByUserId(username); History history = historyRepository.findByIdAndMember(historyId, member); diff --git a/src/main/java/com/uspray/uspray/service/PrayService.java b/src/main/java/com/uspray/uspray/service/PrayService.java index 3c3ca8bb..f21ae34e 100644 --- a/src/main/java/com/uspray/uspray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/service/PrayService.java @@ -98,4 +98,12 @@ public List todayPray(Long prayId, String username) { } return getPrayList(username, PrayType.PERSONAL.stringValue()); } + + @Transactional + public List completePray(Long prayId, String username) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + prayRepository.delete(pray); + + return getPrayList(username, pray.getPrayType().stringValue()); + } } From faaec060bde47845e3202032d54c7c1dc0c06a3f Mon Sep 17 00:00:00 2001 From: baebae02 Date: Mon, 13 Nov 2023 15:05:26 +0900 Subject: [PATCH 12/18] refactor: delete unused praydto --- .../com/uspray/uspray/DTO/pray/PrayDto.java | 39 ------------------- .../DTO/pray/request/PrayResponseDto.java | 9 +---- .../infrastructure/SharedPrayRepository.java | 6 +-- 3 files changed, 3 insertions(+), 51 deletions(-) delete mode 100644 src/main/java/com/uspray/uspray/DTO/pray/PrayDto.java diff --git a/src/main/java/com/uspray/uspray/DTO/pray/PrayDto.java b/src/main/java/com/uspray/uspray/DTO/pray/PrayDto.java deleted file mode 100644 index e73b695b..00000000 --- a/src/main/java/com/uspray/uspray/DTO/pray/PrayDto.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.uspray.uspray.DTO.pray; - -import io.swagger.v3.oas.annotations.media.Schema; -import java.time.LocalDate; -import java.time.LocalDateTime; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@AllArgsConstructor -@Builder -@NoArgsConstructor -public class PrayDto { - - @Schema(description = "기도제목 ID", example = "1") - private Long id; - @Schema(description = "기도제목 작성자 ID", example = "1") - private Long memberId; - @Schema(description = "기도제목 내용", example = "@@이가 $$ 할 수 있도록") - private String content; - @Schema(description = "기도제목 마감일", example = "2025-01-01") - private LocalDate deadline; - @Schema(description = "기도 횟수", example = "10") - private Integer count; - @Schema(description = "기도제목 공유 여부", example = "true") - private Boolean isShared; - @Schema(description = "기도제목 종류", example = "PERSONAL") - private String prayType; - @Schema(description = "기도제목 마지막 기도일, example = 2021-01-01") - private LocalDate lastPrayDate; - @Schema(description = "기도제목 생성일", example = "2021-01-01 00:00:00") - private LocalDateTime createdAt; - @Schema(description = "기도제목 수정일", example = "2021-01-01 00:00:00") - private LocalDateTime updatedAt; - -} - diff --git a/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java b/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java index 82579551..cbd91eb6 100644 --- a/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java +++ b/src/main/java/com/uspray/uspray/DTO/pray/request/PrayResponseDto.java @@ -3,7 +3,6 @@ import com.uspray.uspray.domain.Pray; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; -import java.time.LocalDateTime; import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -26,12 +25,6 @@ public class PrayResponseDto { @Schema(description = "기도제목 마감일", example = "2025-01-01") private LocalDate deadline; - @Schema(description = "기도 횟수", example = "10") - private Integer count; - - @Schema(description = "기도제목 생성일", example = "2021-01-01 00:00:00") - private LocalDateTime createdAt; - @Schema(description = "기도제목 카테고리", example = "1") private Long categoryId; @@ -44,7 +37,7 @@ public class PrayResponseDto { public static PrayResponseDto of(Pray pray) { return new PrayResponseDto(pray.getId(), pray.getContent(), pray.getDeadline(), - pray.getCount(), pray.getCreatedAt(), pray.getCategory().getId(), + pray.getCategory().getId(), pray.getCategory().getName(), pray.getLastPrayedAt()); } diff --git a/src/main/java/com/uspray/uspray/infrastructure/SharedPrayRepository.java b/src/main/java/com/uspray/uspray/infrastructure/SharedPrayRepository.java index 8724d025..3011fd5f 100644 --- a/src/main/java/com/uspray/uspray/infrastructure/SharedPrayRepository.java +++ b/src/main/java/com/uspray/uspray/infrastructure/SharedPrayRepository.java @@ -1,21 +1,19 @@ package com.uspray.uspray.infrastructure; -import com.uspray.uspray.DTO.pray.PrayDto; import com.uspray.uspray.domain.Member; import com.uspray.uspray.domain.SharedPray; import java.time.LocalDate; import java.util.List; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @Repository public interface SharedPrayRepository extends JpaRepository { - + // 수신자 기준 모두 찾기 (보관함 조회) @EntityGraph(attributePaths = {"member"}) List findAllByMemberOrderByCreatedAtDesc(Member member); - + List findAllByCreatedAtBefore(LocalDate threshold); } From 5fa09f048bf072290315518d3f7650d016761d42 Mon Sep 17 00:00:00 2001 From: baebae02 Date: Mon, 13 Nov 2023 15:17:48 +0900 Subject: [PATCH 13/18] refactor: add fetch loading lazy --- src/main/java/com/uspray/uspray/domain/Pray.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/Pray.java b/src/main/java/com/uspray/uspray/domain/Pray.java index 05a95c62..efb423aa 100644 --- a/src/main/java/com/uspray/uspray/domain/Pray.java +++ b/src/main/java/com/uspray/uspray/domain/Pray.java @@ -36,7 +36,7 @@ public class Pray extends AuditingTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "pray_id") private Long id; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id", nullable = false) private Member member; private String content; @@ -56,7 +56,7 @@ public class Pray extends AuditingTimeEntity { private GroupPray groupPray; @NotNull - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "category_id") private Category category; From a5d19e8e0b48631ce5579fc452a657316cb8fe84 Mon Sep 17 00:00:00 2001 From: baebae02 Date: Mon, 13 Nov 2023 15:27:20 +0900 Subject: [PATCH 14/18] refactor: add throw exception at category repository --- .../infrastructure/CategoryRepository.java | 27 +++++++++++++------ .../uspray/uspray/service/PrayService.java | 17 +++++------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/uspray/uspray/infrastructure/CategoryRepository.java b/src/main/java/com/uspray/uspray/infrastructure/CategoryRepository.java index 0b0180e7..3d926015 100644 --- a/src/main/java/com/uspray/uspray/infrastructure/CategoryRepository.java +++ b/src/main/java/com/uspray/uspray/infrastructure/CategoryRepository.java @@ -2,17 +2,28 @@ import com.uspray.uspray.domain.Category; import com.uspray.uspray.domain.Member; +import com.uspray.uspray.exception.ErrorStatus; +import com.uspray.uspray.exception.model.NotFoundException; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface CategoryRepository extends JpaRepository { - - Category getCategoryById(Long categoryId); - - boolean existsCategoryByNameAndMember(String name, Member member); - - int countCategoryByMember(Member member); - - boolean existsCategoryByIdAndMember(Long categoryId, Member member); + + Category getCategoryById(Long categoryId); + + default Category getCategoryByIdAndMember(Long categoryId, Member member) { + return findById(categoryId) + .filter(category -> category.getMember().equals(member)) + .orElseThrow(() -> new NotFoundException( + ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, + ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage() + )); + } + + boolean existsCategoryByNameAndMember(String name, Member member); + + int countCategoryByMember(Member member); + + boolean existsCategoryByIdAndMember(Long categoryId, Member member); } diff --git a/src/main/java/com/uspray/uspray/service/PrayService.java b/src/main/java/com/uspray/uspray/service/PrayService.java index f21ae34e..d96f268b 100644 --- a/src/main/java/com/uspray/uspray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/service/PrayService.java @@ -15,7 +15,6 @@ import java.time.LocalDate; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.stream.Collectors; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; @@ -32,11 +31,9 @@ public class PrayService { @Transactional public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username) { Member member = memberRepository.getMemberByUserId(username); - Category category = categoryRepository.getCategoryById(prayRequestDto.getCategoryId()); - if (!Objects.equals(category.getMember().getId(), member.getId())) { - throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); - } + Category category = categoryRepository.getCategoryByIdAndMember( + prayRequestDto.getCategoryId(), + member); Pray pray = prayRequestDto.toEntity(member, category, PrayType.PERSONAL); prayRepository.save(pray); return PrayResponseDto.of(pray); @@ -58,11 +55,9 @@ public PrayResponseDto deletePray(Long prayId, String username) { @Transactional public PrayResponseDto updatePray(Long prayId, String username, PrayRequestDto prayRequestDto) { Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); - Category category = categoryRepository.getCategoryById(prayRequestDto.getCategoryId()); - if (!Objects.equals(category.getMember().getId(), pray.getMember().getId())) { - throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); - } + categoryRepository.getCategoryByIdAndMember( + prayRequestDto.getCategoryId(), + pray.getMember()); pray.update(prayRequestDto); return PrayResponseDto.of(pray); } From e64c96a9b0293d066c113cea8460284a89b7b4a1 Mon Sep 17 00:00:00 2001 From: baebae02 Date: Mon, 13 Nov 2023 16:54:30 +0900 Subject: [PATCH 15/18] refactor: add exception handling at category repository --- .../uspray/uspray/exception/ErrorStatus.java | 5 +-- .../infrastructure/CategoryRepository.java | 29 ++++++++++++--- .../uspray/service/CategoryService.java | 36 ++++--------------- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/uspray/uspray/exception/ErrorStatus.java b/src/main/java/com/uspray/uspray/exception/ErrorStatus.java index e1ea5c76..cafcced2 100644 --- a/src/main/java/com/uspray/uspray/exception/ErrorStatus.java +++ b/src/main/java/com/uspray/uspray/exception/ErrorStatus.java @@ -19,7 +19,7 @@ public enum ErrorStatus { CATEGORY_ALREADY_EXIST_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 카테고리입니다."), CATEGORY_LIMIT_EXCEPTION(HttpStatus.BAD_REQUEST, "카테고리는 최대 7개까지 생성 가능합니다."), ALREADY_PRAYED_TODAY(HttpStatus.BAD_REQUEST, "오늘 이미 기도한 기도제목입니다."), - + CATEGORY_DUPLICATE_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 카테고리입니다."), /* * 401 UNAUTHORIZED */ @@ -38,7 +38,8 @@ public enum ErrorStatus { PRAY_NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "해당 기도제목을 찾을 수 없습니다."), PRAY_ALREADY_DELETED_EXCEPTION(HttpStatus.NOT_FOUND, "원본 기도제목이 삭제되었습니다."), NOT_FOUND_SHARED_PRAY_EXCEPTION(HttpStatus.NOT_FOUND, "해당 공유기도제목을 찾을 수 없습니다."), - HISTORY_NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "해당 히스토리를 찾을 수 없습니다."); + HISTORY_NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "해당 히스토리를 찾을 수 없습니다."), + CATEGORY_NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "해당 카테고리를 찾을 수 없습니다."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/com/uspray/uspray/infrastructure/CategoryRepository.java b/src/main/java/com/uspray/uspray/infrastructure/CategoryRepository.java index 3d926015..860e5cc4 100644 --- a/src/main/java/com/uspray/uspray/infrastructure/CategoryRepository.java +++ b/src/main/java/com/uspray/uspray/infrastructure/CategoryRepository.java @@ -4,6 +4,7 @@ import com.uspray.uspray.domain.Member; import com.uspray.uspray.exception.ErrorStatus; import com.uspray.uspray.exception.model.NotFoundException; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -12,18 +13,36 @@ public interface CategoryRepository extends JpaRepository { Category getCategoryById(Long categoryId); + List getCategoriesByMember(Member member); + default Category getCategoryByIdAndMember(Long categoryId, Member member) { return findById(categoryId) .filter(category -> category.getMember().equals(member)) .orElseThrow(() -> new NotFoundException( - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage() + ErrorStatus.CATEGORY_NOT_FOUND_EXCEPTION, + ErrorStatus.CATEGORY_NOT_FOUND_EXCEPTION.getMessage() )); } - boolean existsCategoryByNameAndMember(String name, Member member); - int countCategoryByMember(Member member); + default boolean checkDuplicateByNameAndMember(String name, Member member) { + boolean isDuplicate = existsByNameAndMember(name, member); + if (isDuplicate) { + throw new NotFoundException(ErrorStatus.CATEGORY_DUPLICATE_EXCEPTION, + ErrorStatus.CATEGORY_DUPLICATE_EXCEPTION.getMessage()); + } + return false; + } + + boolean existsByNameAndMember(String name, Member member); - boolean existsCategoryByIdAndMember(Long categoryId, Member member); + default int countCategoryByMember(Member member) { + List categories = getCategoriesByMember(member); + int count = categories.size(); + if (count > 7) { + throw new NotFoundException(ErrorStatus.CATEGORY_LIMIT_EXCEPTION, + ErrorStatus.CATEGORY_LIMIT_EXCEPTION.getMessage()); + } + return count; + } } diff --git a/src/main/java/com/uspray/uspray/service/CategoryService.java b/src/main/java/com/uspray/uspray/service/CategoryService.java index a341b23a..e3f58f96 100644 --- a/src/main/java/com/uspray/uspray/service/CategoryService.java +++ b/src/main/java/com/uspray/uspray/service/CategoryService.java @@ -4,8 +4,6 @@ import com.uspray.uspray.DTO.category.CategoryResponseDto; import com.uspray.uspray.domain.Category; import com.uspray.uspray.domain.Member; -import com.uspray.uspray.exception.ErrorStatus; -import com.uspray.uspray.exception.model.NotFoundException; import com.uspray.uspray.infrastructure.CategoryRepository; import com.uspray.uspray.infrastructure.MemberRepository; import lombok.RequiredArgsConstructor; @@ -21,50 +19,30 @@ public class CategoryService { public CategoryResponseDto createCategory(String username, CategoryRequestDto categoryRequestDto) { Member member = memberRepository.getMemberByUserId(username); - if (categoryRepository.existsCategoryByNameAndMember(categoryRequestDto.getName(), - member)) { - throw new NotFoundException(ErrorStatus.CATEGORY_ALREADY_EXIST_EXCEPTION, - ErrorStatus.CATEGORY_ALREADY_EXIST_EXCEPTION.getMessage()); - } + categoryRepository.checkDuplicateByNameAndMember(categoryRequestDto.getName(), member); int categoryCount = categoryRepository.countCategoryByMember(member); - if (categoryCount > 7) { - throw new NotFoundException(ErrorStatus.CATEGORY_LIMIT_EXCEPTION, - ErrorStatus.CATEGORY_LIMIT_EXCEPTION.getMessage()); - } Category category = categoryRequestDto.toEntity(member, categoryCount); categoryRepository.save(category); return CategoryResponseDto.of(category); } public CategoryResponseDto deleteCategory(String username, Long categoryId) { - Category category = categoryRepository.getCategoryById(categoryId); - if (categoryRepository.existsCategoryByIdAndMember(categoryId, - memberRepository.getMemberByUserId(username))) { - throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); - } + Category category = categoryRepository.getCategoryByIdAndMember(categoryId, + memberRepository.getMemberByUserId(username)); return CategoryResponseDto.of(category); } public CategoryResponseDto updateCategory(String username, Long categoryId, CategoryRequestDto categoryRequestDto) { - Category category = categoryRepository.getCategoryById(categoryId); - if (categoryRepository.existsCategoryByIdAndMember(categoryId, - memberRepository.getMemberByUserId(username))) { - throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); - } + Category category = categoryRepository.getCategoryByIdAndMember(categoryId, + memberRepository.getMemberByUserId(username)); category.update(categoryRequestDto); return CategoryResponseDto.of(category); } public CategoryResponseDto getCategory(String username, Long categoryId) { - Category category = categoryRepository.getCategoryById(categoryId); - if (categoryRepository.existsCategoryByIdAndMember(categoryId, - memberRepository.getMemberByUserId(username))) { - throw new NotFoundException(ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION, - ErrorStatus.CATEGORY_UNAUTHORIZED_EXCEPTION.getMessage()); - } + Category category = categoryRepository.getCategoryByIdAndMember(categoryId, + memberRepository.getMemberByUserId(username)); return CategoryResponseDto.of(category); } } From 0bb5f7ebf800b5b505d579bd9f8f7b02392c3c35 Mon Sep 17 00:00:00 2001 From: baebae02 Date: Mon, 13 Nov 2023 17:14:07 +0900 Subject: [PATCH 16/18] feat: add delete category --- .../com/uspray/uspray/domain/Category.java | 65 +++++++++---------- .../uspray/service/CategoryService.java | 11 ++-- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/Category.java b/src/main/java/com/uspray/uspray/domain/Category.java index 8147bf21..3d016800 100644 --- a/src/main/java/com/uspray/uspray/domain/Category.java +++ b/src/main/java/com/uspray/uspray/domain/Category.java @@ -19,42 +19,41 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -@SQLDelete(sql = "UPDATE category SET deleted = true WHERE id = ?") +@SQLDelete(sql = "UPDATE category SET deleted = true WHERE category_id = ?") @Where(clause = "deleted=false") public class Category extends AuditingTimeEntity { - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "category_id") - @Id - private Long id; - private String name; - private String color; - @GeneratedValue(strategy = GenerationType.SEQUENCE) - @Column(name = "category_order") - private int order; - private final Boolean deleted = false; + private final Boolean deleted = false; + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "category_id") + @Id + private Long id; + private String name; + private String color; + @GeneratedValue(strategy = GenerationType.SEQUENCE) + @Column(name = "category_order") + private int order; + @ManyToOne + @JoinColumn(name = "member_id", nullable = false) + private Member member; - @ManyToOne - @JoinColumn(name = "member_id", nullable = false) - private Member member; + @Builder + public Category( + Long id, + String name, + String color, + int order, + Member member + ) { + this.id = id; + this.name = name; + this.color = color; + this.order = order; + this.member = member; + } - @Builder - public Category( - Long id, - String name, - String color, - int order, - Member member - ) { - this.id = id; - this.name = name; - this.color = color; - this.order = order; - this.member = member; - } - - public void update(CategoryRequestDto categoryRequestDto) { - this.name = categoryRequestDto.getName(); - this.color = categoryRequestDto.getColor(); - } + public void update(CategoryRequestDto categoryRequestDto) { + this.name = categoryRequestDto.getName(); + this.color = categoryRequestDto.getColor(); + } } diff --git a/src/main/java/com/uspray/uspray/service/CategoryService.java b/src/main/java/com/uspray/uspray/service/CategoryService.java index e3f58f96..29360fae 100644 --- a/src/main/java/com/uspray/uspray/service/CategoryService.java +++ b/src/main/java/com/uspray/uspray/service/CategoryService.java @@ -12,10 +12,10 @@ @Service @RequiredArgsConstructor public class CategoryService { - + private final MemberRepository memberRepository; private final CategoryRepository categoryRepository; - + public CategoryResponseDto createCategory(String username, CategoryRequestDto categoryRequestDto) { Member member = memberRepository.getMemberByUserId(username); @@ -25,13 +25,14 @@ public CategoryResponseDto createCategory(String username, categoryRepository.save(category); return CategoryResponseDto.of(category); } - + public CategoryResponseDto deleteCategory(String username, Long categoryId) { Category category = categoryRepository.getCategoryByIdAndMember(categoryId, memberRepository.getMemberByUserId(username)); + categoryRepository.delete(category); return CategoryResponseDto.of(category); } - + public CategoryResponseDto updateCategory(String username, Long categoryId, CategoryRequestDto categoryRequestDto) { Category category = categoryRepository.getCategoryByIdAndMember(categoryId, @@ -39,7 +40,7 @@ public CategoryResponseDto updateCategory(String username, Long categoryId, category.update(categoryRequestDto); return CategoryResponseDto.of(category); } - + public CategoryResponseDto getCategory(String username, Long categoryId) { Category category = categoryRepository.getCategoryByIdAndMember(categoryId, memberRepository.getMemberByUserId(username)); From a5be72d87a77814876240bdd1edb277f757936df Mon Sep 17 00:00:00 2001 From: baebae02 Date: Tue, 14 Nov 2023 19:10:53 +0900 Subject: [PATCH 17/18] feat: make PrayFacadeService --- .../uspray/controller/HistoryController.java | 16 ++--- .../uspray/controller/PrayController.java | 26 +++---- .../uspray/uspray/service/HistoryService.java | 39 ++-------- .../uspray/service/PrayFacadeService.java | 71 +++++++++++++++++++ .../uspray/uspray/service/PrayService.java | 48 +++---------- .../uspray/service/SchedulerService.java | 7 +- 6 files changed, 113 insertions(+), 94 deletions(-) create mode 100644 src/main/java/com/uspray/uspray/service/PrayFacadeService.java diff --git a/src/main/java/com/uspray/uspray/controller/HistoryController.java b/src/main/java/com/uspray/uspray/controller/HistoryController.java index 51eba0a3..9c0ea8b3 100644 --- a/src/main/java/com/uspray/uspray/controller/HistoryController.java +++ b/src/main/java/com/uspray/uspray/controller/HistoryController.java @@ -6,7 +6,7 @@ import com.uspray.uspray.DTO.pray.request.PrayRequestDto; import com.uspray.uspray.exception.SuccessStatus; import com.uspray.uspray.service.HistoryService; -import com.uspray.uspray.service.PrayService; +import com.uspray.uspray.service.PrayFacadeService; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; @@ -30,10 +30,10 @@ @RequiredArgsConstructor @SecurityRequirement(name = "JWT Auth") public class HistoryController { - + private final HistoryService historyService; - private final PrayService prayService; - + private final PrayFacadeService prayFacadeService; + @GetMapping public ApiResponseDto getHistoryList( @Parameter(hidden = true) @AuthenticationPrincipal User user, @@ -43,7 +43,7 @@ public ApiResponseDto getHistoryList( return ApiResponseDto.success(SuccessStatus.GET_HISTORY_LIST_SUCCESS, historyService.getHistoryList(user.getUsername(), type, page, size)); } - + // 이름, 내용, 카테고리에 해당되는 키워드 전부를 찾아서 검색 // 내가 쓴 기도제목, 공유받은 기도제목 체크박스 (최소 한 개 이상 선택) // 날짜까지 (옵션) @@ -61,7 +61,7 @@ public ApiResponseDto searchHistoryList( historyService.searchHistoryList(user.getUsername(), keyword, isPersonal, isShared, startDate, endDate, page, size)); } - + @GetMapping("/detail/{historyId}") public ApiResponseDto getHistoryDetail( @Parameter(hidden = true) @AuthenticationPrincipal User user, @@ -69,13 +69,13 @@ public ApiResponseDto getHistoryDetail( return ApiResponseDto.success(SuccessStatus.GET_HISTORY_DETAIL_SUCCESS, historyService.getHistoryDetail(user.getUsername(), historyId)); } - + @PostMapping("/pray/{historyId}") public ApiResponseDto createPray( @Parameter(hidden = true) @AuthenticationPrincipal User user, @PathVariable Long historyId, @RequestBody @Valid PrayRequestDto prayRequestDto) { - prayService.createPray(prayRequestDto, user.getUsername()); + prayFacadeService.createPray(prayRequestDto, user.getUsername()); historyService.deleteHistory(historyId, user.getUsername()); return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, historyService.getHistoryList(user.getUsername(), "PERSONAL", 0, 10)); diff --git a/src/main/java/com/uspray/uspray/controller/PrayController.java b/src/main/java/com/uspray/uspray/controller/PrayController.java index bc5c84c9..5e693adf 100644 --- a/src/main/java/com/uspray/uspray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/controller/PrayController.java @@ -6,7 +6,7 @@ import com.uspray.uspray.DTO.pray.request.PrayRequestDto; import com.uspray.uspray.DTO.pray.request.PrayResponseDto; import com.uspray.uspray.exception.SuccessStatus; -import com.uspray.uspray.service.HistoryService; +import com.uspray.uspray.service.PrayFacadeService; import com.uspray.uspray.service.PrayService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -37,10 +37,10 @@ @RequiredArgsConstructor @SecurityRequirement(name = "JWT Auth") public class PrayController { - + private final PrayService prayService; - private final HistoryService historyService; - + private final PrayFacadeService prayFacadeService; + @Operation(summary = "기도제목 목록 조회") @ApiResponse( responseCode = "200", @@ -54,7 +54,7 @@ public ApiResponseDto> getPrayList( return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, prayService.getPrayList(user.getUsername(), prayType)); } - + @GetMapping("/{prayId}") @ApiResponse( responseCode = "200", @@ -68,7 +68,7 @@ public ApiResponseDto getPrayDetail( return ApiResponseDto.success(SuccessStatus.GET_PRAY_SUCCESS, prayService.getPrayDetail(prayId, user.getUsername())); } - + @PostMapping() @ApiResponse( responseCode = "201", @@ -81,9 +81,9 @@ public ApiResponseDto createPray( @Parameter(hidden = true) @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, - prayService.createPray(prayRequestDto, user.getUsername())); + prayFacadeService.createPray(prayRequestDto, user.getUsername())); } - + @DeleteMapping("/{prayId}") @ApiResponse(responseCode = "204", description = "기도제목 삭제") @Operation(summary = "기도제목 삭제") @@ -94,7 +94,7 @@ public ApiResponseDto deletePray( return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, prayService.deletePray(prayId, user.getUsername())); } - + @PutMapping("/{prayId}") @ApiResponse( responseCode = "200", @@ -107,9 +107,9 @@ public ApiResponseDto updatePray( @Parameter(hidden = true) @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, - prayService.updatePray(prayId, user.getUsername(), prayRequestDto)); + prayFacadeService.updatePray(prayId, user.getUsername(), prayRequestDto)); } - + @Operation(summary = "오늘 기도하기") @ApiResponse( responseCode = "200", @@ -123,7 +123,7 @@ public ApiResponseDto> todayPray( return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, prayService.todayPray(prayId, user.getUsername())); } - + @Operation(summary = "기도 완료하기") @ApiResponse( responseCode = "200", @@ -134,7 +134,7 @@ public ApiResponseDto> completePray( @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, @Parameter(hidden = true) @AuthenticationPrincipal User user ) { - historyService.createHistory(user.getUsername(), prayId); + prayFacadeService.createHistory(user.getUsername(), prayId); return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, prayService.completePray(prayId, user.getUsername())); } diff --git a/src/main/java/com/uspray/uspray/service/HistoryService.java b/src/main/java/com/uspray/uspray/service/HistoryService.java index 635278b6..34a76d5d 100644 --- a/src/main/java/com/uspray/uspray/service/HistoryService.java +++ b/src/main/java/com/uspray/uspray/service/HistoryService.java @@ -6,14 +6,11 @@ import com.uspray.uspray.Enums.PrayType; import com.uspray.uspray.domain.History; import com.uspray.uspray.domain.Member; -import com.uspray.uspray.domain.Pray; import com.uspray.uspray.exception.ErrorStatus; import com.uspray.uspray.exception.model.NotFoundException; import com.uspray.uspray.infrastructure.HistoryRepository; import com.uspray.uspray.infrastructure.MemberRepository; -import com.uspray.uspray.infrastructure.PrayRepository; import java.time.LocalDate; -import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -25,15 +22,14 @@ @Service @RequiredArgsConstructor public class HistoryService { - + private final HistoryRepository historyRepository; private final MemberRepository memberRepository; - private final PrayRepository prayRepository; - + @Transactional(readOnly = true) public HistoryListResponseDto getHistoryList(String username, String type, int page, int size) { // type은 대소문자 구분하지 않습니다 - + Pageable pageable = PageRequest.of(page, size, Sort.by("deadline").descending()); Member member = memberRepository.getMemberByUserId(username); Page historyList; @@ -49,12 +45,12 @@ public HistoryListResponseDto getHistoryList(String username, String type, int p return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); } - + @Transactional(readOnly = true) public HistoryListResponseDto searchHistoryList(String username, String keyword, Boolean isPersonal, Boolean isShared, LocalDate startDate, LocalDate endDate, int page, int size) { - + // 전체 파라미터가 null 인 경우 예외처리 if (keyword == null && isPersonal == null && isShared == null && startDate == null && endDate == null) { @@ -66,7 +62,7 @@ public HistoryListResponseDto searchHistoryList(String username, String keyword, .map(HistoryResponseDto::of); return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); } - + @Transactional(readOnly = true) public HistoryDetailResponseDto getHistoryDetail(String username, Long historyId) { Member member = memberRepository.getMemberByUserId(username); @@ -77,28 +73,7 @@ public HistoryDetailResponseDto getHistoryDetail(String username, Long historyId } return HistoryDetailResponseDto.of(history); } - - @Transactional - public void convertPrayToHistory() { - List prayList = prayRepository.findAllByDeadlineBefore(LocalDate.now()); - for (Pray pray : prayList) { - History history = History.builder() - .pray(pray) - .build(); - historyRepository.save(history); - prayRepository.delete(pray); - } - } - - public void createHistory(String username, Long prayId) { - Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); - pray.complete(); - History history = History.builder() - .pray(pray) - .build(); - historyRepository.save(history); - } - + public void deleteHistory(Long historyId, String username) { Member member = memberRepository.getMemberByUserId(username); History history = historyRepository.findByIdAndMember(historyId, member); diff --git a/src/main/java/com/uspray/uspray/service/PrayFacadeService.java b/src/main/java/com/uspray/uspray/service/PrayFacadeService.java new file mode 100644 index 00000000..55c100dc --- /dev/null +++ b/src/main/java/com/uspray/uspray/service/PrayFacadeService.java @@ -0,0 +1,71 @@ +package com.uspray.uspray.service; + +import com.uspray.uspray.DTO.pray.request.PrayRequestDto; +import com.uspray.uspray.DTO.pray.request.PrayResponseDto; +import com.uspray.uspray.Enums.PrayType; +import com.uspray.uspray.domain.Category; +import com.uspray.uspray.domain.History; +import com.uspray.uspray.domain.Member; +import com.uspray.uspray.domain.Pray; +import com.uspray.uspray.infrastructure.CategoryRepository; +import com.uspray.uspray.infrastructure.HistoryRepository; +import com.uspray.uspray.infrastructure.MemberRepository; +import com.uspray.uspray.infrastructure.PrayRepository; +import java.time.LocalDate; +import java.util.List; +import javax.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PrayFacadeService { + + private final MemberRepository memberRepository; + private final PrayRepository prayRepository; + private final CategoryRepository categoryRepository; + private final HistoryRepository historyRepository; + + @Transactional + public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username) { + Member member = memberRepository.getMemberByUserId(username); + Category category = categoryRepository.getCategoryByIdAndMember( + prayRequestDto.getCategoryId(), + member); + Pray pray = prayRequestDto.toEntity(member, category, PrayType.PERSONAL); + prayRepository.save(pray); + return PrayResponseDto.of(pray); + } + + @Transactional + public PrayResponseDto updatePray(Long prayId, String username, PrayRequestDto prayRequestDto) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + categoryRepository.getCategoryByIdAndMember( + prayRequestDto.getCategoryId(), + pray.getMember()); + pray.update(prayRequestDto); + return PrayResponseDto.of(pray); + } + + @Transactional + public void convertPrayToHistory() { + List prayList = prayRepository.findAllByDeadlineBefore(LocalDate.now()); + for (Pray pray : prayList) { + History history = History.builder() + .pray(pray) + .build(); + historyRepository.save(history); + prayRepository.delete(pray); + } + } + + + public void createHistory(String username, Long prayId) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + pray.complete(); + History history = History.builder() + .pray(pray) + .build(); + historyRepository.save(history); + } +} diff --git a/src/main/java/com/uspray/uspray/service/PrayService.java b/src/main/java/com/uspray/uspray/service/PrayService.java index d96f268b..a6d77616 100644 --- a/src/main/java/com/uspray/uspray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/service/PrayService.java @@ -1,16 +1,11 @@ package com.uspray.uspray.service; import com.uspray.uspray.DTO.pray.PrayListResponseDto; -import com.uspray.uspray.DTO.pray.request.PrayRequestDto; import com.uspray.uspray.DTO.pray.request.PrayResponseDto; import com.uspray.uspray.Enums.PrayType; -import com.uspray.uspray.domain.Category; -import com.uspray.uspray.domain.Member; import com.uspray.uspray.domain.Pray; import com.uspray.uspray.exception.ErrorStatus; import com.uspray.uspray.exception.model.NotFoundException; -import com.uspray.uspray.infrastructure.CategoryRepository; -import com.uspray.uspray.infrastructure.MemberRepository; import com.uspray.uspray.infrastructure.PrayRepository; import java.time.LocalDate; import java.util.List; @@ -23,54 +18,31 @@ @Service @RequiredArgsConstructor public class PrayService { - + private final PrayRepository prayRepository; - private final MemberRepository memberRepository; - private final CategoryRepository categoryRepository; - - @Transactional - public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username) { - Member member = memberRepository.getMemberByUserId(username); - Category category = categoryRepository.getCategoryByIdAndMember( - prayRequestDto.getCategoryId(), - member); - Pray pray = prayRequestDto.toEntity(member, category, PrayType.PERSONAL); - prayRepository.save(pray); - return PrayResponseDto.of(pray); - } - + @Transactional public PrayResponseDto getPrayDetail(Long prayId, String username) { Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); return PrayResponseDto.of(pray); } - + @Transactional public PrayResponseDto deletePray(Long prayId, String username) { Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); prayRepository.delete(pray); return PrayResponseDto.of(pray); } - - @Transactional - public PrayResponseDto updatePray(Long prayId, String username, PrayRequestDto prayRequestDto) { - Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); - categoryRepository.getCategoryByIdAndMember( - prayRequestDto.getCategoryId(), - pray.getMember()); - pray.update(prayRequestDto); - return PrayResponseDto.of(pray); - } - + @Transactional public List getPrayList(String username, String prayType) { - + List prays = prayRepository.findAllWithOrderAndType(username, prayType); - + // Pray 엔티티를 categoryId를 기준으로 그룹화한 맵 생성 Map> prayMap = prays.stream() .collect(Collectors.groupingBy(pray -> pray.getCategory().getId())); - + // 그룹화된 맵을 PrayListResponseDto 변환하여 반환 return prayMap.entrySet().stream() .map(entry -> new PrayListResponseDto(entry.getKey(), @@ -80,7 +52,7 @@ public List getPrayList(String username, String prayType) { .collect(Collectors.toList()))) .collect(Collectors.toList()); } - + @Transactional public List todayPray(Long prayId, String username) { Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); @@ -93,12 +65,12 @@ public List todayPray(Long prayId, String username) { } return getPrayList(username, PrayType.PERSONAL.stringValue()); } - + @Transactional public List completePray(Long prayId, String username) { Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); prayRepository.delete(pray); - + return getPrayList(username, pray.getPrayType().stringValue()); } } diff --git a/src/main/java/com/uspray/uspray/service/SchedulerService.java b/src/main/java/com/uspray/uspray/service/SchedulerService.java index 5160a8d3..15e20372 100644 --- a/src/main/java/com/uspray/uspray/service/SchedulerService.java +++ b/src/main/java/com/uspray/uspray/service/SchedulerService.java @@ -16,14 +16,15 @@ public class SchedulerService { private final MemberQueryRepository memberQueryRepository; private final FCMNotificationService fcmNotificationService; private final ShareService shareService; - private final HistoryService historyService; + private final PrayFacadeService prayFacadeService; @Scheduled(cron = "0 0 8 * * *") public void pushPrayNotification() throws IOException { List deviceTokens = memberQueryRepository.getDeviceTokensByFirstNotiAgree( true); for (String device : deviceTokens) { - fcmNotificationService.sendMessageTo(device, NotificationType.PRAY_TIME.getTitle(), NotificationType.PRAY_TIME.getBody()); + fcmNotificationService.sendMessageTo(device, NotificationType.PRAY_TIME.getTitle(), + NotificationType.PRAY_TIME.getBody()); } } @@ -35,6 +36,6 @@ public void cleanSharedPray() { @Scheduled(cron = "0 0 0 * * ?") public void convertPrayToHistory() { - historyService.convertPrayToHistory(); + prayFacadeService.convertPrayToHistory(); } } From 7fd4b1a0d846ee9891e5f7f50056fcfc9fdb39cc Mon Sep 17 00:00:00 2001 From: baebae02 Date: Tue, 14 Nov 2023 19:15:38 +0900 Subject: [PATCH 18/18] refactor: tab and swagger tag --- .../uspray/controller/AuthController.java | 130 +++++++++--------- .../uspray/controller/CategoryController.java | 100 +++++++------- .../controller/GroupPrayController.java | 2 +- .../uspray/controller/MemberController.java | 4 +- .../uspray/controller/ShareController.java | 106 +++++++------- 5 files changed, 171 insertions(+), 171 deletions(-) diff --git a/src/main/java/com/uspray/uspray/controller/AuthController.java b/src/main/java/com/uspray/uspray/controller/AuthController.java index 5fc1da02..7fc0eaf9 100644 --- a/src/main/java/com/uspray/uspray/controller/AuthController.java +++ b/src/main/java/com/uspray/uspray/controller/AuthController.java @@ -34,80 +34,80 @@ @RestController @RequestMapping("/auth") @RequiredArgsConstructor -@Tag(name = "회원 관리", description = "Auth 관련 API") +@Tag(name = "Auth", description = "Auth 관련 API") public class AuthController { - private final TokenProvider tokenProvider; - private final AuthService authService; + private final TokenProvider tokenProvider; + private final AuthService authService; - @PostMapping("/signup") - @ApiResponse( - responseCode = "201", - description = "회원가입 성공", - content = @Content(schema = @Schema(implementation = MemberResponseDto.class))) - public ApiResponseDto signup( - @RequestBody @Valid MemberRequestDto memberRequestDto) { - return ApiResponseDto.success(SuccessStatus.SIGNUP_SUCCESS, - authService.signup(memberRequestDto)); - } + @PostMapping("/signup") + @ApiResponse( + responseCode = "201", + description = "회원가입 성공", + content = @Content(schema = @Schema(implementation = MemberResponseDto.class))) + public ApiResponseDto signup( + @RequestBody @Valid MemberRequestDto memberRequestDto) { + return ApiResponseDto.success(SuccessStatus.SIGNUP_SUCCESS, + authService.signup(memberRequestDto)); + } - @PostMapping("/login") - @ApiResponse( - responseCode = "200", - description = "로그인 성공", - content = @Content(schema = @Schema(implementation = MemberResponseDto.class))) - public ApiResponseDto login( - @RequestBody MemberLoginRequestDto memberLoginRequestDto) { - return ApiResponseDto.success(SuccessStatus.LOGIN_SUCCESS, - authService.login(memberLoginRequestDto)); - } + @PostMapping("/login") + @ApiResponse( + responseCode = "200", + description = "로그인 성공", + content = @Content(schema = @Schema(implementation = MemberResponseDto.class))) + public ApiResponseDto login( + @RequestBody MemberLoginRequestDto memberLoginRequestDto) { + return ApiResponseDto.success(SuccessStatus.LOGIN_SUCCESS, + authService.login(memberLoginRequestDto)); + } - @PostMapping("/reissue") - @ApiResponse( - responseCode = "200", - description = "토큰 재발급 성공", - content = @Content(schema = @Schema(implementation = TokenDto.class))) - @SecurityRequirements({ - @SecurityRequirement(name = "JWT Auth"), - @SecurityRequirement(name = "Refresh") - }) - public ApiResponseDto reissue(@Parameter(hidden = true) HttpServletRequest request) { - String accessToken = request.getHeader("Authorization").substring(7); - String refreshToken = request.getHeader("Refresh"); - return ApiResponseDto.success(SuccessStatus.REISSUE_SUCCESS, - authService.reissue(accessToken, refreshToken)); - } + @PostMapping("/reissue") + @ApiResponse( + responseCode = "200", + description = "토큰 재발급 성공", + content = @Content(schema = @Schema(implementation = TokenDto.class))) + @SecurityRequirements({ + @SecurityRequirement(name = "JWT Auth"), + @SecurityRequirement(name = "Refresh") + }) + public ApiResponseDto reissue(@Parameter(hidden = true) HttpServletRequest request) { + String accessToken = request.getHeader("Authorization").substring(7); + String refreshToken = request.getHeader("Refresh"); + return ApiResponseDto.success(SuccessStatus.REISSUE_SUCCESS, + authService.reissue(accessToken, refreshToken)); + } - @PostMapping("/find-id") - @Operation(summary = "아이디 찾기") - public ApiResponseDto findId(@RequestBody FindIdDto findIdDto) { - return ApiResponseDto.success(SuccessStatus.FIND_USER_ID_SUCCESS, - authService.findId(findIdDto)); - } + @PostMapping("/find-id") + @Operation(summary = "아이디 찾기") + public ApiResponseDto findId(@RequestBody FindIdDto findIdDto) { + return ApiResponseDto.success(SuccessStatus.FIND_USER_ID_SUCCESS, + authService.findId(findIdDto)); + } - @PostMapping("/find-pw") - @Operation(summary = "비밀번호 찾기") - public ApiResponseDto findId(@RequestBody FindPwDto findPwDto) { - authService.findPw(findPwDto); - return ApiResponseDto.success(SuccessStatus.CHANGE_USER_PW_SUCCESS); - } + @PostMapping("/find-pw") + @Operation(summary = "비밀번호 찾기") + public ApiResponseDto findId(@RequestBody FindPwDto findPwDto) { + authService.findPw(findPwDto); + return ApiResponseDto.success(SuccessStatus.CHANGE_USER_PW_SUCCESS); + } - @PostMapping("/withdrawal") - @Operation(summary = "회원 탈퇴") - @SecurityRequirement(name = "JWT Auth") - public ApiResponseDto withdrawal( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @RequestBody MemberDeleteDto memberDeleteDto) { - authService.withdrawal(user.getUsername(), memberDeleteDto); - return ApiResponseDto.success(SuccessStatus.WITHDRAWAL_SUCCESS); - } + @PostMapping("/withdrawal") + @Operation(summary = "회원 탈퇴") + @SecurityRequirement(name = "JWT Auth") + public ApiResponseDto withdrawal( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @RequestBody MemberDeleteDto memberDeleteDto) { + authService.withdrawal(user.getUsername(), memberDeleteDto); + return ApiResponseDto.success(SuccessStatus.WITHDRAWAL_SUCCESS); + } - @GetMapping("/dup-check/{userId}") - @Operation(summary = "아이디 중복 체크") - public ApiResponseDto dupCheck(@PathVariable("userId") String userId) { - authService.dupCheck(userId); - return ApiResponseDto.success(SuccessStatus.CHECK_USER_ID_SUCCESS); + @GetMapping("/dup-check/{userId}") + @Operation(summary = "아이디 중복 체크") + public ApiResponseDto dupCheck(@PathVariable("userId") String userId) { + authService.dupCheck(userId); + return ApiResponseDto.success(SuccessStatus.CHECK_USER_ID_SUCCESS); - } + } } diff --git a/src/main/java/com/uspray/uspray/controller/CategoryController.java b/src/main/java/com/uspray/uspray/controller/CategoryController.java index 65bf15b1..ef656d13 100644 --- a/src/main/java/com/uspray/uspray/controller/CategoryController.java +++ b/src/main/java/com/uspray/uspray/controller/CategoryController.java @@ -26,62 +26,62 @@ @RestController @RequestMapping("/category") -@Tag(name = "Category API", description = "Category 관련 API") +@Tag(name = "Category", description = "Category 관련 API") @RequiredArgsConstructor @SecurityRequirement(name = "JWT Auth") public class CategoryController { - private final CategoryService categoryService; + private final CategoryService categoryService; - @Operation(summary = "카테고리 조회") - @ApiResponse( - responseCode = "200", - description = "카테고리 조회", - content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) - @PostMapping("/{categoryId}") - public ApiResponseDto getCategory( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "카테고리 ID", required = true) @PathVariable("categoryId") Long categoryId - ) { - return ApiResponseDto.success(SuccessStatus.GET_CATEGORY_SUCCESS, - categoryService.getCategory(user.getUsername(), categoryId)); - } + @Operation(summary = "카테고리 조회") + @ApiResponse( + responseCode = "200", + description = "카테고리 조회", + content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) + @PostMapping("/{categoryId}") + public ApiResponseDto getCategory( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @Parameter(description = "카테고리 ID", required = true) @PathVariable("categoryId") Long categoryId + ) { + return ApiResponseDto.success(SuccessStatus.GET_CATEGORY_SUCCESS, + categoryService.getCategory(user.getUsername(), categoryId)); + } - @Operation(summary = "카테고리 생성") - @ApiResponse( - responseCode = "201", - description = "카테고리 생성", - content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) - @PostMapping() - public ApiResponseDto createCategory( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @RequestBody @Valid CategoryRequestDto categoryRequestDto - ) { - return ApiResponseDto.success(SuccessStatus.CREATE_CATEGORY_SUCCESS, - categoryService.createCategory(user.getUsername(), categoryRequestDto)); - } + @Operation(summary = "카테고리 생성") + @ApiResponse( + responseCode = "201", + description = "카테고리 생성", + content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) + @PostMapping() + public ApiResponseDto createCategory( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @RequestBody @Valid CategoryRequestDto categoryRequestDto + ) { + return ApiResponseDto.success(SuccessStatus.CREATE_CATEGORY_SUCCESS, + categoryService.createCategory(user.getUsername(), categoryRequestDto)); + } - @DeleteMapping("/{categoryId}") - public ApiResponseDto deleteCategory( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "카테고리 ID", required = true) @PathVariable("categoryId") Long categoryId - ) { - return ApiResponseDto.success(SuccessStatus.DELETE_CATEGORY_SUCCESS, - categoryService.deleteCategory(user.getUsername(), categoryId)); - } + @DeleteMapping("/{categoryId}") + public ApiResponseDto deleteCategory( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @Parameter(description = "카테고리 ID", required = true) @PathVariable("categoryId") Long categoryId + ) { + return ApiResponseDto.success(SuccessStatus.DELETE_CATEGORY_SUCCESS, + categoryService.deleteCategory(user.getUsername(), categoryId)); + } - @PutMapping("/{categoryId}") - @ApiResponse( - responseCode = "200", - description = "카테고리 수정", - content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) - @Operation(summary = "카테고리 수정") - public ApiResponseDto updatePray( - @Parameter(description = "카테고리 ID", required = true) @PathVariable("categoryId") Long categoryId, - @RequestBody @Valid CategoryRequestDto categoryRequestDto, - @Parameter(hidden = true) @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.UPDATE_CATEGORY_SUCCESS, - categoryService.updateCategory(user.getUsername(), categoryId, categoryRequestDto)); - } + @PutMapping("/{categoryId}") + @ApiResponse( + responseCode = "200", + description = "카테고리 수정", + content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) + @Operation(summary = "카테고리 수정") + public ApiResponseDto updatePray( + @Parameter(description = "카테고리 ID", required = true) @PathVariable("categoryId") Long categoryId, + @RequestBody @Valid CategoryRequestDto categoryRequestDto, + @Parameter(hidden = true) @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.UPDATE_CATEGORY_SUCCESS, + categoryService.updateCategory(user.getUsername(), categoryId, categoryRequestDto)); + } } diff --git a/src/main/java/com/uspray/uspray/controller/GroupPrayController.java b/src/main/java/com/uspray/uspray/controller/GroupPrayController.java index 962af30f..59052608 100644 --- a/src/main/java/com/uspray/uspray/controller/GroupPrayController.java +++ b/src/main/java/com/uspray/uspray/controller/GroupPrayController.java @@ -28,7 +28,7 @@ @RestController @RequestMapping("/grouppray") -@Tag(name = "GroupPray", description = "모임 기도제목 API") +@Tag(name = "Group pray", description = "모임 기도제목 API") @RequiredArgsConstructor @SecurityRequirement(name = "JWT Auth") public class GroupPrayController { diff --git a/src/main/java/com/uspray/uspray/controller/MemberController.java b/src/main/java/com/uspray/uspray/controller/MemberController.java index 60e855d9..626bf44b 100644 --- a/src/main/java/com/uspray/uspray/controller/MemberController.java +++ b/src/main/java/com/uspray/uspray/controller/MemberController.java @@ -1,7 +1,7 @@ package com.uspray.uspray.controller; -import com.uspray.uspray.DTO.notification.NotificationAgreeDto; import com.uspray.uspray.DTO.ApiResponseDto; +import com.uspray.uspray.DTO.notification.NotificationAgreeDto; import com.uspray.uspray.exception.SuccessStatus; import com.uspray.uspray.service.MemberService; import io.swagger.v3.oas.annotations.Operation; @@ -22,7 +22,7 @@ @RequiredArgsConstructor @RequestMapping("/member") @SecurityRequirement(name = "JWT Auth") -@Tag(name = "Member API", description = "유저 관련 api") +@Tag(name = "Member", description = "유저 관련 api") public class MemberController { private final MemberService memberService; diff --git a/src/main/java/com/uspray/uspray/controller/ShareController.java b/src/main/java/com/uspray/uspray/controller/ShareController.java index d6eb9372..ec238d28 100644 --- a/src/main/java/com/uspray/uspray/controller/ShareController.java +++ b/src/main/java/com/uspray/uspray/controller/ShareController.java @@ -31,63 +31,63 @@ @RequestMapping("/share") @RequiredArgsConstructor @SecurityRequirement(name = "JWT Auth") -@Tag(name = "shared pray", description = "기도제목 공유 관련 API") +@Tag(name = "Shared pray", description = "기도제목 공유 관련 API") public class ShareController { - private final ShareService shareService; + private final ShareService shareService; - @GetMapping() - @ApiResponse( - responseCode = "200", - description = "공유받은 기도제목 조회 (보관함 조회)", - content = @Content(schema = @Schema(implementation = SharedPrayListResponseDto.class)) - ) - @Operation(summary = "공유받은 기도제목 조회 (보관함 조회)") - public ApiResponseDto> getSharedPrayList( - @Parameter(hidden = true) @AuthenticationPrincipal User user) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, - shareService.getSharedPrayList(user.getUsername())); - } + @GetMapping() + @ApiResponse( + responseCode = "200", + description = "공유받은 기도제목 조회 (보관함 조회)", + content = @Content(schema = @Schema(implementation = SharedPrayListResponseDto.class)) + ) + @Operation(summary = "공유받은 기도제목 조회 (보관함 조회)") + public ApiResponseDto> getSharedPrayList( + @Parameter(hidden = true) @AuthenticationPrincipal User user) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, + shareService.getSharedPrayList(user.getUsername())); + } - @PostMapping() - @ApiResponse( - responseCode = "201", - description = "기도제목 공유", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class)) - ) - @Operation(summary = "기도제목 공유") - public ApiResponseDto sharePray( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @RequestBody SharedPrayRequestDto sharedPrayRequestDto) { - shareService.sharePray(user.getUsername(), sharedPrayRequestDto); - return ApiResponseDto.success(SuccessStatus.SHARE_PRAY_SUCCESS); - } + @PostMapping() + @ApiResponse( + responseCode = "201", + description = "기도제목 공유", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class)) + ) + @Operation(summary = "기도제목 공유") + public ApiResponseDto sharePray( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @RequestBody SharedPrayRequestDto sharedPrayRequestDto) { + shareService.sharePray(user.getUsername(), sharedPrayRequestDto); + return ApiResponseDto.success(SuccessStatus.SHARE_PRAY_SUCCESS); + } - @DeleteMapping() - @ApiResponse( - responseCode = "204", - description = "공유받은 기도제목 삭제", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class)) - ) - @Operation(summary = "공유받은 기도제목 삭제") - public ApiResponseDto deletePray( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @RequestParam Long sharedPrayId) { - shareService.deleteSharedPray(user.getUsername(), sharedPrayId); - return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS); - } + @DeleteMapping() + @ApiResponse( + responseCode = "204", + description = "공유받은 기도제목 삭제", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class)) + ) + @Operation(summary = "공유받은 기도제목 삭제") + public ApiResponseDto deletePray( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @RequestParam Long sharedPrayId) { + shareService.deleteSharedPray(user.getUsername(), sharedPrayId); + return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS); + } - @PostMapping("/save") - @ApiResponse( - responseCode = "201", - description = "공유받은 기도제목 저장", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class)) - ) - @Operation(summary = "공유받은 기도제목 저장") - public ApiResponseDto savePray( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @RequestParam Long sharedPrayId) { - shareService.saveSharedPray(user.getUsername(), sharedPrayId); - return ApiResponseDto.success(SuccessStatus.SHARE_PRAY_AGREE_SUCCESS); - } + @PostMapping("/save") + @ApiResponse( + responseCode = "201", + description = "공유받은 기도제목 저장", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class)) + ) + @Operation(summary = "공유받은 기도제목 저장") + public ApiResponseDto savePray( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @RequestParam Long sharedPrayId) { + shareService.saveSharedPray(user.getUsername(), sharedPrayId); + return ApiResponseDto.success(SuccessStatus.SHARE_PRAY_AGREE_SUCCESS); + } }