diff --git a/src/main/java/org/guzzing/studayserver/domain/academy/controller/AcademyController.java b/src/main/java/org/guzzing/studayserver/domain/academy/controller/AcademyController.java index 00fbff400..513cf0aa3 100644 --- a/src/main/java/org/guzzing/studayserver/domain/academy/controller/AcademyController.java +++ b/src/main/java/org/guzzing/studayserver/domain/academy/controller/AcademyController.java @@ -18,6 +18,7 @@ import org.guzzing.studayserver.domain.academy.service.dto.result.AcademiesFilterWithScrollResults; import org.guzzing.studayserver.domain.academy.service.dto.result.LessonInfoToCreateDashboardResults; import org.guzzing.studayserver.domain.auth.memberId.MemberId; +import org.springframework.http.CacheControl; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/org/guzzing/studayserver/domain/calendar/controller/AcademyCalendarController.java b/src/main/java/org/guzzing/studayserver/domain/calendar/controller/AcademyCalendarController.java index 18fae99fb..854fc3f95 100644 --- a/src/main/java/org/guzzing/studayserver/domain/calendar/controller/AcademyCalendarController.java +++ b/src/main/java/org/guzzing/studayserver/domain/calendar/controller/AcademyCalendarController.java @@ -12,6 +12,7 @@ import org.guzzing.studayserver.domain.calendar.controller.dto.response.AcademyCalendarUpdateResponse; import org.guzzing.studayserver.domain.calendar.facade.AcademyCalendarFacade; import org.guzzing.studayserver.domain.calendar.facade.dto.AcademyCalendarDetailFacadeResult; +import org.guzzing.studayserver.domain.calendar.facade.dto.AcademyScheduleLoadToUpdateFacadeResult; import org.guzzing.studayserver.domain.calendar.service.AcademyCalendarService; import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarCreateResults; import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarLoadToUpdateResult; @@ -38,7 +39,7 @@ public class AcademyCalendarController { private final AcademyCalendarFacade academyCalendarFacade; public AcademyCalendarController(AcademyCalendarService academyCalendarService, - AcademyCalendarFacade academyCalendarFacade) { + AcademyCalendarFacade academyCalendarFacade) { this.academyCalendarService = academyCalendarService; this.academyCalendarFacade = academyCalendarFacade; } @@ -65,12 +66,12 @@ public ResponseEntity createAcademyCalendar( public ResponseEntity loadTimeTemplateToUpdate( @PathVariable Long academyScheduleId) { - AcademyCalendarLoadToUpdateResult academyCalendarLoadToUpdateResult = academyCalendarService.loadTimeTemplateToUpdate( - academyScheduleId); + AcademyScheduleLoadToUpdateFacadeResult academyScheduleLoadToUpdateFacadeResult + = academyCalendarFacade.loadTimeTemplateToUpdate(academyScheduleId); return ResponseEntity .status(HttpStatus.OK) - .body(AcademyCalendarLoadToUpdateResponse.from(academyCalendarLoadToUpdateResult)); + .body(AcademyCalendarLoadToUpdateResponse.from(academyScheduleLoadToUpdateFacadeResult)); } @PutMapping( diff --git a/src/main/java/org/guzzing/studayserver/domain/calendar/controller/dto/response/AcademyCalendarLoadToUpdateResponse.java b/src/main/java/org/guzzing/studayserver/domain/calendar/controller/dto/response/AcademyCalendarLoadToUpdateResponse.java index 19a06d890..70b50af65 100644 --- a/src/main/java/org/guzzing/studayserver/domain/calendar/controller/dto/response/AcademyCalendarLoadToUpdateResponse.java +++ b/src/main/java/org/guzzing/studayserver/domain/calendar/controller/dto/response/AcademyCalendarLoadToUpdateResponse.java @@ -3,7 +3,8 @@ import java.time.DayOfWeek; import java.time.LocalDate; import java.util.List; -import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarLoadToUpdateResult; + +import org.guzzing.studayserver.domain.calendar.facade.dto.AcademyScheduleLoadToUpdateFacadeResult; public record AcademyCalendarLoadToUpdateResponse( Long childId, @@ -17,15 +18,14 @@ public record AcademyCalendarLoadToUpdateResponse( String memo ) { - public static AcademyCalendarLoadToUpdateResponse from(AcademyCalendarLoadToUpdateResult result) { + public static AcademyCalendarLoadToUpdateResponse from(AcademyScheduleLoadToUpdateFacadeResult result) { return new AcademyCalendarLoadToUpdateResponse( result.childId(), result.academyId(), result.lessonId(), result.dashboardId(), - result.lessonScheduleAccessResults().stream() - .map(lessonScheduleAccessResult -> - LessonScheduleLoadToUpdateResponse.from(lessonScheduleAccessResult)) + result.lessonSchedule().stream() + .map(LessonScheduleLoadToUpdateResponse::from) .toList(), result.startDateOfAttendance(), result.endDateOfAttendance(), @@ -40,7 +40,7 @@ public record LessonScheduleLoadToUpdateResponse( ) { public static LessonScheduleLoadToUpdateResponse from( - AcademyCalendarLoadToUpdateResult.LessonScheduleInfo result) { + AcademyScheduleLoadToUpdateFacadeResult.LessonScheduleInfo result) { return new LessonScheduleLoadToUpdateResponse( result.dayOfWeek(), new LessonTime( @@ -56,4 +56,5 @@ public record LessonTime( } } + } diff --git a/src/main/java/org/guzzing/studayserver/domain/calendar/facade/AcademyCalendarFacade.java b/src/main/java/org/guzzing/studayserver/domain/calendar/facade/AcademyCalendarFacade.java index 1172d49c3..8fcc4d449 100644 --- a/src/main/java/org/guzzing/studayserver/domain/calendar/facade/AcademyCalendarFacade.java +++ b/src/main/java/org/guzzing/studayserver/domain/calendar/facade/AcademyCalendarFacade.java @@ -4,11 +4,16 @@ import org.guzzing.studayserver.domain.academy.service.dto.result.AcademyAndLessonDetailResult; import org.guzzing.studayserver.domain.calendar.facade.dto.AcademyCalendarDetailFacadeParam; import org.guzzing.studayserver.domain.calendar.facade.dto.AcademyCalendarDetailFacadeResult; +import org.guzzing.studayserver.domain.calendar.facade.dto.AcademyScheduleLoadToUpdateFacadeResult; import org.guzzing.studayserver.domain.calendar.service.AcademyCalendarService; import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarDetailResult; +import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarLoadToUpdateResult; import org.guzzing.studayserver.domain.child.service.ChildAccessService; import org.guzzing.studayserver.domain.child.service.result.AcademyCalendarDetailChildInfo; +import org.guzzing.studayserver.domain.dashboard.service.DashboardService; +import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashboardScheduleAccessResult; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service public class AcademyCalendarFacade { @@ -16,14 +21,17 @@ public class AcademyCalendarFacade { private final AcademyAccessService academyService; private final ChildAccessService childService; private final AcademyCalendarService academyCalendarService; + private final DashboardService dashboardService; public AcademyCalendarFacade(AcademyAccessService academyService, ChildAccessService childService, - AcademyCalendarService academyCalendarService) { + AcademyCalendarService academyCalendarService, DashboardService dashboardService) { this.academyService = academyService; this.childService = childService; this.academyCalendarService = academyCalendarService; + this.dashboardService = dashboardService; } + @Transactional(readOnly = true) public AcademyCalendarDetailFacadeResult getCalendarDetailInfo(AcademyCalendarDetailFacadeParam param) { AcademyAndLessonDetailResult academyAndLessonDetailResult = academyService.getAcademyAndLessonDetail( param.lessonId()); @@ -41,4 +49,14 @@ public AcademyCalendarDetailFacadeResult getCalendarDetailInfo(AcademyCalendarDe } + @Transactional(readOnly = true) + public AcademyScheduleLoadToUpdateFacadeResult loadTimeTemplateToUpdate(Long academyScheduleId) { + AcademyCalendarLoadToUpdateResult academyCalendarLoadToUpdateResult = academyCalendarService.loadTimeTemplateToUpdate(academyScheduleId); + DashboardScheduleAccessResult dashboardScheduleAccessResult = dashboardService.getDashboardSchedule(academyCalendarLoadToUpdateResult.dashboardId()); + + return AcademyScheduleLoadToUpdateFacadeResult.from( + academyCalendarLoadToUpdateResult, + dashboardScheduleAccessResult); + } + } diff --git a/src/main/java/org/guzzing/studayserver/domain/calendar/facade/dto/AcademyScheduleLoadToUpdateFacadeResult.java b/src/main/java/org/guzzing/studayserver/domain/calendar/facade/dto/AcademyScheduleLoadToUpdateFacadeResult.java new file mode 100644 index 000000000..59398a9f4 --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/domain/calendar/facade/dto/AcademyScheduleLoadToUpdateFacadeResult.java @@ -0,0 +1,60 @@ +package org.guzzing.studayserver.domain.calendar.facade.dto; + +import org.guzzing.studayserver.domain.calendar.controller.dto.response.AcademyCalendarLoadToUpdateResponse; +import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarLoadToUpdateResult; +import org.guzzing.studayserver.domain.dashboard.service.access.dto.LessonScheduleAccessResult; +import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashboardScheduleAccessResult; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; + +public record AcademyScheduleLoadToUpdateFacadeResult( + Long childId, + Long academyId, + Long lessonId, + Long dashboardId, + List lessonSchedule, + LocalDate startDateOfAttendance, + LocalDate endDateOfAttendance, + boolean isAlarmed, + String memo +) { + private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); + + public static AcademyScheduleLoadToUpdateFacadeResult from( + AcademyCalendarLoadToUpdateResult academyCalendarLoadToUpdateResult, + DashboardScheduleAccessResult dashboardScheduleAccessResult + ) { + return new AcademyScheduleLoadToUpdateFacadeResult( + dashboardScheduleAccessResult.childId(), + dashboardScheduleAccessResult.academyId(), + dashboardScheduleAccessResult.lessonId(), + academyCalendarLoadToUpdateResult.dashboardId(), + dashboardScheduleAccessResult.lessonScheduleInAccessResponses() + .stream() + .map(LessonScheduleInfo::from) + .toList(), + academyCalendarLoadToUpdateResult.startDateOfAttendance(), + academyCalendarLoadToUpdateResult.endDateOfAttendance(), + academyCalendarLoadToUpdateResult.isAlarmed(), + academyCalendarLoadToUpdateResult.memo() + ); + } + + public record LessonScheduleInfo( + DayOfWeek dayOfWeek, + String lessonStartTime, + String lessonEndTime + ) { + + public static LessonScheduleInfo from(LessonScheduleAccessResult lessonScheduleAccessResult) { + return new LessonScheduleInfo( + lessonScheduleAccessResult.dayOfWeek(), + lessonScheduleAccessResult.lessonStartTime().format(TIME_FORMATTER), + lessonScheduleAccessResult.lessonEndTime().format(TIME_FORMATTER) + ); + } + } +} diff --git a/src/main/java/org/guzzing/studayserver/domain/calendar/service/AcademyCalendarService.java b/src/main/java/org/guzzing/studayserver/domain/calendar/service/AcademyCalendarService.java index a6575c1b0..215e1a781 100644 --- a/src/main/java/org/guzzing/studayserver/domain/calendar/service/AcademyCalendarService.java +++ b/src/main/java/org/guzzing/studayserver/domain/calendar/service/AcademyCalendarService.java @@ -2,6 +2,7 @@ import java.time.LocalDate; import java.util.List; + import org.guzzing.studayserver.domain.calendar.model.AcademySchedule; import org.guzzing.studayserver.domain.calendar.model.AcademyTimeTemplate; import org.guzzing.studayserver.domain.calendar.repository.academyschedule.AcademyScheduleRepository; @@ -20,7 +21,7 @@ import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarLoadToUpdateResult; import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarUpdateResults; import org.guzzing.studayserver.domain.dashboard.service.access.DashboardAccessService; -import org.guzzing.studayserver.domain.dashboard.service.access.dto.DashboardScheduleAccessResult; +import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashboardScheduleAccessResult; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,17 +31,14 @@ public class AcademyCalendarService { private final AcademyScheduleRepository academyScheduleRepository; private final AcademyTimeTemplateRepository academyTimeTemplateRepository; private final PeriodicStrategy periodicStrategy; - private final DashboardAccessService dashboardAccessService; public AcademyCalendarService( AcademyScheduleRepository academyScheduleRepository, AcademyTimeTemplateRepository academyTimeTemplateRepository, - PeriodicStrategy periodicStrategy, - DashboardAccessService dashboardAccessService) { + PeriodicStrategy periodicStrategy) { this.academyScheduleRepository = academyScheduleRepository; this.academyTimeTemplateRepository = academyTimeTemplateRepository; this.periodicStrategy = periodicStrategy; - this.dashboardAccessService = dashboardAccessService; } @Transactional @@ -125,10 +123,8 @@ private List generateAcademySchedules( public AcademyCalendarLoadToUpdateResult loadTimeTemplateToUpdate(Long academyScheduleId) { AcademyTimeTemplate academyTimeTemplate = academyScheduleRepository.findDistinctAcademyTimeTemplate( academyScheduleId); - DashboardScheduleAccessResult dashboardScheduleAccessResult = - dashboardAccessService.getDashboardSchedule(academyTimeTemplate.getDashboardId()); - return AcademyCalendarLoadToUpdateResult.of(academyTimeTemplate, dashboardScheduleAccessResult); + return AcademyCalendarLoadToUpdateResult.of(academyTimeTemplate); } @Transactional diff --git a/src/main/java/org/guzzing/studayserver/domain/calendar/service/dto/result/AcademyCalendarLoadToUpdateResult.java b/src/main/java/org/guzzing/studayserver/domain/calendar/service/dto/result/AcademyCalendarLoadToUpdateResult.java index fc4d0ad71..81770c3cc 100644 --- a/src/main/java/org/guzzing/studayserver/domain/calendar/service/dto/result/AcademyCalendarLoadToUpdateResult.java +++ b/src/main/java/org/guzzing/studayserver/domain/calendar/service/dto/result/AcademyCalendarLoadToUpdateResult.java @@ -5,36 +5,21 @@ import java.time.format.DateTimeFormatter; import java.util.List; import org.guzzing.studayserver.domain.calendar.model.AcademyTimeTemplate; -import org.guzzing.studayserver.domain.dashboard.service.access.dto.DashboardScheduleAccessResult; +import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashboardScheduleAccessResult; import org.guzzing.studayserver.domain.dashboard.service.access.dto.LessonScheduleAccessResult; public record AcademyCalendarLoadToUpdateResult( - Long childId, - Long academyId, - Long lessonId, Long dashboardId, - List lessonScheduleAccessResults, LocalDate startDateOfAttendance, LocalDate endDateOfAttendance, boolean isAlarmed, String memo ) { - - private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); - public static AcademyCalendarLoadToUpdateResult of( - AcademyTimeTemplate academyTimeTemplate, - DashboardScheduleAccessResult dashboardScheduleAccessResult + AcademyTimeTemplate academyTimeTemplate ) { return new AcademyCalendarLoadToUpdateResult( - dashboardScheduleAccessResult.childId(), - dashboardScheduleAccessResult.academyId(), - dashboardScheduleAccessResult.lessonId(), academyTimeTemplate.getDashboardId(), - dashboardScheduleAccessResult.lessonScheduleInAccessResponses() - .stream() - .map(lessonScheduleAccessResult -> LessonScheduleInfo.from(lessonScheduleAccessResult)) - .toList(), academyTimeTemplate.getStartDateOfAttendance(), academyTimeTemplate.getEndDateOfAttendance(), academyTimeTemplate.isAlarmed(), @@ -42,18 +27,4 @@ public static AcademyCalendarLoadToUpdateResult of( ); } - public record LessonScheduleInfo( - DayOfWeek dayOfWeek, - String lessonStartTime, - String lessonEndTime - ) { - - public static LessonScheduleInfo from(LessonScheduleAccessResult lessonScheduleAccessResult) { - return new LessonScheduleInfo( - lessonScheduleAccessResult.dayOfWeek(), - lessonScheduleAccessResult.lessonStartTime().format(TIME_FORMATTER), - lessonScheduleAccessResult.lessonEndTime().format(TIME_FORMATTER) - ); - } - } } diff --git a/src/main/java/org/guzzing/studayserver/domain/child/controller/ChildRestController.java b/src/main/java/org/guzzing/studayserver/domain/child/controller/ChildRestController.java index 85f91f4b7..0a1e274a0 100644 --- a/src/main/java/org/guzzing/studayserver/domain/child/controller/ChildRestController.java +++ b/src/main/java/org/guzzing/studayserver/domain/child/controller/ChildRestController.java @@ -4,8 +4,11 @@ import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; import jakarta.validation.Valid; + import java.time.LocalDateTime; import java.util.List; +import java.util.concurrent.TimeUnit; + import org.guzzing.studayserver.domain.auth.memberId.MemberId; import org.guzzing.studayserver.domain.child.controller.request.ChildCreateRequest; import org.guzzing.studayserver.domain.child.controller.request.ChildModifyRequest; @@ -16,6 +19,7 @@ import org.guzzing.studayserver.domain.child.service.ChildWithScheduleResult; import org.guzzing.studayserver.domain.child.service.param.ChildDeleteParam; import org.guzzing.studayserver.domain.child.service.result.ChildProfileImagePatchResult; +import org.springframework.http.CacheControl; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; diff --git a/src/main/java/org/guzzing/studayserver/domain/child/controller/response/ChildrenFindResponse.java b/src/main/java/org/guzzing/studayserver/domain/child/controller/response/ChildrenFindResponse.java index 1512c5191..3de866841 100644 --- a/src/main/java/org/guzzing/studayserver/domain/child/controller/response/ChildrenFindResponse.java +++ b/src/main/java/org/guzzing/studayserver/domain/child/controller/response/ChildrenFindResponse.java @@ -22,8 +22,8 @@ public static ChildrenFindResponse from(List childWithS r.grade(), new ChildScheduleResponse( r.schedule_date(), - r.lessonStartTime(), - r.lessonEndTime(), + LocalTime.of(11,20,3), + LocalTime.of(11,20,3), r.academyName(), r.lessonSubject() ))) diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardReadService.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardReadService.java index c4f825871..b224aedd9 100644 --- a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardReadService.java +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardReadService.java @@ -1,6 +1,7 @@ package org.guzzing.studayserver.domain.dashboard.service; import java.util.List; + import org.guzzing.studayserver.domain.dashboard.model.Dashboard; import org.guzzing.studayserver.domain.dashboard.repository.DashboardRepository; import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashBoardFindByIdsResults; @@ -29,4 +30,5 @@ public DashBoardFindByIdsResults findByIds(List dashboardIds) { return new DashBoardFindByIdsResults(dashBoardFindByIdsResults); } + } diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardService.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardService.java index 35b0be69a..524b6209d 100644 --- a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardService.java +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/DashboardService.java @@ -1,12 +1,18 @@ package org.guzzing.studayserver.domain.dashboard.service; import jakarta.persistence.EntityNotFoundException; + +import java.time.LocalTime; import java.util.List; import java.util.Map; + +import org.guzzing.studayserver.domain.calendar.model.Periodicity; import org.guzzing.studayserver.domain.dashboard.model.Dashboard; import org.guzzing.studayserver.domain.dashboard.model.vo.FeeInfo; import org.guzzing.studayserver.domain.dashboard.repository.DashboardRepository; import org.guzzing.studayserver.domain.dashboard.repository.DashboardScheduleJpaRepository; +import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashboardScheduleAccessResult; +import org.guzzing.studayserver.domain.dashboard.service.access.dto.LessonScheduleAccessResult; import org.guzzing.studayserver.domain.dashboard.service.converter.DashboardServiceConverter; import org.guzzing.studayserver.domain.dashboard.service.dto.request.DashboardPostParam; import org.guzzing.studayserver.domain.dashboard.service.dto.request.DashboardPutParam; @@ -18,6 +24,7 @@ @Transactional(readOnly = true) public class DashboardService { + private static final String SEPARATOR = ":"; private final DashboardServiceConverter serviceConverter; private final DashboardRepository dashboardRepository; private final DashboardScheduleJpaRepository dashboardScheduleJpaRepository; @@ -92,4 +99,40 @@ private Dashboard findDashboardById(final Long dashboardId) { .orElseThrow(() -> new EntityNotFoundException("존재하는 대시보드가 없습니다.")); } + @Transactional(readOnly = true) + public DashboardScheduleAccessResult getDashboardSchedule(Long dashboardId) { + final DashboardResult result = findDashboard(dashboardId); + + final List schedules = result.scheduleInfos() + .schedules() + .stream() + .map(scheduleInfo -> new LessonScheduleAccessResult( + scheduleInfo.dayOfWeek(), + getTime(scheduleInfo.startTime()), + getTime((scheduleInfo.endTime())))) + .toList(); + + return new DashboardScheduleAccessResult( + result.childId(), + result.academyId(), + result.lessonId(), + Periodicity.WEEKLY, + schedules); + } + + private LocalTime getTime(final String time) { + String[] split = time.split(SEPARATOR); + try { + int hour = Integer.parseInt(split[0]); + int minute = Integer.parseInt(split[1]); + + return LocalTime.of(hour, minute); + + } catch (ArrayIndexOutOfBoundsException e) { + throw new IllegalArgumentException("유효하지 않은 시간입니다."); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시간은 숫자여야 합니다."); + } + } + } diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/DashboardAccessService.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/DashboardAccessService.java index 08ef1a254..cee9970d1 100644 --- a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/DashboardAccessService.java +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/DashboardAccessService.java @@ -1,6 +1,6 @@ package org.guzzing.studayserver.domain.dashboard.service.access; -import org.guzzing.studayserver.domain.dashboard.service.access.dto.DashboardScheduleAccessResult; +import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashboardScheduleAccessResult; public interface DashboardAccessService { diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/DashboardAccessServiceImpl.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/DashboardAccessServiceImpl.java index a50651c9a..4c4125ace 100644 --- a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/DashboardAccessServiceImpl.java +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/DashboardAccessServiceImpl.java @@ -6,7 +6,7 @@ import org.guzzing.studayserver.domain.calendar.model.Periodicity; import org.guzzing.studayserver.domain.child.service.ChildAccessService; import org.guzzing.studayserver.domain.dashboard.service.DashboardService; -import org.guzzing.studayserver.domain.dashboard.service.access.dto.DashboardScheduleAccessResult; +import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashboardScheduleAccessResult; import org.guzzing.studayserver.domain.dashboard.service.access.dto.LessonScheduleAccessResult; import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashboardResult; import org.springframework.stereotype.Service; diff --git a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/dto/DashboardScheduleAccessResult.java b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/dto/response/DashboardScheduleAccessResult.java similarity index 65% rename from src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/dto/DashboardScheduleAccessResult.java rename to src/main/java/org/guzzing/studayserver/domain/dashboard/service/dto/response/DashboardScheduleAccessResult.java index 40e0d90f9..41d0c5655 100644 --- a/src/main/java/org/guzzing/studayserver/domain/dashboard/service/access/dto/DashboardScheduleAccessResult.java +++ b/src/main/java/org/guzzing/studayserver/domain/dashboard/service/dto/response/DashboardScheduleAccessResult.java @@ -1,7 +1,8 @@ -package org.guzzing.studayserver.domain.dashboard.service.access.dto; +package org.guzzing.studayserver.domain.dashboard.service.dto.response; import java.util.List; import org.guzzing.studayserver.domain.calendar.model.Periodicity; +import org.guzzing.studayserver.domain.dashboard.service.access.dto.LessonScheduleAccessResult; public record DashboardScheduleAccessResult( Long childId, diff --git a/src/main/java/org/guzzing/studayserver/global/config/WebConfig.java b/src/main/java/org/guzzing/studayserver/global/config/WebConfig.java new file mode 100644 index 000000000..bcf85446e --- /dev/null +++ b/src/main/java/org/guzzing/studayserver/global/config/WebConfig.java @@ -0,0 +1,34 @@ +package org.guzzing.studayserver.global.config; + +import jakarta.annotation.PostConstruct; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.filter.ShallowEtagHeaderFilter; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new HandlerInterceptor() { + @Override + @PostConstruct + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if(request.getMethod().equals("GET")) { + response.setHeader("Cache-Control","no-cache"); + } + return HandlerInterceptor.super.preHandle(request, response, handler); + } + }); + } + + @Bean + public ShallowEtagHeaderFilter shallowEtagHeaderFilter() { + return new ShallowEtagHeaderFilter(); + } + +} diff --git a/src/test/java/org/guzzing/studayserver/domain/calendar/facade/AcademyCalendarFacadeTest.java b/src/test/java/org/guzzing/studayserver/domain/calendar/facade/AcademyCalendarFacadeTest.java new file mode 100644 index 000000000..41588895c --- /dev/null +++ b/src/test/java/org/guzzing/studayserver/domain/calendar/facade/AcademyCalendarFacadeTest.java @@ -0,0 +1,159 @@ +package org.guzzing.studayserver.domain.calendar.facade; + +import org.guzzing.studayserver.domain.academy.model.Academy; +import org.guzzing.studayserver.domain.academy.model.Lesson; +import org.guzzing.studayserver.domain.academy.repository.academy.AcademyRepository; +import org.guzzing.studayserver.domain.academy.repository.lesson.LessonRepository; +import org.guzzing.studayserver.domain.calendar.facade.dto.AcademyCalendarDetailFacadeParam; +import org.guzzing.studayserver.domain.calendar.facade.dto.AcademyCalendarDetailFacadeResult; +import org.guzzing.studayserver.domain.calendar.facade.dto.AcademyScheduleLoadToUpdateFacadeResult; +import org.guzzing.studayserver.domain.calendar.model.AcademySchedule; +import org.guzzing.studayserver.domain.calendar.model.AcademyTimeTemplate; +import org.guzzing.studayserver.domain.calendar.repository.academyschedule.AcademyScheduleRepository; +import org.guzzing.studayserver.domain.calendar.repository.academytimetemplate.AcademyTimeTemplateRepository; +import org.guzzing.studayserver.domain.calendar.service.AcademyCalendarService; +import org.guzzing.studayserver.domain.calendar.service.dto.param.AcademyCalendarCreateParam; +import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarCreateResults; +import org.guzzing.studayserver.domain.child.model.Child; +import org.guzzing.studayserver.domain.child.repository.ChildRepository; +import org.guzzing.studayserver.domain.dashboard.fixture.DashboardFixture; +import org.guzzing.studayserver.domain.dashboard.model.Dashboard; +import org.guzzing.studayserver.domain.dashboard.repository.DashboardRepository; +import org.guzzing.studayserver.domain.member.model.Member; +import org.guzzing.studayserver.domain.member.repository.MemberRepository; +import org.guzzing.studayserver.testutil.fixture.academy.AcademyFixture; +import org.guzzing.studayserver.testutil.fixture.academycalender.AcademyCalenderFixture; +import org.guzzing.studayserver.testutil.fixture.child.ChildFixture; +import org.guzzing.studayserver.testutil.fixture.member.MemberFixture; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +@Transactional +@SpringBootTest(webEnvironment = NONE) +public class AcademyCalendarFacadeTest { + @Autowired + private DashboardRepository dashboardRepository; + + @Autowired + private DashboardFixture dashboardFixture; + + @Autowired + private AcademyTimeTemplateRepository academyTimeTemplateRepository; + + @Autowired + private AcademyScheduleRepository academyScheduleRepository; + + @Autowired + private LessonRepository lessonRepository; + + @Autowired + private AcademyRepository academyRepository; + + @Autowired + private ChildRepository childRepository; + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private AcademyCalendarFacade academyCalendarFacade; + + @Autowired + private AcademyCalendarService academyCalendarService; + + private Long timeTemplateId; + private Long scheduleId; + private AcademyTimeTemplate academyTimeTemplate; + private AcademySchedule academySchedule; + private List academySchedules; + + @BeforeEach + void setUp() { + AcademyCalendarCreateParam academyCalendarCreateParam = + AcademyCalenderFixture.firstChildAcademyCalenderCreateParam(); + AcademyCalendarCreateResults createdTimeTemplates = academyCalendarService.createSchedules(academyCalendarCreateParam); + + timeTemplateId = createdTimeTemplates.academyTimeTemplateIds().get(0); + academyTimeTemplate = academyTimeTemplateRepository.getById(timeTemplateId); + academySchedules = academyScheduleRepository.findByAcademyTimeTemplateId(timeTemplateId); + academySchedule = academySchedules.get(0); + scheduleId = academySchedule.getId(); + } + + @Test + @DisplayName("스케줄 업데이트 전 기존 글을 불러올 때 해당 스케줄에 대한 정보와 대시보드에 대한 정보가 올바르게 반환되는지 확인한다.") + void loadTimeTemplateToUpdate_existedScheduleInfo_success() { + //Given + Dashboard savedDashboard = dashboardRepository.save(dashboardFixture.makeEntity()); + + //When + AcademyScheduleLoadToUpdateFacadeResult academyScheduleLoadToUpdateFacadeResult + = academyCalendarFacade.loadTimeTemplateToUpdate(scheduleId); + + //Then + assertAll("AcademySchedule Load To Update", + () -> assertThat(academyScheduleLoadToUpdateFacadeResult.academyId()).isEqualTo(savedDashboard.getAcademyId()), + () -> assertThat(academyScheduleLoadToUpdateFacadeResult.childId()).isEqualTo(savedDashboard.getChildId()), + () -> assertThat(academyScheduleLoadToUpdateFacadeResult.dashboardId()).isEqualTo(savedDashboard.getId()), + () -> assertThat(academyScheduleLoadToUpdateFacadeResult.lessonId()).isEqualTo(savedDashboard.getLessonId()), + () -> assertThat(academyScheduleLoadToUpdateFacadeResult.endDateOfAttendance()).isEqualTo(academyTimeTemplate.getEndDateOfAttendance()), + () -> assertThat(academyScheduleLoadToUpdateFacadeResult.startDateOfAttendance()).isEqualTo(academyTimeTemplate.getStartDateOfAttendance()), + () -> assertThat(academyScheduleLoadToUpdateFacadeResult.memo()).isEqualTo(academyTimeTemplate.getMemo()) + ); + } + + @Test + @DisplayName("스케줄 상세보기시 아이에 대한 정보와 학원 수업에 대한 정보를 올바르게 반환하는지 확인한다.") + void getCalendarDetailInfo_academyAndChildInfoAndSchedule_success() { + //Given + String imageUrlPrefix = "https://team09-resources-bucket.s3.ap-northeast-1.amazonaws.com/"; + + Academy academyAboutSungnam = AcademyFixture.academySungnam(); + academyAboutSungnam.changeEducationFee(100000L); + Academy savedAcademyAboutSungnam = academyRepository.save(academyAboutSungnam); + Lesson lessonAboutSungnam = AcademyFixture.lessonForSunganm(savedAcademyAboutSungnam); + Lesson savedALessonAboutSungnam = lessonRepository.save(lessonAboutSungnam); + + Member savedMember = memberRepository.save(MemberFixture.member()); + Child child = ChildFixture.child(); + child.assignToNewMemberOnly(savedMember); + Child savedChild = childRepository.save(child); + + AcademyCalendarDetailFacadeParam academyCalendarDetailFacadeParam + = new AcademyCalendarDetailFacadeParam( + savedALessonAboutSungnam.getId(), + savedChild.getId(), + scheduleId); + + //When + AcademyCalendarDetailFacadeResult calendarDetailInfo + = academyCalendarFacade.getCalendarDetailInfo(academyCalendarDetailFacadeParam); + + //Then + assertAll("AcademyCalendar Detail", + () -> assertThat(calendarDetailInfo.childrenInfo().childId()).isEqualTo(savedChild.getId()), + () -> assertThat(calendarDetailInfo.childrenInfo().memo()).isEqualTo(academyTimeTemplate.getMemo()), + () -> assertThat(calendarDetailInfo.childrenInfo().childName()).isEqualTo(savedChild.getNickName()), + () -> assertThat(calendarDetailInfo.childrenInfo().imageUrl()).isEqualTo(imageUrlPrefix + savedChild.getProfileImageURIPath()), + () -> assertThat(calendarDetailInfo.childrenInfo().dashBoardId()).isEqualTo(academyTimeTemplate.getDashboardId()), + () -> assertThat(calendarDetailInfo.lessonInfo().lessonName()).isEqualTo(savedALessonAboutSungnam.getCurriculum()), + () -> assertThat(calendarDetailInfo.lessonInfo().lessonTimes().endTime()).isEqualTo(academySchedule.getLessonEndTime().toString()), + () -> assertThat(calendarDetailInfo.lessonInfo().lessonTimes().startTime()).isEqualTo(academySchedule.getLessonStartTime().toString()), + () -> assertThat(calendarDetailInfo.lessonInfo().capacity()).isEqualTo(savedALessonAboutSungnam.getCapacity()), + () -> assertThat(calendarDetailInfo.lessonInfo().totalFee()).isEqualTo(savedALessonAboutSungnam.getTotalFee()), + () -> assertThat(calendarDetailInfo.academyInfoAboutScheduleDetail().academyName()).isEqualTo(savedAcademyAboutSungnam.getAcademyName()), + () -> assertThat(calendarDetailInfo.academyInfoAboutScheduleDetail().address()).isEqualTo(savedAcademyAboutSungnam.getFullAddress()) + ); + } + +} diff --git a/src/test/java/org/guzzing/studayserver/domain/calendar/service/AcademyCalendarServiceTest.java b/src/test/java/org/guzzing/studayserver/domain/calendar/service/AcademyCalendarServiceTest.java index 291de38d2..22e7fab96 100644 --- a/src/test/java/org/guzzing/studayserver/domain/calendar/service/AcademyCalendarServiceTest.java +++ b/src/test/java/org/guzzing/studayserver/domain/calendar/service/AcademyCalendarServiceTest.java @@ -25,7 +25,7 @@ import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarDetailResult; import org.guzzing.studayserver.domain.calendar.service.dto.result.AcademyCalendarLoadToUpdateResult; import org.guzzing.studayserver.domain.dashboard.service.access.DashboardAccessService; -import org.guzzing.studayserver.domain.dashboard.service.access.dto.DashboardScheduleAccessResult; +import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashboardScheduleAccessResult; import org.guzzing.studayserver.global.error.response.ErrorCode; import org.guzzing.studayserver.testutil.fixture.academycalender.AcademyCalenderFixture; import org.junit.jupiter.api.DisplayName; @@ -33,6 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.ActiveProfiles; import org.springframework.transaction.annotation.Transactional; @Transactional @@ -51,9 +52,6 @@ class AcademyCalendarServiceTest { @Autowired private PeriodicStrategy periodicStrategy; - @MockBean - private DashboardAccessService dashboardAccessService; - @Test @DisplayName("대시보드를 통해 가져온 학원 일정 정보를 바탕으로 학원 스케줄을 생성하고 그 범위 이내에 올바르게 생성되는지 확인한다.") void createSchedules_success() { @@ -142,21 +140,12 @@ void loadTimeTemplateToUpdate() { ); Long academyScheduleId = savedFridayAcademySchedule.getId(); - DashboardScheduleAccessResult mockDashboardScheduleAccessResult = AcademyCalenderFixture.dashboardScheduleAccessResult(); - - given(dashboardAccessService.getDashboardSchedule(savedFridayAcademyTimeTemplate.getDashboardId())).willReturn( - mockDashboardScheduleAccessResult); //When AcademyCalendarLoadToUpdateResult academyCalendarLoadToUpdateResult = academyCalendarService.loadTimeTemplateToUpdate( academyScheduleId); //Then - DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm"); - assertThat(academyCalendarLoadToUpdateResult.academyId()).isEqualTo( - mockDashboardScheduleAccessResult.academyId()); - assertThat(academyCalendarLoadToUpdateResult.lessonId()).isEqualTo( - mockDashboardScheduleAccessResult.lessonId()); assertThat(academyCalendarLoadToUpdateResult.startDateOfAttendance()).isEqualTo( savedFridayAcademyTimeTemplate.getStartDateOfAttendance()); assertThat(academyCalendarLoadToUpdateResult.startDateOfAttendance()).isEqualTo( @@ -169,23 +158,6 @@ void loadTimeTemplateToUpdate() { assertThat(academyCalendarLoadToUpdateResult.memo()).isEqualTo(savedMondayAcademyTimeTemplate.getMemo()); assertThat(academyCalendarLoadToUpdateResult.isAlarmed()).isEqualTo(savedFridayAcademyTimeTemplate.isAlarmed()); assertThat(academyCalendarLoadToUpdateResult.isAlarmed()).isEqualTo(savedMondayAcademyTimeTemplate.isAlarmed()); - - academyCalendarLoadToUpdateResult.lessonScheduleAccessResults() - .forEach(lessonScheduleAccessResult -> { - if (lessonScheduleAccessResult.dayOfWeek() == DayOfWeek.MONDAY) { - assertThat(lessonScheduleAccessResult.lessonEndTime()).isEqualTo( - savedMondayAcademySchedule.getLessonEndTime().format(timeFormatter)); - assertThat(lessonScheduleAccessResult.lessonStartTime()).isEqualTo( - savedMondayAcademySchedule.getLessonStartTime().format(timeFormatter)); - } - - if (lessonScheduleAccessResult.dayOfWeek() == DayOfWeek.FRIDAY) { - assertThat(lessonScheduleAccessResult.lessonEndTime()).isEqualTo( - savedFridayAcademySchedule.getLessonEndTime().format(timeFormatter)); - assertThat(lessonScheduleAccessResult.lessonStartTime()).isEqualTo( - savedFridayAcademySchedule.getLessonStartTime().format(timeFormatter)); - } - }); } @Test diff --git a/src/test/java/org/guzzing/studayserver/testutil/fixture/academycalender/AcademyCalenderFixture.java b/src/test/java/org/guzzing/studayserver/testutil/fixture/academycalender/AcademyCalenderFixture.java index ecd202144..c2a59af29 100644 --- a/src/test/java/org/guzzing/studayserver/testutil/fixture/academycalender/AcademyCalenderFixture.java +++ b/src/test/java/org/guzzing/studayserver/testutil/fixture/academycalender/AcademyCalenderFixture.java @@ -16,7 +16,7 @@ import org.guzzing.studayserver.domain.calendar.service.dto.param.AcademyCalendarDeleteParam; import org.guzzing.studayserver.domain.calendar.service.dto.param.AcademyCalendarUpdateParam; import org.guzzing.studayserver.domain.calendar.service.dto.param.LessonScheduleParam; -import org.guzzing.studayserver.domain.dashboard.service.access.dto.DashboardScheduleAccessResult; +import org.guzzing.studayserver.domain.dashboard.service.dto.response.DashboardScheduleAccessResult; import org.guzzing.studayserver.domain.dashboard.service.access.dto.LessonScheduleAccessResult; public class AcademyCalenderFixture { @@ -27,9 +27,7 @@ public class AcademyCalenderFixture { private static final LocalDate END_DATE_OF_ATTENDANCE_WITH_TWO_DAYS = LocalDate.of(2023, 11, 21); private static final Periodicity WEEKLY_PERIODICITY = Periodicity.WEEKLY; private static final Long FIRST_CHILD_ID = 1L; - private static final Long SECOND_CHILD_ID = 2L; private static final Long FIRST_CHILD_DASH_BOARD_ID = 1L; - private static final Long SECOND_CHILD_DASH_BOARD_ID = 2L; private static final LessonTime LESSON_TIME = new LessonTime("18:00", "20:00"); public static AcademyCalendarCreateRequest.LessonScheduleCreateRequest mondayLessonScheduleCreateRequest() { diff --git a/src/test/java/org/guzzing/studayserver/testutil/fixture/child/ChildFixture.java b/src/test/java/org/guzzing/studayserver/testutil/fixture/child/ChildFixture.java new file mode 100644 index 000000000..7d7f21897 --- /dev/null +++ b/src/test/java/org/guzzing/studayserver/testutil/fixture/child/ChildFixture.java @@ -0,0 +1,14 @@ +package org.guzzing.studayserver.testutil.fixture.child; + +import org.guzzing.studayserver.domain.child.model.Child; + +public class ChildFixture { + + public static Child child() { + return new Child( + "김별", + "초등학교 1학년", + "aakdjlaf.com" + ); + } +}