diff --git a/src/main/java/com/petlog/diary/controller/dto/response/GetAllDiaryResponseDto.java b/src/main/java/com/petlog/diary/controller/dto/response/GetAllDiaryResponseDto.java index 3eabb34..5f80f91 100644 --- a/src/main/java/com/petlog/diary/controller/dto/response/GetAllDiaryResponseDto.java +++ b/src/main/java/com/petlog/diary/controller/dto/response/GetAllDiaryResponseDto.java @@ -13,7 +13,7 @@ public record GetAllDiaryResponseDto( ) { - public static GetAllDiaryResponseDto from(List diaryList) { + public static GetAllDiaryResponseDto from(final List diaryList) { List grouped = diaryList.stream() diff --git a/src/main/java/com/petlog/docs/S3ControllerDocs.java b/src/main/java/com/petlog/docs/S3ControllerDocs.java index 0d157fb..8a72a72 100644 --- a/src/main/java/com/petlog/docs/S3ControllerDocs.java +++ b/src/main/java/com/petlog/docs/S3ControllerDocs.java @@ -12,7 +12,7 @@ @Tag(name = "S3 API") public interface S3ControllerDocs { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "201", description = "S3 presigned URL 생성에 성공하였습니다.") + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "201", description = "S3 presigned URL 발급에 성공하였습니다.") @Operation(summary = "S3 Presigned URL 발급 API") ResponseEntity> issueS3PresignedUrls(@Authenticated final Long memberId, @RequestBody final S3PresignedUrlsRequestDto request); } diff --git a/src/main/java/com/petlog/docs/ScheduleControllerDocs.java b/src/main/java/com/petlog/docs/ScheduleControllerDocs.java index 5ec9b77..86de46b 100644 --- a/src/main/java/com/petlog/docs/ScheduleControllerDocs.java +++ b/src/main/java/com/petlog/docs/ScheduleControllerDocs.java @@ -24,7 +24,7 @@ public interface ScheduleControllerDocs { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "월별 일정 전체 조회에 성공하였습니다.") @Operation(summary = "월별 일정 전체 조회 API") - ResponseEntity> getAllSchedule(@PathVariable final Long groupId, @RequestParam @DateTimeFormat(pattern = "yyyy-MM") final YearMonth date); + ResponseEntity> getAllSchedule(@Authenticated final Long memberId, @PathVariable final Long groupId, @RequestParam @DateTimeFormat(pattern = "yyyy-MM") final YearMonth date); @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "일정 상세 내용 수정에 성공하였습니다.") @Operation(summary = "일정 상세 내용 수정 API") diff --git a/src/main/java/com/petlog/s3/controller/S3SuccessCode.java b/src/main/java/com/petlog/s3/controller/S3SuccessCode.java index ddc95f5..af27d52 100644 --- a/src/main/java/com/petlog/s3/controller/S3SuccessCode.java +++ b/src/main/java/com/petlog/s3/controller/S3SuccessCode.java @@ -9,7 +9,7 @@ @RequiredArgsConstructor public enum S3SuccessCode implements SuccessCode { - GENERATE_S3_PRESIGNED_URLS(HttpStatus.CREATED.value(), "S3 presigned URL 생성에 성공하였습니다."), + GENERATE_S3_PRESIGNED_URLS(HttpStatus.CREATED.value(), "S3 presigned URL 발급에 성공하였습니다."), ; private final int value; diff --git a/src/main/java/com/petlog/schedule/controller/ScheduleController.java b/src/main/java/com/petlog/schedule/controller/ScheduleController.java index d422700..aab4422 100644 --- a/src/main/java/com/petlog/schedule/controller/ScheduleController.java +++ b/src/main/java/com/petlog/schedule/controller/ScheduleController.java @@ -6,10 +6,8 @@ import com.petlog.schedule.controller.dto.request.CreateScheduleRequestDto; import com.petlog.schedule.controller.dto.request.UpdateScheduleRequestDto; import com.petlog.schedule.controller.dto.response.GetMonthlyScheduleResponseDto; -import com.petlog.schedule.entity.ScheduleType; import com.petlog.schedule.service.ScheduleService; import com.petlog.schedule.service.dto.CreateScheduleDto; -import com.petlog.schedule.service.dto.GetDailyScheduleDto; import com.petlog.schedule.service.dto.GetScheduleInfoDto; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; @@ -24,8 +22,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.time.LocalDate; -import java.time.LocalDateTime; import java.time.YearMonth; import java.util.List; @@ -65,15 +61,13 @@ public ResponseEntity> createSchedule( @GetMapping public ResponseEntity> getAllSchedule( + @Authenticated final Long memberId, @PathVariable final Long groupId, @RequestParam @DateTimeFormat(pattern = "yyyy-MM") final YearMonth date ) { - final GetScheduleInfoDto dto = new GetScheduleInfoDto(1L, "병원", true, LocalDateTime.now(), LocalDateTime.now(), ScheduleType.BLUE, LocalDateTime.now(), "memo"); - - final GetDailyScheduleDto daily = new GetDailyScheduleDto(LocalDate.now(), List.of(dto)); - - final GetMonthlyScheduleResponseDto response = new GetMonthlyScheduleResponseDto(List.of(daily)); + final List schedules = scheduleService.getMonthlySchedule(memberId, groupId, date); + final GetMonthlyScheduleResponseDto response = GetMonthlyScheduleResponseDto.from(schedules); return ResponseEntity.ok( ApiResponse.successWithData(GET_ALL_SCHEDULE, response) diff --git a/src/main/java/com/petlog/schedule/controller/dto/response/GetMonthlyScheduleResponseDto.java b/src/main/java/com/petlog/schedule/controller/dto/response/GetMonthlyScheduleResponseDto.java index 1f44ce0..ff85cfb 100644 --- a/src/main/java/com/petlog/schedule/controller/dto/response/GetMonthlyScheduleResponseDto.java +++ b/src/main/java/com/petlog/schedule/controller/dto/response/GetMonthlyScheduleResponseDto.java @@ -1,12 +1,34 @@ package com.petlog.schedule.controller.dto.response; import com.petlog.schedule.service.dto.GetDailyScheduleDto; +import com.petlog.schedule.service.dto.GetScheduleInfoDto; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; public record GetMonthlyScheduleResponseDto( List monthlySchedules ) { + + public static GetMonthlyScheduleResponseDto from(final List schedules) { + + List grouped = + schedules.stream() + .collect(Collectors.groupingBy(s -> s.startAt().toLocalDate())) + .entrySet() + .stream() + .map(entry -> + new GetDailyScheduleDto( + entry.getKey(), + entry.getValue() + ) + ) + .sorted(Comparator.comparing(GetDailyScheduleDto::date)) + .toList(); + + return new GetMonthlyScheduleResponseDto(grouped); + } } diff --git a/src/main/java/com/petlog/schedule/repository/ScheduleRepository.java b/src/main/java/com/petlog/schedule/repository/ScheduleRepository.java index 4f1b204..5651ce7 100644 --- a/src/main/java/com/petlog/schedule/repository/ScheduleRepository.java +++ b/src/main/java/com/petlog/schedule/repository/ScheduleRepository.java @@ -1,7 +1,13 @@ package com.petlog.schedule.repository; +import com.petlog.petgroup.entity.PetGroup; import com.petlog.schedule.entity.Schedule; import org.springframework.data.jpa.repository.JpaRepository; +import java.time.LocalDateTime; +import java.util.List; + public interface ScheduleRepository extends JpaRepository { + + List findAllByPetGroupAndStartAtBetween(final PetGroup petGroup, final LocalDateTime start, final LocalDateTime end); } diff --git a/src/main/java/com/petlog/schedule/service/ScheduleService.java b/src/main/java/com/petlog/schedule/service/ScheduleService.java index a645b39..4365cd3 100644 --- a/src/main/java/com/petlog/schedule/service/ScheduleService.java +++ b/src/main/java/com/petlog/schedule/service/ScheduleService.java @@ -9,10 +9,15 @@ import com.petlog.schedule.entity.Schedule; import com.petlog.schedule.repository.ScheduleRepository; import com.petlog.schedule.service.dto.CreateScheduleDto; +import com.petlog.schedule.service.dto.GetScheduleInfoDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.time.YearMonth; +import java.util.List; + @RequiredArgsConstructor @Service public class ScheduleService { @@ -56,4 +61,30 @@ private PetGroupMember getPetGroupMember(final Member member, final PetGroup pet return petGroupMemberRepository.findByMemberAndPetGroup(member, petGroup) .orElseThrow(() -> new IllegalArgumentException("그룹에 존재하지 않는 회원입니다.")); } + + @Transactional(readOnly = true) + public List getMonthlySchedule(final Long memberId, final Long groupId, final YearMonth date) { + final Member member = getMember(memberId); + final PetGroup petGroup = getPetGroup(groupId); + getPetGroupMember(member, petGroup); + + final LocalDateTime start = date.atDay(1).atStartOfDay(); + final LocalDateTime end = date.atEndOfMonth().atTime(23, 59, 59); + + final List schedules = + scheduleRepository.findAllByPetGroupAndStartAtBetween(petGroup, start, end); + + return schedules.stream() + .map(s -> new GetScheduleInfoDto( + s.getId(), + s.getTitle(), + s.isAllDay(), + s.getStartAt(), + s.getEndAt(), + s.getType(), + s.getRemindAt(), + s.getMemo() + )) + .toList(); + } } diff --git a/src/main/java/com/petlog/schedule/service/dto/GetScheduleInfoDto.java b/src/main/java/com/petlog/schedule/service/dto/GetScheduleInfoDto.java index b1959a0..23dd86e 100644 --- a/src/main/java/com/petlog/schedule/service/dto/GetScheduleInfoDto.java +++ b/src/main/java/com/petlog/schedule/service/dto/GetScheduleInfoDto.java @@ -14,9 +14,9 @@ public record GetScheduleInfoDto( boolean isAllDay, - LocalDateTime startTime, + LocalDateTime startAt, - LocalDateTime endTime, + LocalDateTime endAt, @Schema(description = "YELLOW/GREEN/BLUE") ScheduleType tag, diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 76dd51f..0c76d77 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -6,6 +6,6 @@ spring: password: ${DB_PASSWORD:root} jpa: - hibernate.ddl-auto: update + hibernate.ddl-auto: create show-sql: true properties.hibernate.format_sql: true