diff --git a/src/main/java/com/example/stepperbackend/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/example/stepperbackend/apiPayload/code/status/ErrorStatus.java index 93c5277..f75393c 100644 --- a/src/main/java/com/example/stepperbackend/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/example/stepperbackend/apiPayload/code/status/ErrorStatus.java @@ -36,11 +36,16 @@ public enum ErrorStatus implements BaseErrorCode { // rate_diary EXERCISE_CARD_DOES_NOT_BELONG_TO_USER(HttpStatus.BAD_REQUEST, "RATE_DIARY4001", "운동 카드가 유저의 것이 아닙니다."), - RATE_DIARY_NOT_FOUND(HttpStatus.BAD_REQUEST, "RATE_DIARY4001", "평가 일지를 찾을 수 없습니다."); + RATE_DIARY_NOT_FOUND(HttpStatus.BAD_REQUEST, "RATE_DIARY4001", "평가 일지를 찾을 수 없습니다."), + + //exercise_step + EXERCISE_STEP_ID_NOT_FOUND(HttpStatus.BAD_REQUEST, "EXERCISE_STEP4001", "스텝 아이디를 찾을 수 없습니다."); + + + private final HttpStatus httpStatus; private final String code; private final String message; - @Override public ErrorReasonDTO getReason() { return ErrorReasonDTO.builder() diff --git a/src/main/java/com/example/stepperbackend/apiPayload/exception/handler/ExerciseStepHandler.java b/src/main/java/com/example/stepperbackend/apiPayload/exception/handler/ExerciseStepHandler.java new file mode 100644 index 0000000..481995d --- /dev/null +++ b/src/main/java/com/example/stepperbackend/apiPayload/exception/handler/ExerciseStepHandler.java @@ -0,0 +1,10 @@ +package com.example.stepperbackend.apiPayload.exception.handler; + +import com.example.stepperbackend.apiPayload.code.BaseErrorCode; +import com.example.stepperbackend.apiPayload.exception.GeneralException; + +public class ExerciseStepHandler extends GeneralException { + public ExerciseStepHandler(BaseErrorCode code) { + super(code); + } +} diff --git a/src/main/java/com/example/stepperbackend/converter/ExerciseCardConverter.java b/src/main/java/com/example/stepperbackend/converter/ExerciseCardConverter.java index 5372b28..b1d74b0 100644 --- a/src/main/java/com/example/stepperbackend/converter/ExerciseCardConverter.java +++ b/src/main/java/com/example/stepperbackend/converter/ExerciseCardConverter.java @@ -8,6 +8,8 @@ import com.example.stepperbackend.web.dto.ExerciseCardDto; import com.example.stepperbackend.web.dto.ExerciseStepDto; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -41,7 +43,7 @@ public static ExerciseCardDto.ExerciseCardResponseDto toDto(ExerciseCard exercis .second(exerciseCard.getSecond()) .materials(exerciseCard.getMaterials()) .bodyPart(exerciseCard.getBodyPart()) - .setpList(exerciseStepList) + .stepList(exerciseStepList) .build(); } @@ -62,4 +64,36 @@ public static ExerciseCardDto.ExerciseCardStatusResponseDto toStatusResponseDto( .status(exerciseCard.isStatus()) .build(); } + + + public static List toDayExerciseListDto(List exerciseCardList, List exerciseStepList) { + + // 결과 DTO 리스트 초기화 + List responseDtoList = new ArrayList<>(); + + // 각 운동 카드에 대해 DTO 생성 + for (ExerciseCard exerciseCard : exerciseCardList) { + // 해당 카드에 대한 운동 단계 필터링 + List stepsForCard = exerciseStepList.stream() + .filter(step -> step.getExerciseCard().equals(exerciseCard)) + .toList(); + + // DTO 생성 + ExerciseCardDto.ToDayExerciseResponseDto responseDto = ExerciseCardDto.ToDayExerciseResponseDto.builder() + .id(exerciseCard.getId()) + .bodyPart(exerciseCard.getBodyPart()) + .stepList(stepsForCard.stream() + .map(ExerciseStepConverter::toDto) + .collect(Collectors.toList())) + .build(); + + // 결과 리스트에 추가 + responseDtoList.add(responseDto); + } + + return responseDtoList; + } } + + + diff --git a/src/main/java/com/example/stepperbackend/converter/ExerciseStepConverter.java b/src/main/java/com/example/stepperbackend/converter/ExerciseStepConverter.java index aadc8eb..d3be663 100644 --- a/src/main/java/com/example/stepperbackend/converter/ExerciseStepConverter.java +++ b/src/main/java/com/example/stepperbackend/converter/ExerciseStepConverter.java @@ -22,7 +22,9 @@ public static ExerciseStepDto.ExerciseStepResponseDto toDto(ExerciseStep step) { MyExerciseDto.CheckExerciseResponseDTO myExerciseDto = MyExerciseConverter.toCheckExerciseDTO(step.getMyExercise()); return ExerciseStepDto.ExerciseStepResponseDto.builder() + .stepId(step.getId()) .step(step.getStep()) + .step_status(step.isStepStatus()) .myExercise(myExerciseDto) .build(); } diff --git a/src/main/java/com/example/stepperbackend/repository/ExerciseCardRepository.java b/src/main/java/com/example/stepperbackend/repository/ExerciseCardRepository.java index 2e467a4..bcbdc20 100644 --- a/src/main/java/com/example/stepperbackend/repository/ExerciseCardRepository.java +++ b/src/main/java/com/example/stepperbackend/repository/ExerciseCardRepository.java @@ -1,6 +1,7 @@ package com.example.stepperbackend.repository; import com.example.stepperbackend.domain.ExerciseCard; +import com.example.stepperbackend.domain.ExerciseStep; import com.example.stepperbackend.domain.Member; import com.example.stepperbackend.domain.enums.BodyPart; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,6 +9,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.time.LocalDate; import java.util.Optional; import java.util.List; @@ -19,6 +21,8 @@ public interface ExerciseCardRepository extends JpaRepository findAllByMemberAndMonth(@Param("member") Member member, @Param("month") int month); + List findAllByMemberAndDate(Member member, LocalDate date); + @Query("SELECT e FROM ExerciseCard e WHERE e.member = :member AND e.bodyPart = :bodyPart") List findByBodyPartAndMember(@Param("bodyPart") BodyPart bodyPart, @Param("member") Member member); diff --git a/src/main/java/com/example/stepperbackend/service/MyExerciseService/MyExerciseService.java b/src/main/java/com/example/stepperbackend/service/MyExerciseService/MyExerciseService.java index e6c1eeb..9b7276a 100644 --- a/src/main/java/com/example/stepperbackend/service/MyExerciseService/MyExerciseService.java +++ b/src/main/java/com/example/stepperbackend/service/MyExerciseService/MyExerciseService.java @@ -1,6 +1,7 @@ package com.example.stepperbackend.service.MyExerciseService; import com.example.stepperbackend.domain.MyExercise; +import com.example.stepperbackend.domain.enums.BodyPart; import com.example.stepperbackend.web.dto.MyExerciseDto; import java.util.List; @@ -9,5 +10,5 @@ public interface MyExerciseService { public MyExerciseDto.AddExerciseResponseDTO addMyExercise(MyExerciseDto.AddExerciseRequestDto request, String memberId); - public List checkMyExercise(MyExerciseDto.CheckExerciseRequestDto request, String memberId); + public List checkMyExercise(BodyPart bodyPart, String memberId); } diff --git a/src/main/java/com/example/stepperbackend/service/MyExerciseService/MyExerciseServiceImpl.java b/src/main/java/com/example/stepperbackend/service/MyExerciseService/MyExerciseServiceImpl.java index 3bf5029..03c42e7 100644 --- a/src/main/java/com/example/stepperbackend/service/MyExerciseService/MyExerciseServiceImpl.java +++ b/src/main/java/com/example/stepperbackend/service/MyExerciseService/MyExerciseServiceImpl.java @@ -7,6 +7,7 @@ import com.example.stepperbackend.converter.MyExerciseConverter; import com.example.stepperbackend.domain.Member; import com.example.stepperbackend.domain.MyExercise; +import com.example.stepperbackend.domain.enums.BodyPart; import com.example.stepperbackend.repository.MemberRepository; import com.example.stepperbackend.repository.MyExerciseRepository; import com.example.stepperbackend.web.dto.MyExerciseDto; @@ -33,18 +34,16 @@ public MyExerciseDto.AddExerciseResponseDTO addMyExercise(MyExerciseDto.AddExerc } - public List checkMyExercise(MyExerciseDto.CheckExerciseRequestDto request, String memberEmail) { + public List checkMyExercise(BodyPart bodyPart, String memberEmail) { List exercises = myExerciseRepository.findAll(); - List filteredList = exercises.stream() - .filter(myExercise -> myExercise.getBody_part().equals(request.getBody_part())&& - myExercise.getMember().getEmail().equals(memberEmail)).toList(); - - if(filteredList.isEmpty()){ - throw new ExerciseHandler(ErrorStatus.MY_EXERCISE_NOT_FOUND); - } + List filteredList = exercises.stream() + .filter(myExercise -> myExercise.getBody_part().equals(bodyPart) && + myExercise.getMember().getEmail().equals(memberEmail)).toList(); + if (filteredList.isEmpty()) { + throw new ExerciseHandler(ErrorStatus.MY_EXERCISE_NOT_FOUND); + } return filteredList; - } } diff --git a/src/main/java/com/example/stepperbackend/service/exerciseCardService/ExerciseCardService.java b/src/main/java/com/example/stepperbackend/service/exerciseCardService/ExerciseCardService.java index 545429e..c79b587 100644 --- a/src/main/java/com/example/stepperbackend/service/exerciseCardService/ExerciseCardService.java +++ b/src/main/java/com/example/stepperbackend/service/exerciseCardService/ExerciseCardService.java @@ -1,8 +1,10 @@ package com.example.stepperbackend.service.exerciseCardService; +import com.example.stepperbackend.domain.ExerciseCard; import com.example.stepperbackend.domain.enums.BodyPart; import com.example.stepperbackend.web.dto.ExerciseCardDto; +import java.time.LocalDate; import java.util.List; public interface ExerciseCardService { @@ -15,6 +17,8 @@ public interface ExerciseCardService { List getExerciseStatusByMonth(int month, String email); + List getTodayExercises(LocalDate date, String memberEmail); + List getExerciseCardWeek(BodyPart bodyPart, String email); } diff --git a/src/main/java/com/example/stepperbackend/service/exerciseCardService/ExerciseCardServiceImpl.java b/src/main/java/com/example/stepperbackend/service/exerciseCardService/ExerciseCardServiceImpl.java index edb6e7d..163d1d9 100644 --- a/src/main/java/com/example/stepperbackend/service/exerciseCardService/ExerciseCardServiceImpl.java +++ b/src/main/java/com/example/stepperbackend/service/exerciseCardService/ExerciseCardServiceImpl.java @@ -22,7 +22,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; + + import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -138,4 +141,24 @@ public List getExerciseCardWeek(Bod .weeks(weeks) .build()); } + + + + @Override + public List getTodayExercises(LocalDate date, String memberEmail) { + Member member = memberRepository.findByEmail(memberEmail) + .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); + List exerciseCardList = exerciseCardRepository.findAllByMemberAndDate(member, date); + List exerciseStepList = new ArrayList<>(); + + // 각 운동 카드에 대한 운동 단계 조회 + for (ExerciseCard exerciseCard : exerciseCardList) { + List stepsForCard = exerciseStepRepository.findAllByExerciseCard(exerciseCard); + exerciseStepList.addAll(stepsForCard); // 각 카드의 운동 단계를 리스트에 추가 + } + if(exerciseCardList.isEmpty()) throw new ExerciseCardHandler(ErrorStatus.EXERCISE_CARD_NOT_FOUND); + + return ExerciseCardConverter.toDayExerciseListDto(exerciseCardList, exerciseStepList); + + } } diff --git a/src/main/java/com/example/stepperbackend/service/exerciseStep/ExerciseStepService.java b/src/main/java/com/example/stepperbackend/service/exerciseStep/ExerciseStepService.java new file mode 100644 index 0000000..80f9847 --- /dev/null +++ b/src/main/java/com/example/stepperbackend/service/exerciseStep/ExerciseStepService.java @@ -0,0 +1,6 @@ +package com.example.stepperbackend.service.exerciseStep; + + +public interface ExerciseStepService { + void modifyStep(Long stepId); +} diff --git a/src/main/java/com/example/stepperbackend/service/exerciseStep/ExerciseStepServiceImpl.java b/src/main/java/com/example/stepperbackend/service/exerciseStep/ExerciseStepServiceImpl.java new file mode 100644 index 0000000..9a38316 --- /dev/null +++ b/src/main/java/com/example/stepperbackend/service/exerciseStep/ExerciseStepServiceImpl.java @@ -0,0 +1,27 @@ +package com.example.stepperbackend.service.exerciseStep; + +import com.example.stepperbackend.apiPayload.code.status.ErrorStatus; +import com.example.stepperbackend.apiPayload.exception.handler.ExerciseStepHandler; +import com.example.stepperbackend.domain.ExerciseStep; +import com.example.stepperbackend.repository.ExerciseStepRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + + +@Service +@RequiredArgsConstructor +public class ExerciseStepServiceImpl implements ExerciseStepService{ + + private final ExerciseStepRepository exerciseStepRepository; + + + @Override + public void modifyStep(Long stepId) { + ExerciseStep exerciseStep = exerciseStepRepository.findById(stepId) + .orElseThrow(() -> new ExerciseStepHandler(ErrorStatus.EXERCISE_STEP_ID_NOT_FOUND)); + + exerciseStep.setStepStatus(true); + exerciseStepRepository.save(exerciseStep); + } + +} diff --git a/src/main/java/com/example/stepperbackend/web/controller/ExerciseCardController.java b/src/main/java/com/example/stepperbackend/web/controller/ExerciseCardController.java index 1ca51be..7fffe90 100644 --- a/src/main/java/com/example/stepperbackend/web/controller/ExerciseCardController.java +++ b/src/main/java/com/example/stepperbackend/web/controller/ExerciseCardController.java @@ -2,6 +2,8 @@ import com.example.stepperbackend.apiPayload.ApiResponse; +import com.example.stepperbackend.converter.ExerciseCardConverter; +import com.example.stepperbackend.domain.ExerciseCard; import com.example.stepperbackend.domain.enums.BodyPart; import com.example.stepperbackend.jwt.JWTUtil; import com.example.stepperbackend.service.exerciseCardService.ExerciseCardService; @@ -10,8 +12,10 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; import java.util.List; @Slf4j @@ -53,6 +57,15 @@ public ApiResponse> getExerc return ApiResponse.onSuccess(response); } + @Operation(summary = "오늘의 운동 진행상태 조회 API", description = "오늘의 운동 진행상태 조회") + @GetMapping("/today") + public ApiResponse> getToDayExercise(@RequestParam("date") LocalDate date) { + String memberId = SecurityContextHolder.getContext().getAuthentication().getName(); + + List response = exerciseCardService.getTodayExercises(date, memberId); + return ApiResponse.onSuccess(response); + } + @Operation(summary = "운동 부위에 따른 작성된 카드 날짜 반환 API", description = "운동 부위의 운동 카드 요일 조회") @GetMapping("/check-date") public ApiResponse> getExerciseCardWeek(@RequestParam("bodyPart") String bodyPartStr, HttpServletRequest request) { diff --git a/src/main/java/com/example/stepperbackend/web/controller/MyExerciseController.java b/src/main/java/com/example/stepperbackend/web/controller/MyExerciseController.java index 394949a..2a5e902 100644 --- a/src/main/java/com/example/stepperbackend/web/controller/MyExerciseController.java +++ b/src/main/java/com/example/stepperbackend/web/controller/MyExerciseController.java @@ -2,6 +2,7 @@ import com.example.stepperbackend.apiPayload.ApiResponse; import com.example.stepperbackend.domain.MyExercise; +import com.example.stepperbackend.domain.enums.BodyPart; import com.example.stepperbackend.service.MyExerciseService.MyExerciseService; import com.example.stepperbackend.converter.MyExerciseConverter; import com.example.stepperbackend.web.dto.MyExerciseDto; @@ -32,7 +33,7 @@ public ApiResponse Add(@RequestBody @Valid @GetMapping("/check") @Operation(summary = "나만의 운동 조회 API", description = "나만의 운동 조회") - public ApiResponse> check(@RequestBody @Valid MyExerciseDto.CheckExerciseRequestDto request) { + public ApiResponse> check(@RequestParam @Valid BodyPart request) { String memberId = SecurityContextHolder.getContext().getAuthentication().getName(); List myExercise = myExerciseService.checkMyExercise(request, memberId); diff --git a/src/main/java/com/example/stepperbackend/web/controller/StepController.java b/src/main/java/com/example/stepperbackend/web/controller/StepController.java new file mode 100644 index 0000000..a2eb34b --- /dev/null +++ b/src/main/java/com/example/stepperbackend/web/controller/StepController.java @@ -0,0 +1,23 @@ +package com.example.stepperbackend.web.controller; + +import com.example.stepperbackend.apiPayload.ApiResponse; +import com.example.stepperbackend.service.exerciseStep.ExerciseStepService; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/exerciseStep") +public class StepController { + + private final ExerciseStepService exerciseStepService; + + @Operation(summary = "운동카드 단계별 상태 수정 API", description = "단계별 상태 수정") + @PostMapping("/step") + public ApiResponse modify(@RequestParam Long stepId) { + + exerciseStepService.modifyStep(stepId); + return ApiResponse.onSuccess(null); + } +} diff --git a/src/main/java/com/example/stepperbackend/web/dto/ExerciseCardDto.java b/src/main/java/com/example/stepperbackend/web/dto/ExerciseCardDto.java index f1ce6e7..cd8e27c 100644 --- a/src/main/java/com/example/stepperbackend/web/dto/ExerciseCardDto.java +++ b/src/main/java/com/example/stepperbackend/web/dto/ExerciseCardDto.java @@ -39,7 +39,8 @@ public static class ExerciseCardResponseDto { private int second; private String materials; private BodyPart bodyPart; - private List setpList; + + private List stepList; } @Builder @@ -51,6 +52,22 @@ public static class ExerciseCardStatusResponseDto { private boolean status; } + @Getter + public static class ToDayExerciseRequestDto{ + private LocalDate date; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class ToDayExerciseResponseDto { + private Long id; + private BodyPart bodyPart; + + private List stepList; + } + @Data public static class ExerciseCardWeekRequestDto { private String bodyPart; diff --git a/src/main/java/com/example/stepperbackend/web/dto/ExerciseStepDto.java b/src/main/java/com/example/stepperbackend/web/dto/ExerciseStepDto.java index 08990f0..1925cde 100644 --- a/src/main/java/com/example/stepperbackend/web/dto/ExerciseStepDto.java +++ b/src/main/java/com/example/stepperbackend/web/dto/ExerciseStepDto.java @@ -18,7 +18,9 @@ public static class ExerciseStepRequestDto { @NoArgsConstructor @AllArgsConstructor public static class ExerciseStepResponseDto { + private Long stepId; private int step; + private boolean step_status; private MyExerciseDto.CheckExerciseResponseDTO myExercise; } }