diff --git a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/adapter/FailureQueryAdapter.java b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/adapter/FailureQueryAdapter.java index f31fd02..714bd64 100644 --- a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/adapter/FailureQueryAdapter.java +++ b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/adapter/FailureQueryAdapter.java @@ -4,6 +4,7 @@ import com.todaysfail.domains.failure.domain.Failure; import com.todaysfail.domains.failure.port.FailureQueryPort; import com.todaysfail.domains.failure.repository.FailureRepository; +import java.time.LocalDate; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -30,4 +31,9 @@ public List queryFailureByUserId(Long userId) { public List queryDailyStatusByYearMonth(int year, int month) { return failureRepository.findDailyStatusByYearMonth(year, month); } + + @Override + public List queryFailureByUserIdAndDate(Long userId, LocalDate date) { + return failureRepository.findAllByUserIdAndFailureDate(userId, date); + } } diff --git a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/port/FailureQueryPort.java b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/port/FailureQueryPort.java index 25119d5..5634c3f 100644 --- a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/port/FailureQueryPort.java +++ b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/port/FailureQueryPort.java @@ -1,6 +1,7 @@ package com.todaysfail.domains.failure.port; import com.todaysfail.domains.failure.domain.Failure; +import java.time.LocalDate; import java.util.List; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -11,4 +12,6 @@ public interface FailureQueryPort { List queryFailureByUserId(Long userId); List queryDailyStatusByYearMonth(int year, int month); + + List queryFailureByUserIdAndDate(Long userId, LocalDate date); } diff --git a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/repository/FailureRepository.java b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/repository/FailureRepository.java index 6610784..1359e8e 100644 --- a/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/repository/FailureRepository.java +++ b/TodaysFail-Domain/src/main/java/com/todaysfail/domains/failure/repository/FailureRepository.java @@ -1,6 +1,7 @@ package com.todaysfail.domains.failure.repository; import com.todaysfail.domains.failure.domain.Failure; +import java.time.LocalDate; import java.util.List; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -18,4 +19,6 @@ public interface FailureRepository extends JpaRepository { + "and month(f.failureDate) = :month " + "group by DAY(f.failureDate)") List findDailyStatusByYearMonth(int year, int month); + + List findAllByUserIdAndFailureDate(Long userId, LocalDate date); } diff --git a/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/FailureController.java b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/FailureController.java index 7e88c99..8fbb423 100644 --- a/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/FailureController.java +++ b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/FailureController.java @@ -2,8 +2,10 @@ import com.todaysfail.api.web.common.SliceResponse; import com.todaysfail.api.web.failure.dto.request.FailureRegisterRequest; +import com.todaysfail.api.web.failure.dto.response.FailureByCategoryResponse; import com.todaysfail.api.web.failure.dto.response.FailureMonthlyDailyStatusResponse; import com.todaysfail.api.web.failure.dto.response.FailureResponse; +import com.todaysfail.api.web.failure.usecase.FailureByCategoryQueryUseCase; import com.todaysfail.api.web.failure.usecase.FailureFeedQueryUseCase; import com.todaysfail.api.web.failure.usecase.FailureLikeUseCase; import com.todaysfail.api.web.failure.usecase.FailureMonthlyDailyStatusUseCase; @@ -11,12 +13,14 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import java.time.LocalDate; import java.time.YearMonth; import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springdoc.api.annotations.ParameterObject; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -35,6 +39,7 @@ public class FailureController { private final FailureFeedQueryUseCase failureFeedQueryUseCase; private final FailureLikeUseCase failureLikeUseCase; private final FailureMonthlyDailyStatusUseCase failureMonthlyDailyStatusUseCase; + private final FailureByCategoryQueryUseCase failureByCategoryQueryUseCase; @Operation(summary = "실패 등록") @PostMapping @@ -60,4 +65,11 @@ public void likeFailure(@PathVariable Long failureId) { public FailureMonthlyDailyStatusResponse checkMonthFailures(@RequestParam YearMonth yearMonth) { return failureMonthlyDailyStatusUseCase.execute(yearMonth); } + + @Operation(summary = "선택 한 날짜의 실패 기록을 카테고리별로 조회") + @GetMapping("/{date}") + public FailureByCategoryResponse getFailures( + @PathVariable @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) { + return failureByCategoryQueryUseCase.execute(date); + } } diff --git a/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/dto/response/FailureByCategoryResponse.java b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/dto/response/FailureByCategoryResponse.java new file mode 100644 index 0000000..c4ae658 --- /dev/null +++ b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/dto/response/FailureByCategoryResponse.java @@ -0,0 +1,6 @@ +package com.todaysfail.api.web.failure.dto.response; + +import java.util.List; +import java.util.Map; + +public record FailureByCategoryResponse(Map> response) {} diff --git a/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/mapper/FailureMapper.java b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/mapper/FailureMapper.java index 49c8764..73e538c 100644 --- a/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/mapper/FailureMapper.java +++ b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/mapper/FailureMapper.java @@ -12,6 +12,7 @@ import com.todaysfail.domains.user.domain.User; import com.todaysfail.domains.user.port.UserQueryPort; import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Slice; @@ -34,4 +35,10 @@ public FailureResponse toFailureResponse(Failure failure) { public SliceResponse toFailureSliceResponse(Slice failureSlice) { return SliceResponse.of(failureSlice.map(failure -> toFailureResponse(failure))); } + + public List toFailureListResponse(List failures) { + return failures.stream() + .map(failure -> toFailureResponse(failure)) + .collect(Collectors.toList()); + } } diff --git a/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/usecase/FailureByCategoryQueryUseCase.java b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/usecase/FailureByCategoryQueryUseCase.java new file mode 100644 index 0000000..139b22d --- /dev/null +++ b/TodaysFail-Interface/src/main/java/com/todaysfail/api/web/failure/usecase/FailureByCategoryQueryUseCase.java @@ -0,0 +1,33 @@ +package com.todaysfail.api.web.failure.usecase; + +import com.todaysfail.api.web.failure.dto.response.FailureByCategoryResponse; +import com.todaysfail.api.web.failure.dto.response.FailureResponse; +import com.todaysfail.api.web.failure.mapper.FailureMapper; +import com.todaysfail.common.annotation.UseCase; +import com.todaysfail.config.security.SecurityUtils; +import com.todaysfail.domains.failure.domain.Failure; +import com.todaysfail.domains.failure.port.FailureQueryPort; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; + +@UseCase +@RequiredArgsConstructor +public class FailureByCategoryQueryUseCase { + private final FailureMapper failureMapper; + private final FailureQueryPort failureQueryPort; + + public FailureByCategoryResponse execute(final LocalDate date) { + final Long userId = SecurityUtils.getCurrentUserId(); + List failures = failureQueryPort.queryFailureByUserIdAndDate(userId, date); + Map> map = + failureMapper.toFailureListResponse(failures).stream() + .collect( + Collectors.groupingBy( + failureResponse -> + failureResponse.category().categoryId())); + return new FailureByCategoryResponse(map); + } +}