From 115c184eb0a2d409dc05274b400d2e2b1e51fd6f Mon Sep 17 00:00:00 2001 From: Hwangseoeun Date: Sun, 30 Nov 2025 17:52:19 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20api=EB=AA=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/petlog/docs/S3ControllerDocs.java | 2 +- src/main/java/com/petlog/s3/controller/S3SuccessCode.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/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; From 76be5221f9508fa79b30f7f462dccd83e7f7ea63 Mon Sep 17 00:00:00 2001 From: Hwangseoeun Date: Sun, 30 Nov 2025 18:33:00 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EC=9B=94=EB=B3=84=20=EC=9D=BC?= =?UTF-8?q?=EC=A0=95=20=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/GetAllDiaryResponseDto.java | 2 +- .../petlog/docs/ScheduleControllerDocs.java | 2 +- .../controller/ScheduleController.java | 12 ++----- .../GetMonthlyScheduleResponseDto.java | 22 +++++++++++++ .../repository/ScheduleRepository.java | 6 ++++ .../schedule/service/ScheduleService.java | 31 +++++++++++++++++++ .../service/dto/GetScheduleInfoDto.java | 4 +-- 7 files changed, 66 insertions(+), 13 deletions(-) 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/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/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, From afc8a9e373dab0146573ba196278cfcf9c7b99b3 Mon Sep 17 00:00:00 2001 From: Hwangseoeun Date: Sun, 30 Nov 2025 18:33:47 +0900 Subject: [PATCH 3/3] =?UTF-8?q?chore:=20=EA=B0=9C=EB=B0=9C=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=20DB=20=ED=85=8C=EC=9D=B4=EB=B8=94=20=EC=83=88?= =?UTF-8?q?=EB=A1=9C=20=EC=83=9D=EC=84=B1=ED=95=98=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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