From 54ba4c59c1c617f961cce07a50fc8d295f54e1b4 Mon Sep 17 00:00:00 2001 From: onpyeong Date: Wed, 31 Jan 2024 04:31:25 +0900 Subject: [PATCH] =?UTF-8?q?[Feat]:=20=EB=B3=B5=EC=9A=A9=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 복용 체크 완료 API 구현 복용 체크 취소 API 구현 Related to: #58 --- .../sobok/SobokSobok/exception/ErrorCode.java | 1 + .../SobokSobok/exception/SuccessCode.java | 2 + .../pill/application/PillScheduleService.java | 47 ++++++++++++++ .../application/PillScheduleServiceUtil.java | 17 ++++++ .../SobokSobok/pill/domain/PillSchedule.java | 4 ++ .../pill/ui/PillScheduleController.java | 61 +++++++++++++++++++ .../ui/dto/CheckPillScheduleResponse.java | 16 +++++ 7 files changed, 148 insertions(+) create mode 100644 src/main/java/io/sobok/SobokSobok/pill/application/PillScheduleService.java create mode 100644 src/main/java/io/sobok/SobokSobok/pill/application/PillScheduleServiceUtil.java create mode 100644 src/main/java/io/sobok/SobokSobok/pill/ui/PillScheduleController.java create mode 100644 src/main/java/io/sobok/SobokSobok/pill/ui/dto/CheckPillScheduleResponse.java diff --git a/src/main/java/io/sobok/SobokSobok/exception/ErrorCode.java b/src/main/java/io/sobok/SobokSobok/exception/ErrorCode.java index 0fd7c78..a0a7f83 100644 --- a/src/main/java/io/sobok/SobokSobok/exception/ErrorCode.java +++ b/src/main/java/io/sobok/SobokSobok/exception/ErrorCode.java @@ -32,6 +32,7 @@ public enum ErrorCode { UNREGISTERED_PILL(HttpStatus.NOT_FOUND, "등록되지 않은 약입니다."), UNAUTHORIZED_PILL(HttpStatus.FORBIDDEN, "접근 권한이 없는 약입니다."), NOT_SEND_PILL(HttpStatus.NOT_FOUND, "전송된 적이 없는 약입니다."), + UNREGISTERED_PILL_SCHEDULE(HttpStatus.NOT_FOUND, "등록되지 않은 약 일정입니다."), // friend diff --git a/src/main/java/io/sobok/SobokSobok/exception/SuccessCode.java b/src/main/java/io/sobok/SobokSobok/exception/SuccessCode.java index 7249c37..44d1f9a 100644 --- a/src/main/java/io/sobok/SobokSobok/exception/SuccessCode.java +++ b/src/main/java/io/sobok/SobokSobok/exception/SuccessCode.java @@ -24,6 +24,8 @@ public enum SuccessCode { GET_PILL_COUNT_SUCCESS(HttpStatus.OK, "약 개수 조회에 성공했습니다."), SEND_PILL_SUCCESS(HttpStatus.CREATED, "약 전송에 성공했습니다."), DELETE_PILL_SUCCESS(HttpStatus.OK, "약 삭제에 성공했습니다."), + CHECK_PILL_SCHEDULE_SUCCESS(HttpStatus.OK, "복용 완료 체크에 성공했습니다."), + UNCHECK_PILL_SCHEDULE_SUCCESS(HttpStatus.OK, "복용 체크 취소에 성공했습니다."), // friend ADD_FRIEND_SUCCESS(HttpStatus.OK, "공유 요청에 성공했습니다."), diff --git a/src/main/java/io/sobok/SobokSobok/pill/application/PillScheduleService.java b/src/main/java/io/sobok/SobokSobok/pill/application/PillScheduleService.java new file mode 100644 index 0000000..2e79a33 --- /dev/null +++ b/src/main/java/io/sobok/SobokSobok/pill/application/PillScheduleService.java @@ -0,0 +1,47 @@ +package io.sobok.SobokSobok.pill.application; + +import io.sobok.SobokSobok.auth.application.util.UserServiceUtil; +import io.sobok.SobokSobok.auth.infrastructure.UserRepository; +import io.sobok.SobokSobok.exception.ErrorCode; +import io.sobok.SobokSobok.exception.model.ForbiddenException; +import io.sobok.SobokSobok.pill.domain.Pill; +import io.sobok.SobokSobok.pill.domain.PillSchedule; +import io.sobok.SobokSobok.pill.infrastructure.PillRepository; +import io.sobok.SobokSobok.pill.infrastructure.PillScheduleRepository; +import io.sobok.SobokSobok.pill.ui.dto.CheckPillScheduleResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class PillScheduleService { + + private final UserRepository userRepository; + private final PillRepository pillRepository; + private final PillScheduleRepository pillScheduleRepository; + + @Transactional + public CheckPillScheduleResponse changePillScheduleCheck(Long userId, Long scheduleId, Boolean isCheck) { + UserServiceUtil.existsUserById(userRepository, userId); + + PillSchedule pillSchedule = PillScheduleServiceUtil.findPillScheduleById(pillScheduleRepository, scheduleId); + + Pill pill = PillServiceUtil.findPillById(pillRepository, pillSchedule.getPillId()); + + if (!pill.getUserId().equals(userId)) { + throw new ForbiddenException(ErrorCode.FORBIDDEN_EXCEPTION); + } + + pillSchedule.changePillScheduleCheck(isCheck); + + return CheckPillScheduleResponse.builder() + .scheduleId(scheduleId) + .pillId(pill.getId()) + .userId(userId) + .scheduleDate(pillSchedule.getScheduleDate().atStartOfDay()) + .scheduleTime(pillSchedule.getScheduleTime()) + .isCheck(isCheck) + .build(); + } +} diff --git a/src/main/java/io/sobok/SobokSobok/pill/application/PillScheduleServiceUtil.java b/src/main/java/io/sobok/SobokSobok/pill/application/PillScheduleServiceUtil.java new file mode 100644 index 0000000..d6b1d12 --- /dev/null +++ b/src/main/java/io/sobok/SobokSobok/pill/application/PillScheduleServiceUtil.java @@ -0,0 +1,17 @@ +package io.sobok.SobokSobok.pill.application; + +import io.sobok.SobokSobok.exception.ErrorCode; +import io.sobok.SobokSobok.exception.model.NotFoundException; +import io.sobok.SobokSobok.pill.domain.PillSchedule; +import io.sobok.SobokSobok.pill.infrastructure.PillScheduleRepository; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class PillScheduleServiceUtil { + + public static PillSchedule findPillScheduleById(PillScheduleRepository pillScheduleRepository, Long id) { + return pillScheduleRepository.findById(id) + .orElseThrow(() -> new NotFoundException(ErrorCode.UNREGISTERED_PILL_SCHEDULE)); + } +} diff --git a/src/main/java/io/sobok/SobokSobok/pill/domain/PillSchedule.java b/src/main/java/io/sobok/SobokSobok/pill/domain/PillSchedule.java index 6028c1c..9fa4e0e 100644 --- a/src/main/java/io/sobok/SobokSobok/pill/domain/PillSchedule.java +++ b/src/main/java/io/sobok/SobokSobok/pill/domain/PillSchedule.java @@ -40,4 +40,8 @@ public PillSchedule(LocalDate scheduleDate, String scheduleTime, Long pillId) { this.scheduleTime = scheduleTime; this.pillId = pillId; } + + public void changePillScheduleCheck(Boolean isCheck) { + this.isCheck = isCheck; + } } diff --git a/src/main/java/io/sobok/SobokSobok/pill/ui/PillScheduleController.java b/src/main/java/io/sobok/SobokSobok/pill/ui/PillScheduleController.java new file mode 100644 index 0000000..e9a5036 --- /dev/null +++ b/src/main/java/io/sobok/SobokSobok/pill/ui/PillScheduleController.java @@ -0,0 +1,61 @@ +package io.sobok.SobokSobok.pill.ui; + +import io.sobok.SobokSobok.auth.domain.User; +import io.sobok.SobokSobok.common.dto.ApiResponse; +import io.sobok.SobokSobok.exception.SuccessCode; +import io.sobok.SobokSobok.pill.application.PillScheduleService; +import io.sobok.SobokSobok.pill.ui.dto.CheckPillScheduleResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/schedule") +@Tag(name = "Schedule", description = "약 일정 관련 컨트롤러") +public class PillScheduleController { + + private final PillScheduleService pillScheduleService; + + @PutMapping("/check/{scheduleId}") + @Operation( + summary = "복용 체크 완료 API 메서드", + description = "약 일정의 복용 체크를 완료하는 메서드입니다." + ) + public ResponseEntity> checkPillSchedule( + @AuthenticationPrincipal User user, + @PathVariable Long scheduleId + ) { + return ResponseEntity + .status(HttpStatus.OK) + .body(ApiResponse.success( + SuccessCode.CHECK_PILL_SCHEDULE_SUCCESS, + pillScheduleService.changePillScheduleCheck(user.getId(), scheduleId, true) + )); + } + + @PutMapping("/uncheck/{scheduleId}") + @Operation( + summary = "복용 체크 취소 API 메서드", + description = "약 일정의 복용 체크를 취소하는 메서드입니다." + ) + public ResponseEntity> uncheckPillSchedule( + @AuthenticationPrincipal User user, + @PathVariable Long scheduleId + ) { + return ResponseEntity + .status(HttpStatus.OK) + .body(ApiResponse.success( + SuccessCode.UNCHECK_PILL_SCHEDULE_SUCCESS, + pillScheduleService.changePillScheduleCheck(user.getId(), scheduleId, false) + )); + } + +} diff --git a/src/main/java/io/sobok/SobokSobok/pill/ui/dto/CheckPillScheduleResponse.java b/src/main/java/io/sobok/SobokSobok/pill/ui/dto/CheckPillScheduleResponse.java new file mode 100644 index 0000000..04a8a83 --- /dev/null +++ b/src/main/java/io/sobok/SobokSobok/pill/ui/dto/CheckPillScheduleResponse.java @@ -0,0 +1,16 @@ +package io.sobok.SobokSobok.pill.ui.dto; + +import java.time.LocalDateTime; +import lombok.Builder; + +@Builder +public record CheckPillScheduleResponse( + Long scheduleId, + Long pillId, + Long userId, + LocalDateTime scheduleDate, + String scheduleTime, + Boolean isCheck +) { + +}