From d02885fc1cfa0dd659ee89e600c3a3128e859735 Mon Sep 17 00:00:00 2001 From: woojin Date: Fri, 11 Jul 2025 20:29:20 +0900 Subject: [PATCH 01/10] =?UTF-8?q?refactor:=20pageImpl=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EB=8C=80=EC=8B=A0=20Page=EC=97=90=20map=EC=9D=84=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 29 +++++++++++-------- .../service/ReservationServiceImpl.java | 2 +- .../worklog/service/WorkLogServiceImpl.java | 8 +---- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java index 56f7aaf3..03b5bbc1 100644 --- a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java +++ b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java @@ -51,10 +51,10 @@ public class ReservationController { content = @Content(schema = @Schema(implementation = ReservationResponseDto.class))) @ApiResponse(responseCode = "400", description = "유효하지 않은 요청", content = @Content(schema = @Schema(implementation = CommonApiResponse.class))) - public ResponseEntity> createReservation( + public ResponseEntity> createReservation ( @AuthenticationPrincipal CustomUserDetails user, - @RequestBody @Valid ReservationRequestDto reservationRequestDto) { - + @RequestBody @Valid ReservationRequestDto reservationRequestDto + ) { Reservation reservation = reservationService.createReservation( ReservationRequestDto.toEntity(reservationRequestDto), user.getUserId(), reservationRequestDto.getOptionId()); @@ -71,9 +71,9 @@ public ResponseEntity> createReservati @ApiResponse(responseCode = "404", description = "해당 예약이 존재하지 않음", content = @Content(schema = @Schema(implementation = CommonApiResponse.class))), }) - public ResponseEntity> getReservation( + public ResponseEntity> getReservation ( @Parameter(description = "조회할 예약 ID", example = "1") - @PathVariable(name = "reservationId") Long reservationId + @PathVariable(name = "reservationId") final Long reservationId ) { return ResponseEntity.ok( @@ -88,10 +88,10 @@ public ResponseEntity> getReservation( @ApiResponse(responseCode = "400", description = "유효하지 않은 요청 또는 수정 불가 상태", content = @Content(schema = @Schema(implementation = CommonApiResponse.class))), }) - public ResponseEntity> updateReservation( + public ResponseEntity> updateReservation ( @AuthenticationPrincipal CustomUserDetails user, @Parameter(description = "수정할 예약 ID", example = "1") - @PathVariable(name = "reservationId") Long reservationId, + @PathVariable(name = "reservationId") final Long reservationId, @RequestBody @Valid ReservationRequestDto reservationRequestDto) { Reservation updated = reservationService.updateReservation( @@ -114,7 +114,7 @@ public ResponseEntity> updateReservati public ResponseEntity> deleteReservation( @AuthenticationPrincipal CustomUserDetails user, @Parameter(description = "삭제할 예약 ID", example = "1") - @PathVariable(name = "reservationId") Long reservationId + @PathVariable(name = "reservationId") final Long reservationId ) { reservationService.deleteReservation(reservationId, user.getUserId()); return ResponseEntity.ok(CommonApiResponse.success(null)); @@ -125,7 +125,7 @@ public ResponseEntity> deleteReservation( */ @GetMapping @Operation(summary = "예약 전체 조회", description = "페이지네이션 기반으로 예약 목록을 조회합니다.") - public ResponseEntity>> getReservationsList( + public ResponseEntity>> getReservationsList ( @RequestParam(value = "page", defaultValue = "0") int page, @RequestParam(value = "size", defaultValue = "10") int size, @RequestParam(value = "status", required = false) ReservationStatus status @@ -144,17 +144,20 @@ public ResponseEntity */ @GetMapping("/customer") @Operation(summary = "특정 유저의 예약 전체 조회", description = "고객의 모든 예약을 페이지네이션으로 조회합니다.") - public ResponseEntity>> getReservationsByCustomer( + public ResponseEntity>> getReservationsByCustomer ( @AuthenticationPrincipal CustomUserDetails user, @RequestParam(value = "page", defaultValue = "0") int page, @RequestParam(value = "size", defaultValue = "10") int size ) { + Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdDate")); + Page reservations = reservationService.getReservationsByCustomer(user.getUserId(), pageable); PagedResponseDto response = PagedResponseDto.fromPage(reservations, ReservationResponseDto::toDto); + return ResponseEntity.ok(CommonApiResponse.success(response)); } @@ -163,17 +166,19 @@ public ResponseEntity */ @GetMapping("/manager") @Operation(summary = "매니저 담당 예약 전체 조회", description = "매니저가 담당 중인 예약을 페이지네이션으로 조회합니다.") - public ResponseEntity>> getReservationsByManager( + public ResponseEntity>> getReservationsByManager ( @AuthenticationPrincipal CustomUserDetails userDetails, @RequestParam(value = "page", defaultValue = "0") int page, @RequestParam(value = "size", defaultValue = "10") int size ) { Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdDate")); + Page reservations = reservationService.getReservationsByManager( userDetails.getUserId(), pageable); - PagedResponseDto response = PagedResponseDto.fromPage(reservations); + PagedResponseDto response = PagedResponseDto.fromPage( + reservations); return ResponseEntity.ok(CommonApiResponse.success(response)); } diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java index 675d2889..121ec52c 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -41,7 +41,6 @@ public class ReservationServiceImpl implements ReservationService { private final CustomerRepository customerRepository; - private final ServiceOptionRepository serviceOptionRepository; private final NotificationPublisher notificationPublisher; @@ -79,6 +78,7 @@ public ReservationResponseDto getReservation(Long id) { String managerName = null; MatchingStatus status = null; Long matchingId = null; + if (latestMatching != null) { managerName = latestMatching.getManager().getName(); status = latestMatching.getStatus(); diff --git a/reservation/src/main/java/com/homeaid/worklog/service/WorkLogServiceImpl.java b/reservation/src/main/java/com/homeaid/worklog/service/WorkLogServiceImpl.java index 09800c0d..259d4899 100644 --- a/reservation/src/main/java/com/homeaid/worklog/service/WorkLogServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/worklog/service/WorkLogServiceImpl.java @@ -14,11 +14,9 @@ import com.homeaid.worklog.exception.WorkLogErrorCode; import com.homeaid.worklog.util.GeoUtils; import java.time.LocalDateTime; -import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -102,11 +100,7 @@ public Page getAllWorkLogsByManager(Long userId, Pageable pageable) { Page matchingPage = matchingRepository.findAllWithWorkLogByManager_IdAndStatus(userId, MatchingStatus.CONFIRMED, pageable); - List workLogList = matchingPage.stream() - .map(Matching::getWorkLog) - .toList(); - - return new PageImpl<>(workLogList, pageable, matchingPage.getTotalElements()); + return matchingPage.map(Matching::getWorkLog); } @Override From 650681a8b9bbaf30ddcec4ccd7d47d85dbdbbc74 Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 14 Jul 2025 11:33:06 +0900 Subject: [PATCH 02/10] =?UTF-8?q?refactor:=20create=20reservation,=20contr?= =?UTF-8?q?oller=EC=99=80=20service=EC=9D=98=20=EB=AA=85=ED=99=95=ED=95=9C?= =?UTF-8?q?=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC,=20service=EC=99=80?= =?UTF-8?q?=20repository=20=EC=98=81=EC=86=8D=ED=99=94=EC=9D=98=20?= =?UTF-8?q?=EB=AA=85=ED=99=95=ED=95=9C=20=EC=B1=85=EC=9E=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 12 +++-- .../reservation/domain/ReservationStore.java | 9 ++++ .../domain/ReservationStoreImpl.java | 44 +++++++++++++++ .../reservation/dto/ReservationDtoMapper.java | 14 +++++ .../dto/ReservationDtoMapperImpl.java | 52 ++++++++++++++++++ .../dto/request/ReservationCommand.java | 34 ++++++++++++ .../dto/request/ReservationRequestDto.java | 14 +---- .../dto/response/ReservationInfo.java | 53 +++++++++++++++++++ .../dto/response/ReservationResponseDto.java | 16 ------ .../service/ReservationService.java | 4 +- .../service/ReservationServiceImpl.java | 27 +++++----- .../worklog/controller/WorkLogController.java | 4 +- .../worklog/service/WorkLogServiceImpl.java | 2 +- 13 files changed, 235 insertions(+), 50 deletions(-) create mode 100644 reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java create mode 100644 reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java create mode 100644 reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java create mode 100644 reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java create mode 100644 reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationCommand.java create mode 100644 reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationInfo.java diff --git a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java index 03b5bbc1..7769b247 100644 --- a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java +++ b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java @@ -4,7 +4,9 @@ import com.homeaid.common.response.CommonApiResponse; import com.homeaid.common.response.PagedResponseDto; import com.homeaid.reservation.domain.Reservation; +import com.homeaid.reservation.dto.response.ReservationInfo; import com.homeaid.reservation.domain.enumerate.ReservationStatus; +import com.homeaid.reservation.dto.ReservationDtoMapper; import com.homeaid.reservation.dto.request.ReservationRequestDto; import com.homeaid.reservation.dto.request.UpdateReservationRequestDto; import com.homeaid.reservation.dto.response.ManagerReservationResponseDto; @@ -45,6 +47,8 @@ public class ReservationController { private final ReservationService reservationService; + private final ReservationDtoMapper reservationDtoMapper; + @PostMapping @Operation(summary = "예약 생성", description = "고객이 예약 옵션을 선택하여 예약을 생성합니다.") @ApiResponse(responseCode = "201", description = "예약 생성 성공", @@ -55,12 +59,12 @@ public ResponseEntity> createReservati @AuthenticationPrincipal CustomUserDetails user, @RequestBody @Valid ReservationRequestDto reservationRequestDto ) { - Reservation reservation = reservationService.createReservation( - ReservationRequestDto.toEntity(reservationRequestDto), user.getUserId(), - reservationRequestDto.getOptionId()); + + ReservationInfo reservationInfo = reservationService.createReservation( + reservationDtoMapper.toCommand(reservationRequestDto, user.getUserId())); return ResponseEntity.status(HttpStatus.CREATED) - .body(CommonApiResponse.success(ReservationResponseDto.toDto(reservation))); + .body(CommonApiResponse.success(reservationDtoMapper.toDto(reservationInfo))); } @GetMapping("/{reservationId}") diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java new file mode 100644 index 00000000..bf628265 --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java @@ -0,0 +1,9 @@ +package com.homeaid.reservation.domain; + +import com.homeaid.reservation.dto.request.ReservationCommand; + +public interface ReservationStore { + + Reservation save(ReservationCommand reservationCommand); + +} diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java new file mode 100644 index 00000000..5622e804 --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java @@ -0,0 +1,44 @@ +package com.homeaid.reservation.domain; + + +import com.homeaid.domain.Customer; +import com.homeaid.exception.CustomException; +import com.homeaid.exception.UserErrorCode; +import com.homeaid.repository.CustomerRepository; +import com.homeaid.reservation.dto.request.ReservationCommand; +import com.homeaid.reservation.exception.ReservationErrorCode; +import com.homeaid.reservation.repository.ReservationRepository; +import com.homeaid.serviceoption.domain.ServiceOption; +import com.homeaid.serviceoption.repository.ServiceOptionRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class ReservationStoreImpl implements ReservationStore { + + + private final ReservationRepository reservationRepository; + private final CustomerRepository customerRepository; + private final ServiceOptionRepository serviceOptionRepository; + + @Override + public Reservation save(ReservationCommand reservationCommand) { + + Reservation reservation = reservationCommand.toEntity(); + + Customer customer = customerRepository.findById(reservationCommand.getUserId()) + .orElseThrow(() -> new CustomException(UserErrorCode.CUSTOMER_NOT_FOUND)); + + ServiceOption serviceOption = serviceOptionRepository.findById(reservationCommand.getOptionId()) + .orElseThrow(() -> new CustomException(ReservationErrorCode.RESERVATION_NOT_FOUND)); + + reservation.addItem(serviceOption); + reservation.setCustomer(customer); + + return reservationRepository.save(reservation); + } + +} diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java new file mode 100644 index 00000000..cdd56643 --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java @@ -0,0 +1,14 @@ +package com.homeaid.reservation.dto; + + +import com.homeaid.reservation.dto.request.ReservationCommand; +import com.homeaid.reservation.dto.response.ReservationInfo; +import com.homeaid.reservation.dto.request.ReservationRequestDto; +import com.homeaid.reservation.dto.response.ReservationResponseDto; + +public interface ReservationDtoMapper { + + ReservationCommand toCommand(ReservationRequestDto reservationRequestDto, Long userId); + + ReservationResponseDto toDto(ReservationInfo reservationInfo); +} diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java new file mode 100644 index 00000000..f0d6341f --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java @@ -0,0 +1,52 @@ +package com.homeaid.reservation.dto; + +import com.homeaid.reservation.dto.request.ReservationCommand; +import com.homeaid.reservation.dto.response.ReservationInfo; +import com.homeaid.reservation.dto.request.ReservationRequestDto; +import com.homeaid.reservation.dto.response.ReservationResponseDto; +import org.springframework.stereotype.Component; + +@Component +public class ReservationDtoMapperImpl implements ReservationDtoMapper { + + @Override + public ReservationCommand toCommand(ReservationRequestDto reservationRequestDto, Long userId) { + if (reservationRequestDto == null) { + return null; + } + return ReservationCommand.builder() + .userId(userId) + .requestedDate(reservationRequestDto.getRequestedDate()) + .requestedTime(reservationRequestDto.getRequestedTime()) + .latitude(reservationRequestDto.getLatitude()) + .longitude(reservationRequestDto.getLongitude()) + .duration(reservationRequestDto.getTotalDuration()) + .address(reservationRequestDto.getAddress()) + .addressDetail(reservationRequestDto.getAddressDetail()) + .build(); + } + + @Override + public ReservationResponseDto toDto(ReservationInfo reservationInfo) { + if (reservationInfo == null) { + return null; + } + + return ReservationResponseDto.builder() + .reservationId(reservationInfo.getId()) + .status(reservationInfo.getStatus()) + .totalPrice(reservationInfo.getTotalPrice()) + .totalDuration(reservationInfo.getDuration()) + .serviceOptionName(reservationInfo.getItemServiceOptionName()) + .customerId(reservationInfo.getCustomerId()) + .managerId(reservationInfo.getManagerId()) + .requestedDate(reservationInfo.getRequestedDate()) + .requestedTime(reservationInfo.getRequestedTime()) + .address(reservationInfo.getAddress()) + .addressDetail(reservationInfo.getAddressDetail()) + .customerMemo(reservationInfo.getCustomerMemo()) + .build(); + } + + +} diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationCommand.java b/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationCommand.java new file mode 100644 index 00000000..06aacc26 --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationCommand.java @@ -0,0 +1,34 @@ +package com.homeaid.reservation.dto.request; + +import com.homeaid.reservation.domain.Reservation; +import java.time.LocalDate; +import java.time.LocalTime; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ReservationCommand { + + private final Long userId; + private final LocalDate requestedDate; + private final LocalTime requestedTime; + private final Long optionId; + private final Integer duration; + private final String address; + private final String addressDetail; + private final Double latitude; + private final Double longitude; + + public Reservation toEntity() { + return Reservation.builder() + .requestedDate(requestedDate) + .requestedTime(requestedTime) + .latitude(latitude) + .longitude(longitude) + .duration(duration) + .address(address) + .addressDetail(addressDetail) + .build(); + } +} diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationRequestDto.java b/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationRequestDto.java index 57d04554..3710fe4f 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationRequestDto.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationRequestDto.java @@ -9,12 +9,14 @@ import java.time.LocalTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Getter +@Builder public class ReservationRequestDto { @NotNull @@ -49,16 +51,4 @@ public class ReservationRequestDto { @Schema(description = "경도", example = "127.02894600148066") private Double longitude; - public static Reservation toEntity(ReservationRequestDto reservationRequestDto) { - return Reservation.builder() - .requestedDate(reservationRequestDto.getRequestedDate()) - .requestedTime(reservationRequestDto.getRequestedTime()) - .latitude(reservationRequestDto.getLatitude()) - .longitude(reservationRequestDto.getLongitude()) - .duration(reservationRequestDto.getTotalDuration()) - .address(reservationRequestDto.getAddress()) - .addressDetail(reservationRequestDto.getAddressDetail()) - .build(); - } - } diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationInfo.java b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationInfo.java new file mode 100644 index 00000000..5987b1e0 --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationInfo.java @@ -0,0 +1,53 @@ +package com.homeaid.reservation.dto.response; + +import com.homeaid.reservation.domain.Reservation; +import com.homeaid.reservation.domain.enumerate.ReservationStatus; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import lombok.Getter; + +@Getter +public class ReservationInfo { + + private final Long id; + private final LocalDate requestedDate; + private final LocalTime requestedTime; + private final Integer totalPrice; + private final Integer duration; + private final ReservationStatus status; + private final String address; + private final String addressDetail; + private final Double latitude; + private final Double longitude; + private final Long customerId; + private final Long managerId; + private final Integer itemBasePrice; + private final String itemServiceOptionName; + private final String customerMemo; + private final LocalDateTime createdDate; + private final LocalDateTime modifiedDate; + private final LocalDateTime deletedDate; + + public ReservationInfo(Reservation reservation) { + this.id = reservation.getId(); + this.requestedDate = reservation.getRequestedDate(); + this.requestedTime = reservation.getRequestedTime(); + this.totalPrice = reservation.getTotalPrice(); + this.duration = reservation.getDuration(); + this.status = reservation.getStatus(); + this.address = reservation.getAddress(); + this.addressDetail = reservation.getAddressDetail(); + this.latitude = reservation.getLatitude(); + this.longitude = reservation.getLongitude(); + this.customerId = reservation.getCustomer().getId(); + this.managerId = reservation.getManagerId(); + this.itemBasePrice = reservation.getItem().getBasePrice(); + this.itemServiceOptionName = reservation.getItem().getServiceOptionName(); + this.customerMemo = reservation.getCustomerMemo(); + this.createdDate = reservation.getCreatedDate(); + this.modifiedDate = reservation.getModifiedDate(); + this.deletedDate = reservation.getDeletedDate(); + } + +} \ No newline at end of file diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationResponseDto.java b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationResponseDto.java index 4d5e6884..5f214543 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationResponseDto.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationResponseDto.java @@ -103,21 +103,5 @@ public static ReservationResponseDto toDto(Reservation reservation, MatchingStat .build(); } - public static ReservationResponseDto toDto(Reservation reservation) { - return ReservationResponseDto.builder() - .reservationId(reservation.getId()) - .status(reservation.getStatus()) - .totalPrice(reservation.getTotalPrice()) - .totalDuration(reservation.getDuration()) - .serviceOptionName(reservation.getItem().getServiceOptionName()) - .customerId(reservation.getCustomer().getId()) - .managerId(reservation.getManagerId()) - .requestedDate(reservation.getRequestedDate()) - .requestedTime(reservation.getRequestedTime()) - .address(reservation.getAddress()) - .addressDetail(reservation.getAddressDetail()) - .customerMemo(reservation.getCustomerMemo()) - .build(); - } } diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java index c9eaeadd..7678a293 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java @@ -3,7 +3,9 @@ import com.homeaid.reservation.domain.Reservation; import com.homeaid.reservation.domain.enumerate.ReservationStatus; +import com.homeaid.reservation.dto.request.ReservationCommand; import com.homeaid.reservation.dto.response.ManagerReservationResponseDto; +import com.homeaid.reservation.dto.response.ReservationInfo; import com.homeaid.reservation.dto.response.ReservationResponseDto; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -11,7 +13,7 @@ public interface ReservationService { - Reservation createReservation(Reservation reservation, Long userId, Long serviceOptionId); + ReservationInfo createReservation(ReservationCommand reservation); ReservationResponseDto getReservation(Long reservationId); diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java index 121ec52c..8ad372d2 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -7,10 +7,13 @@ import com.homeaid.reservation.domain.ReservationItem; import com.homeaid.matching.controller.enumerate.MatchingStatus; import com.homeaid.domain.enumerate.AlertType; +import com.homeaid.reservation.domain.ReservationStore; import com.homeaid.reservation.domain.enumerate.ReservationStatus; import com.homeaid.domain.enumerate.UserRole; import com.homeaid.dto.RequestAlert; +import com.homeaid.reservation.dto.request.ReservationCommand; import com.homeaid.reservation.dto.response.ManagerReservationResponseDto; +import com.homeaid.reservation.dto.response.ReservationInfo; import com.homeaid.reservation.dto.response.ReservationResponseDto; import com.homeaid.exception.CustomException; import com.homeaid.reservation.exception.ReservationErrorCode; @@ -43,29 +46,23 @@ public class ReservationServiceImpl implements ReservationService { private final ServiceOptionRepository serviceOptionRepository; + private final ReservationStore reservationStore; + private final NotificationPublisher notificationPublisher; @Override @Transactional - public Reservation createReservation(Reservation reservation, Long userId, Long serviceOptionId) { - log.info("[예약 생성] customerId={}, serviceOptionId={}", userId, serviceOptionId); - - Customer customer = customerRepository.findById(userId) - .orElseThrow(() -> new CustomException(UserErrorCode.CUSTOMER_NOT_FOUND)); - - ServiceOption serviceOption = getServiceOptionById(serviceOptionId); - - reservation.addItem(serviceOption); - reservation.setCustomer(customer); - - Reservation savedReservation = reservationRepository.save(reservation); + public ReservationInfo createReservation(ReservationCommand reservationCommand) { + log.info("[예약 생성] customerId={}, serviceOptionId={}", reservationCommand.getUserId(), + reservationCommand.getOptionId()); + Reservation savedReservation = reservationStore.save(reservationCommand); RequestAlert createdAdminAlert = RequestAlert.createAlert(AlertType.RESERVATION_CREATED, null, - UserRole.ADMIN, - savedReservation.getId(), null); + UserRole.ADMIN, + savedReservation.getId(), null); notificationPublisher.publishAdminNotification(createdAdminAlert); - return savedReservation; + return new ReservationInfo(savedReservation); } @Override diff --git a/reservation/src/main/java/com/homeaid/worklog/controller/WorkLogController.java b/reservation/src/main/java/com/homeaid/worklog/controller/WorkLogController.java index 1841cda1..041fc139 100644 --- a/reservation/src/main/java/com/homeaid/worklog/controller/WorkLogController.java +++ b/reservation/src/main/java/com/homeaid/worklog/controller/WorkLogController.java @@ -41,7 +41,8 @@ public ResponseEntity> updateWorkLogForCheckIn( @AuthenticationPrincipal CustomUserDetails user, @Parameter(description = "매칭 ID", required = true) @PathVariable(name = "matchingId") Long matchingId, - @RequestBody @Valid WorkLogRequestDto workLogRequestDto) { + @RequestBody @Valid WorkLogRequestDto workLogRequestDto + ) { workLogService.updateWorkLogForCheckIn(user.getUserId(), matchingId, workLogRequestDto.getLat(), workLogRequestDto.getLng()); @@ -94,6 +95,7 @@ public ResponseEntity>> g @RequestParam(value = "page", defaultValue = "0") int page, @RequestParam(value = "size", defaultValue = "10") int size ) { + Pageable pageable = PageRequest.of(page, size); Page workLogs = workLogService.getAllWorkLogsByManager(user.getUserId(), pageable); diff --git a/reservation/src/main/java/com/homeaid/worklog/service/WorkLogServiceImpl.java b/reservation/src/main/java/com/homeaid/worklog/service/WorkLogServiceImpl.java index 259d4899..9f05dbdf 100644 --- a/reservation/src/main/java/com/homeaid/worklog/service/WorkLogServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/worklog/service/WorkLogServiceImpl.java @@ -123,7 +123,7 @@ private boolean isValidDistance(Reservation reservation, Double latitude, Double return calculatedDistance < CHECK_RANGE_DISTANCE_METER; } - public void isValidManager(Long managerId, Long requestManagerId) { + private void isValidManager(Long managerId, Long requestManagerId) { if (!managerId.equals(requestManagerId)) { throw new CustomException(WorkLogErrorCode.CHECKOUT_MANAGER_MISMATCH); } From 4e1030093c8343b2f93db67f612565c58cb4c001 Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 14 Jul 2025 13:29:38 +0900 Subject: [PATCH 03/10] =?UTF-8?q?refactor:=20update=20reservation,=20contr?= =?UTF-8?q?oller=EC=99=80=20service=EC=9D=98=20=EB=AA=85=ED=99=95=ED=95=9C?= =?UTF-8?q?=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC,=20service=EC=99=80?= =?UTF-8?q?=20repository=20=EC=98=81=EC=86=8D=ED=99=94=EC=9D=98=20?= =?UTF-8?q?=EB=AA=85=ED=99=95=ED=95=9C=20=EC=B1=85=EC=9E=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 9 ++--- .../reservation/domain/Reservation.java | 10 +++-- .../reservation/domain/ReservationStore.java | 2 + .../domain/ReservationStoreImpl.java | 38 ++++++++++++++++++- .../reservation/dto/ReservationDtoMapper.java | 2 + .../dto/ReservationDtoMapperImpl.java | 19 ++++++++++ .../dto/request/ReservationCommand.java | 1 + .../service/ReservationService.java | 4 +- .../service/ReservationServiceImpl.java | 26 +------------ 9 files changed, 74 insertions(+), 37 deletions(-) diff --git a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java index 7769b247..a9227aa5 100644 --- a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java +++ b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java @@ -98,13 +98,10 @@ public ResponseEntity> updateReservati @PathVariable(name = "reservationId") final Long reservationId, @RequestBody @Valid ReservationRequestDto reservationRequestDto) { - Reservation updated = reservationService.updateReservation( - user.getUserId(), - reservationId, - UpdateReservationRequestDto.toEntity(reservationRequestDto), - reservationRequestDto.getOptionId()); + ReservationInfo reservationInfo = reservationService.updateReservation( + reservationDtoMapper.toCommand(reservationRequestDto, user.getUserId(), reservationId)); - return ResponseEntity.ok(CommonApiResponse.success(ReservationResponseDto.toDto(updated))); + return ResponseEntity.ok(CommonApiResponse.success(reservationDtoMapper.toDto(reservationInfo))); } @DeleteMapping("/{reservationId}") diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/Reservation.java b/reservation/src/main/java/com/homeaid/reservation/domain/Reservation.java index e72a688a..7180bb82 100644 --- a/reservation/src/main/java/com/homeaid/reservation/domain/Reservation.java +++ b/reservation/src/main/java/com/homeaid/reservation/domain/Reservation.java @@ -6,6 +6,7 @@ import com.homeaid.domain.Manager; import com.homeaid.matching.domain.Matching; import com.homeaid.reservation.domain.enumerate.ReservationStatus; +import com.homeaid.reservation.dto.request.ReservationCommand; import com.homeaid.serviceoption.domain.ServiceOption; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -119,12 +120,13 @@ public void addItem(ServiceOption serviceOption) { this.totalPrice = serviceOption.getPrice() * this.duration; } - public void updateReservation(Reservation newReservation, int newTotalPrice, - int newDuration) { + public void updateReservation(ReservationCommand newReservation) { this.requestedDate = newReservation.getRequestedDate(); this.requestedTime = newReservation.getRequestedTime(); - this.totalPrice = newTotalPrice; - this.duration = newDuration; + this.latitude = newReservation.getLatitude(); + this.longitude = newReservation.getLongitude(); + this.address = newReservation.getAddress(); + this.addressDetail = newReservation.getAddressDetail(); } public void softDelete() { diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java index bf628265..b1bca93f 100644 --- a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java @@ -6,4 +6,6 @@ public interface ReservationStore { Reservation save(ReservationCommand reservationCommand); + Reservation update(ReservationCommand reservationCommand); + } diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java index 5622e804..263c0532 100644 --- a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java @@ -5,6 +5,7 @@ import com.homeaid.exception.CustomException; import com.homeaid.exception.UserErrorCode; import com.homeaid.repository.CustomerRepository; +import com.homeaid.reservation.domain.enumerate.ReservationStatus; import com.homeaid.reservation.dto.request.ReservationCommand; import com.homeaid.reservation.exception.ReservationErrorCode; import com.homeaid.reservation.repository.ReservationRepository; @@ -40,5 +41,40 @@ public Reservation save(ReservationCommand reservationCommand) { return reservationRepository.save(reservation); } - + + @Override + public Reservation update(ReservationCommand reservationCommand) { + Reservation originReservation = getReservationById(reservationCommand.getReservationId()); + + if (!originReservation.getCustomer().getId().equals(reservationCommand.getUserId())) { + log.warn("[예약 수정 실패] 권한 없음 - reservationId={}, userId={}", reservationCommand.getReservationId(), reservationCommand.getUserId()); + throw new CustomException(ReservationErrorCode.UNAUTHORIZED_RESERVATION_ACCESS); + } + + if (originReservation.getStatus() != ReservationStatus.REQUESTED) { + log.warn("[예약 수정 실패] 예약 상태 불가 - reservationId={}, status={}", reservationCommand.getReservationId(), + originReservation.getStatus()); + throw new CustomException(ReservationErrorCode.RESERVATION_CANNOT_UPDATE); + } + + ServiceOption serviceOption = getServiceOptionById(reservationCommand.getOptionId()); + + originReservation.updateReservation(reservationCommand); + + ReservationItem item = originReservation.getItem(); + item.updateItem(serviceOption); + + return originReservation; + } + + private Reservation getReservationById(Long reservationId) { + return reservationRepository.findById(reservationId) + .orElseThrow(() -> new CustomException(ReservationErrorCode.RESERVATION_NOT_FOUND)); + } + + private ServiceOption getServiceOptionById(Long serviceOptionId) { + return serviceOptionRepository.findById(serviceOptionId) + .orElseThrow(() -> new CustomException(ReservationErrorCode.RESERVATION_NOT_FOUND)); + } + } diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java index cdd56643..e63f9138 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java @@ -10,5 +10,7 @@ public interface ReservationDtoMapper { ReservationCommand toCommand(ReservationRequestDto reservationRequestDto, Long userId); + ReservationCommand toCommand(ReservationRequestDto reservationRequestDto, Long userId, Long reservationId); + ReservationResponseDto toDto(ReservationInfo reservationInfo); } diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java index f0d6341f..bdd111bf 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java @@ -26,6 +26,25 @@ public ReservationCommand toCommand(ReservationRequestDto reservationRequestDto, .build(); } + @Override + public ReservationCommand toCommand(ReservationRequestDto reservationRequestDto, Long userId, + Long reservationId) { + if (reservationRequestDto == null) { + return null; + } + return ReservationCommand.builder() + .userId(userId) + .requestedDate(reservationRequestDto.getRequestedDate()) + .requestedTime(reservationRequestDto.getRequestedTime()) + .latitude(reservationRequestDto.getLatitude()) + .longitude(reservationRequestDto.getLongitude()) + .duration(reservationRequestDto.getTotalDuration()) + .address(reservationRequestDto.getAddress()) + .addressDetail(reservationRequestDto.getAddressDetail()) + .reservationId(reservationId) + .build(); + } + @Override public ReservationResponseDto toDto(ReservationInfo reservationInfo) { if (reservationInfo == null) { diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationCommand.java b/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationCommand.java index 06aacc26..4b9ffe0b 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationCommand.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationCommand.java @@ -19,6 +19,7 @@ public class ReservationCommand { private final String addressDetail; private final Double latitude; private final Double longitude; + private final Long reservationId; public Reservation toEntity() { return Reservation.builder() diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java index 7678a293..8a41af7a 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java @@ -13,11 +13,11 @@ public interface ReservationService { - ReservationInfo createReservation(ReservationCommand reservation); + ReservationInfo createReservation(ReservationCommand reservationCommand); ReservationResponseDto getReservation(Long reservationId); - Reservation updateReservation(Long reservationId, Long userId, Reservation reservation, Long serviceOptionId); + ReservationInfo updateReservation(ReservationCommand reservationCommand); Page getReservations(Pageable pageable, ReservationStatus status); diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java index 8ad372d2..f9ef9789 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -87,30 +87,8 @@ public ReservationResponseDto getReservation(Long id) { @Override @Transactional - public Reservation updateReservation(Long reservationId, Long userId, Reservation newReservation, - Long serviceOptionId) { - Reservation originReservation = getReservationById(reservationId); - - if (!originReservation.getCustomer().getId().equals(userId)) { - log.warn("[예약 수정 실패] 권한 없음 - reservationId={}, userId={}", reservationId, userId); - throw new CustomException(ReservationErrorCode.UNAUTHORIZED_RESERVATION_ACCESS); - } - - if (originReservation.getStatus() != ReservationStatus.REQUESTED) { - log.warn("[예약 수정 실패] 예약 상태 불가 - reservationId={}, status={}", reservationId, - originReservation.getStatus()); - throw new CustomException(ReservationErrorCode.RESERVATION_CANNOT_UPDATE); - } - - ServiceOption serviceOption = getServiceOptionById(serviceOptionId); - - originReservation.updateReservation(newReservation, serviceOption.getPrice(), - newReservation.getDuration()); - - ReservationItem item = originReservation.getItem(); - item.updateItem(serviceOption); - - return originReservation; + public ReservationInfo updateReservation(ReservationCommand reservationCommand) { + return new ReservationInfo(reservationStore.update(reservationCommand)); } From 59de224c12fd42c4c04c800d25eee92354a15729 Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 14 Jul 2025 13:34:30 +0900 Subject: [PATCH 04/10] =?UTF-8?q?refactor:=20delete=20reservation,=20servi?= =?UTF-8?q?ce=EC=99=80=20repository=20=EC=98=81=EC=86=8D=ED=99=94=EC=9D=98?= =?UTF-8?q?=20=EB=AA=85=ED=99=95=ED=95=9C=20=EC=B1=85=EC=9E=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homeaid/reservation/domain/ReservationStore.java | 1 + .../reservation/domain/ReservationStoreImpl.java | 12 ++++++++++++ .../reservation/service/ReservationServiceImpl.java | 10 +--------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java index b1bca93f..2091aa3f 100644 --- a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java @@ -8,4 +8,5 @@ public interface ReservationStore { Reservation update(ReservationCommand reservationCommand); + void delete(Long reservationId, Long userId); } diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java index 263c0532..22b5e21d 100644 --- a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java @@ -67,6 +67,18 @@ public Reservation update(ReservationCommand reservationCommand) { return originReservation; } + @Override + public void delete(Long reservationId, Long userId) { + Reservation reservation = getReservationById(reservationId); + + if (!reservation.getCustomer().getId().equals(userId)) { + log.warn("[예약 삭제 실패] 권한 없음 - reservationId={}, userId={}", reservationId, userId); + throw new CustomException(ReservationErrorCode.UNAUTHORIZED_RESERVATION_ACCESS); + } + + reservation.softDelete(); + } + private Reservation getReservationById(Long reservationId) { return reservationRepository.findById(reservationId) .orElseThrow(() -> new CustomException(ReservationErrorCode.RESERVATION_NOT_FOUND)); diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java index f9ef9789..6f2dc454 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -95,15 +95,7 @@ public ReservationInfo updateReservation(ReservationCommand reservationCommand) @Override @Transactional public void deleteReservation(Long reservationId, Long userId) { - - Reservation reservation = getReservationById(reservationId); - - if (!reservation.getCustomer().getId().equals(userId)) { - log.warn("[예약 삭제 실패] 권한 없음 - reservationId={}, userId={}", reservationId, userId); - throw new CustomException(ReservationErrorCode.UNAUTHORIZED_RESERVATION_ACCESS); - } - - reservation.softDelete(); + reservationStore.delete(reservationId, userId); } @Override From 79caf9a0c8438d40f5fb7468f2e7cd2265523766 Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 14 Jul 2025 13:35:40 +0900 Subject: [PATCH 05/10] =?UTF-8?q?refactor:=20create=20reservation=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/homeaid/reservation/domain/ReservationStoreImpl.java | 3 +++ .../homeaid/reservation/service/ReservationServiceImpl.java | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java index 22b5e21d..834e1d96 100644 --- a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java @@ -39,6 +39,9 @@ public Reservation save(ReservationCommand reservationCommand) { reservation.addItem(serviceOption); reservation.setCustomer(customer); + log.info("[예약 생성] customerId={}, serviceOptionId={}", reservationCommand.getUserId(), + reservationCommand.getOptionId()); + return reservationRepository.save(reservation); } diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java index 6f2dc454..16c46f27 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -53,8 +53,6 @@ public class ReservationServiceImpl implements ReservationService { @Override @Transactional public ReservationInfo createReservation(ReservationCommand reservationCommand) { - log.info("[예약 생성] customerId={}, serviceOptionId={}", reservationCommand.getUserId(), - reservationCommand.getOptionId()); Reservation savedReservation = reservationStore.save(reservationCommand); RequestAlert createdAdminAlert = RequestAlert.createAlert(AlertType.RESERVATION_CREATED, null, From a90da958895caee89a660f55fcde7c8cd471a38d Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 14 Jul 2025 14:21:39 +0900 Subject: [PATCH 06/10] =?UTF-8?q?refactor:=20get=20reservation,=20reservat?= =?UTF-8?q?ionReader=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=B4=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 4 +- .../reservation/domain/ReservationReader.java | 11 +++ .../domain/ReservationReaderImpl.java | 27 +++++++ .../dto/ReservationDtoMapperImpl.java | 3 + .../dto/response/ReservationInfo.java | 76 ++++++++++++++----- .../service/ReservationService.java | 2 +- .../service/ReservationServiceImpl.java | 25 ++---- 7 files changed, 110 insertions(+), 38 deletions(-) create mode 100644 reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java create mode 100644 reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java diff --git a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java index a9227aa5..b7d37b57 100644 --- a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java +++ b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java @@ -22,6 +22,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springdoc.core.models.GroupedOpenApi; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -48,6 +49,7 @@ public class ReservationController { private final ReservationService reservationService; private final ReservationDtoMapper reservationDtoMapper; + private final GroupedOpenApi managerAPI; @PostMapping @Operation(summary = "예약 생성", description = "고객이 예약 옵션을 선택하여 예약을 생성합니다.") @@ -81,7 +83,7 @@ public ResponseEntity> getReservation ) { return ResponseEntity.ok( - CommonApiResponse.success(reservationService.getReservation(reservationId))); + CommonApiResponse.success(reservationDtoMapper.toDto(reservationService.getReservation(reservationId)))); } @PutMapping("/{reservationId}") diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java new file mode 100644 index 00000000..aa681424 --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java @@ -0,0 +1,11 @@ +package com.homeaid.reservation.domain; + + + +public interface ReservationReader { + + Reservation getReservation(Long reservationId); + + + +} diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java new file mode 100644 index 00000000..a95f256f --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java @@ -0,0 +1,27 @@ +package com.homeaid.reservation.domain; + +import com.homeaid.exception.CustomException; +import com.homeaid.reservation.exception.ReservationErrorCode; +import com.homeaid.reservation.repository.ReservationRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class ReservationReaderImpl implements ReservationReader { + + private final ReservationRepository reservationRepository; + + @Override + public Reservation getReservation(Long reservationId) { + return getReservationById(reservationId); + } + + private Reservation getReservationById(Long reservationId) { + return reservationRepository.findById(reservationId) + .orElseThrow(() -> new CustomException(ReservationErrorCode.RESERVATION_NOT_FOUND)); + } + +} diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java index bdd111bf..eed90e09 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java @@ -64,6 +64,9 @@ public ReservationResponseDto toDto(ReservationInfo reservationInfo) { .address(reservationInfo.getAddress()) .addressDetail(reservationInfo.getAddressDetail()) .customerMemo(reservationInfo.getCustomerMemo()) + .matchingStatus(reservationInfo.getMatchingStatus()) + .matchedManagerName(reservationInfo.getManagerName()) + .matchingId(reservationInfo.getMatchingId()) .build(); } diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationInfo.java b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationInfo.java index 5987b1e0..5f212fbb 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationInfo.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationInfo.java @@ -1,13 +1,17 @@ package com.homeaid.reservation.dto.response; +import com.homeaid.matching.controller.enumerate.MatchingStatus; import com.homeaid.reservation.domain.Reservation; import com.homeaid.reservation.domain.enumerate.ReservationStatus; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; @Getter +@Builder(access = AccessLevel.PRIVATE) public class ReservationInfo { private final Long id; @@ -28,26 +32,60 @@ public class ReservationInfo { private final LocalDateTime createdDate; private final LocalDateTime modifiedDate; private final LocalDateTime deletedDate; + private final MatchingStatus matchingStatus; + private final String managerName; + private final Long matchingId; - public ReservationInfo(Reservation reservation) { - this.id = reservation.getId(); - this.requestedDate = reservation.getRequestedDate(); - this.requestedTime = reservation.getRequestedTime(); - this.totalPrice = reservation.getTotalPrice(); - this.duration = reservation.getDuration(); - this.status = reservation.getStatus(); - this.address = reservation.getAddress(); - this.addressDetail = reservation.getAddressDetail(); - this.latitude = reservation.getLatitude(); - this.longitude = reservation.getLongitude(); - this.customerId = reservation.getCustomer().getId(); - this.managerId = reservation.getManagerId(); - this.itemBasePrice = reservation.getItem().getBasePrice(); - this.itemServiceOptionName = reservation.getItem().getServiceOptionName(); - this.customerMemo = reservation.getCustomerMemo(); - this.createdDate = reservation.getCreatedDate(); - this.modifiedDate = reservation.getModifiedDate(); - this.deletedDate = reservation.getDeletedDate(); + public static ReservationInfo toInfo(Reservation reservation) { + return ReservationInfo.builder() + .id(reservation.getId()) + .requestedDate(reservation.getRequestedDate()) + .requestedTime(reservation.getRequestedTime()) + .totalPrice(reservation.getTotalPrice()) + .duration(reservation.getDuration()) + .status(reservation.getStatus()) + .address(reservation.getAddress()) + .addressDetail(reservation.getAddressDetail()) + .latitude(reservation.getLatitude()) + .longitude(reservation.getLongitude()) + .customerId(reservation.getCustomer().getId()) + .managerId(reservation.getManagerId()) + .itemBasePrice(reservation.getItem().getBasePrice()) + .itemServiceOptionName(reservation.getItem().getServiceOptionName()) + .customerMemo(reservation.getCustomerMemo()) + .createdDate(reservation.getCreatedDate()) + .modifiedDate(reservation.getModifiedDate()) + .deletedDate(reservation.getDeletedDate()) + .matchingStatus(null) + .managerName(null) + .matchingId(null) + .build(); + } + + public static ReservationInfo toInfo(Reservation reservation, MatchingStatus matchingStatus, String managerName, Long matchingId) { + return ReservationInfo.builder() + .id(reservation.getId()) + .requestedDate(reservation.getRequestedDate()) + .requestedTime(reservation.getRequestedTime()) + .totalPrice(reservation.getTotalPrice()) + .duration(reservation.getDuration()) + .status(reservation.getStatus()) + .address(reservation.getAddress()) + .addressDetail(reservation.getAddressDetail()) + .latitude(reservation.getLatitude()) + .longitude(reservation.getLongitude()) + .customerId(reservation.getCustomer().getId()) + .managerId(reservation.getManagerId()) + .itemBasePrice(reservation.getItem().getBasePrice()) + .itemServiceOptionName(reservation.getItem().getServiceOptionName()) + .customerMemo(reservation.getCustomerMemo()) + .createdDate(reservation.getCreatedDate()) + .modifiedDate(reservation.getModifiedDate()) + .deletedDate(reservation.getDeletedDate()) + .matchingStatus(matchingStatus) + .managerName(managerName) + .matchingId(matchingId) + .build(); } } \ No newline at end of file diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java index 8a41af7a..acef2b5a 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java @@ -15,7 +15,7 @@ public interface ReservationService { ReservationInfo createReservation(ReservationCommand reservationCommand); - ReservationResponseDto getReservation(Long reservationId); + ReservationInfo getReservation(Long reservationId); ReservationInfo updateReservation(ReservationCommand reservationCommand); diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java index 16c46f27..6973027a 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -7,6 +7,7 @@ import com.homeaid.reservation.domain.ReservationItem; import com.homeaid.matching.controller.enumerate.MatchingStatus; import com.homeaid.domain.enumerate.AlertType; +import com.homeaid.reservation.domain.ReservationReader; import com.homeaid.reservation.domain.ReservationStore; import com.homeaid.reservation.domain.enumerate.ReservationStatus; import com.homeaid.domain.enumerate.UserRole; @@ -44,10 +45,10 @@ public class ReservationServiceImpl implements ReservationService { private final CustomerRepository customerRepository; - private final ServiceOptionRepository serviceOptionRepository; - private final ReservationStore reservationStore; + private final ReservationReader reservationReader; + private final NotificationPublisher notificationPublisher; @Override @@ -60,13 +61,13 @@ public ReservationInfo createReservation(ReservationCommand reservationCommand) savedReservation.getId(), null); notificationPublisher.publishAdminNotification(createdAdminAlert); - return new ReservationInfo(savedReservation); + return ReservationInfo.toInfo(savedReservation); } @Override @Transactional(readOnly = true) - public ReservationResponseDto getReservation(Long id) { - Reservation reservation = getReservationById(id); + public ReservationInfo getReservation(Long reservationId) { + Reservation reservation = reservationReader.getReservation(reservationId); Matching latestMatching = getLatestMatching(reservation).orElse(null); @@ -80,13 +81,13 @@ public ReservationResponseDto getReservation(Long id) { matchingId = latestMatching.getId(); } - return ReservationResponseDto.toDto(reservation, status, managerName, matchingId); + return ReservationInfo.toInfo(reservation, status, managerName, matchingId); } @Override @Transactional public ReservationInfo updateReservation(ReservationCommand reservationCommand) { - return new ReservationInfo(reservationStore.update(reservationCommand)); + return ReservationInfo.toInfo(reservationStore.update(reservationCommand)); } @@ -184,16 +185,6 @@ public void validateUserAccess(Reservation reservation, Long userId) { } } - private ServiceOption getServiceOptionById(Long serviceOptionId) { - return serviceOptionRepository.findById(serviceOptionId) - .orElseThrow(() -> new CustomException(ReservationErrorCode.RESERVATION_NOT_FOUND)); - } - - private Reservation getReservationById(Long reservationId) { - return reservationRepository.findById(reservationId) - .orElseThrow(() -> new CustomException(ReservationErrorCode.RESERVATION_NOT_FOUND)); - } - private Optional getLatestMatching(Reservation reservation) { return reservation.getLatestMatching(); } From 7e5871d6caa6b48cfbae7ce9c08f345e277e2695 Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 14 Jul 2025 15:13:51 +0900 Subject: [PATCH 07/10] =?UTF-8?q?refactor:=20get=20reservations,=20reserva?= =?UTF-8?q?tionReader=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=B4=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reservation/controller/ReservationController.java | 4 +--- .../com/homeaid/reservation/domain/ReservationReader.java | 6 ++++-- .../homeaid/reservation/domain/ReservationReaderImpl.java | 8 ++++++++ .../reservation/service/ReservationServiceImpl.java | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java index b7d37b57..d3d0fd4c 100644 --- a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java +++ b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java @@ -8,7 +8,6 @@ import com.homeaid.reservation.domain.enumerate.ReservationStatus; import com.homeaid.reservation.dto.ReservationDtoMapper; import com.homeaid.reservation.dto.request.ReservationRequestDto; -import com.homeaid.reservation.dto.request.UpdateReservationRequestDto; import com.homeaid.reservation.dto.response.ManagerReservationResponseDto; import com.homeaid.reservation.dto.response.ReservationResponseDto; import com.homeaid.auth.user.CustomUserDetails; @@ -22,7 +21,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springdoc.core.models.GroupedOpenApi; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -49,7 +47,7 @@ public class ReservationController { private final ReservationService reservationService; private final ReservationDtoMapper reservationDtoMapper; - private final GroupedOpenApi managerAPI; + @PostMapping @Operation(summary = "예약 생성", description = "고객이 예약 옵션을 선택하여 예약을 생성합니다.") diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java index aa681424..729c9906 100644 --- a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java @@ -1,11 +1,13 @@ package com.homeaid.reservation.domain; +import com.homeaid.reservation.domain.enumerate.ReservationStatus; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; public interface ReservationReader { Reservation getReservation(Long reservationId); - - + Page getReservationByStatus(ReservationStatus status, Pageable pageable); } diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java index a95f256f..97e87a69 100644 --- a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java @@ -1,10 +1,13 @@ package com.homeaid.reservation.domain; import com.homeaid.exception.CustomException; +import com.homeaid.reservation.domain.enumerate.ReservationStatus; import com.homeaid.reservation.exception.ReservationErrorCode; import com.homeaid.reservation.repository.ReservationRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; @Component @@ -19,6 +22,11 @@ public Reservation getReservation(Long reservationId) { return getReservationById(reservationId); } + @Override + public Page getReservationByStatus(ReservationStatus status, Pageable pageable) { + return reservationRepository.findByOptionalStatus(status, pageable); + } + private Reservation getReservationById(Long reservationId) { return reservationRepository.findById(reservationId) .orElseThrow(() -> new CustomException(ReservationErrorCode.RESERVATION_NOT_FOUND)); diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java index 6973027a..6fed25cd 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -101,7 +101,7 @@ public void deleteReservation(Long reservationId, Long userId) { @Transactional(readOnly = true) public Page getReservations(Pageable pageable, ReservationStatus status) { - Page reservations = reservationRepository.findByOptionalStatus(status, pageable); + Page reservations = reservationReader.getReservationByStatus(status, pageable); return reservations.map(reservation -> { From f60091b10badf394fe91e455dd84b170124ff23f Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 14 Jul 2025 16:24:29 +0900 Subject: [PATCH 08/10] =?UTF-8?q?refactor:=20get=20Page,=20r?= =?UTF-8?q?eservationReader=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=B4=20?= =?UTF-8?q?=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reservation/domain/ReservationReader.java | 5 +++ .../domain/ReservationReaderImpl.java | 10 +++++ .../ManagerReservationResponseDto.java | 4 +- .../service/ReservationServiceImpl.java | 38 ++++++------------- 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java index 729c9906..7d5c8d05 100644 --- a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java @@ -10,4 +10,9 @@ public interface ReservationReader { Reservation getReservation(Long reservationId); Page getReservationByStatus(ReservationStatus status, Pageable pageable); + + Page getReservationsByCustomerId(Long userId, Pageable pageable); + + Page getReservationsByManagerId(Long managerId, Pageable pageable); + } diff --git a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java index 97e87a69..1e546849 100644 --- a/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java @@ -27,6 +27,16 @@ public Page getReservationByStatus(ReservationStatus status, Pageab return reservationRepository.findByOptionalStatus(status, pageable); } + @Override + public Page getReservationsByCustomerId(Long userId, Pageable pageable) { + return reservationRepository.findAllByCustomerId(userId, pageable); + } + + @Override + public Page getReservationsByManagerId(Long managerId, Pageable pageable) { + return reservationRepository.findAllByManagerId(managerId, pageable); + } + private Reservation getReservationById(Long reservationId) { return reservationRepository.findById(reservationId) .orElseThrow(() -> new CustomException(ReservationErrorCode.RESERVATION_NOT_FOUND)); diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/response/ManagerReservationResponseDto.java b/reservation/src/main/java/com/homeaid/reservation/dto/response/ManagerReservationResponseDto.java index af320883..d4f37b69 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/response/ManagerReservationResponseDto.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/response/ManagerReservationResponseDto.java @@ -43,7 +43,7 @@ public class ManagerReservationResponseDto { private MatchingStatus matchingStatus; - public static ManagerReservationResponseDto toDto(Reservation reservation, Customer customer, Matching matching) { + public static ManagerReservationResponseDto toDto(Reservation reservation, String customerName, Matching matching) { return ManagerReservationResponseDto.builder() .reservationId(reservation.getId()) .matchingId(matching.getId()) @@ -54,7 +54,7 @@ public static ManagerReservationResponseDto toDto(Reservation reservation, Custo reservation.getRequestedTime() )) .matchingStatus(matching.getStatus()) - .customerName(customer.getName()) + .customerName(customerName) .build(); } diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java index 6fed25cd..a2ece6bf 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -4,7 +4,6 @@ import com.homeaid.domain.Customer; import com.homeaid.matching.domain.Matching; import com.homeaid.reservation.domain.Reservation; -import com.homeaid.reservation.domain.ReservationItem; import com.homeaid.matching.controller.enumerate.MatchingStatus; import com.homeaid.domain.enumerate.AlertType; import com.homeaid.reservation.domain.ReservationReader; @@ -19,15 +18,9 @@ import com.homeaid.exception.CustomException; import com.homeaid.reservation.exception.ReservationErrorCode; import com.homeaid.exception.UserErrorCode; -import com.homeaid.repository.*; -import com.homeaid.reservation.repository.ReservationRepository; import com.homeaid.service.NotificationPublisher; -import com.homeaid.serviceoption.domain.ServiceOption; -import com.homeaid.serviceoption.repository.ServiceOptionRepository; -import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.function.Function; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -41,10 +34,6 @@ @Slf4j public class ReservationServiceImpl implements ReservationService { - private final ReservationRepository reservationRepository; - - private final CustomerRepository customerRepository; - private final ReservationStore reservationStore; private final ReservationReader reservationReader; @@ -119,19 +108,21 @@ public Page getReservations(Pageable pageable, Reservati @Override @Transactional(readOnly = true) public Page getReservationsByCustomer(Long userId, Pageable pageable) { - return reservationRepository.findAllByCustomerId(userId, pageable); + return reservationReader.getReservationsByCustomerId(userId, pageable); } @Override @Transactional(readOnly = true) public Page getReservationsByManager(Long managerId, Pageable pageable) { - Page reservations = reservationRepository.findAllByManagerId(managerId, pageable); - Map customerMap = batchGetCustomersFromReservations(reservations); + Page reservations = reservationReader.getReservationsByManagerId(managerId, pageable); + + Map customerMap = getCustomersFromReservations(reservations); return reservations.map(reservation -> { - Customer customer = customerMap.get(reservation.getCustomer().getId()); + + Customer customer = customerMap.get(reservation.getId()); if (customer == null) { log.error("[매니저 예약 조회 실패] 고객 정보 없음 - reservationId={}, customerId={}", reservation.getId(), @@ -141,25 +132,18 @@ public Page getReservationsByManager(Long manager Matching matching = getLatestMatching(reservation).get(); - return ManagerReservationResponseDto.toDto(reservation, customer, matching); + return ManagerReservationResponseDto.toDto(reservation, customer.getName(), matching); }); } - private Map batchGetCustomersFromReservations(Page reservations) { - List customerIds = reservations.stream() - .map(reservation -> reservation.getCustomer().getId()) - .distinct() - .toList(); - - return customerRepository.findByIdIn(customerIds).stream() - .collect(Collectors.toMap(Customer::getId, Function.identity())); - + private Map getCustomersFromReservations(Page reservations) { + return reservations.stream().collect(Collectors.toMap(Reservation::getId, + Reservation::getCustomer)); } @Override public Reservation validateReservation(Long reservationId) { - Reservation reservation = reservationRepository.findById(reservationId) - .orElseThrow(() -> new CustomException(ReservationErrorCode.RESERVATION_NOT_FOUND)); + Reservation reservation = reservationReader.getReservation(reservationId); if (reservation.getStatus() != ReservationStatus.COMPLETED) { throw new CustomException(ReservationErrorCode.RESERVATION_NOT_COMPLETED); From 1c575f8b0c5c7cfdf49e7f24782dc3972a9a6e5f Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 14 Jul 2025 16:39:33 +0900 Subject: [PATCH 09/10] =?UTF-8?q?refactor:=20validate=20reservation,=20res?= =?UTF-8?q?ervationReader=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=9C=20reposit?= =?UTF-8?q?ory=EC=99=80=20service=20=EC=B1=85=EC=9E=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../issue/service/ServiceIssueServiceImpl.java | 6 ++---- .../reservation/service/ReservationService.java | 6 ++---- .../service/ReservationServiceImpl.java | 15 ++++++++------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/reservation/src/main/java/com/homeaid/issue/service/ServiceIssueServiceImpl.java b/reservation/src/main/java/com/homeaid/issue/service/ServiceIssueServiceImpl.java index 2b706870..6a52dace 100644 --- a/reservation/src/main/java/com/homeaid/issue/service/ServiceIssueServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/issue/service/ServiceIssueServiceImpl.java @@ -27,8 +27,7 @@ public class ServiceIssueServiceImpl implements ServiceIssueService { public void createIssue(Long reservationId, Long managerId, String content, List files) { - Reservation reservation = reservationService.validateReservation(reservationId); - reservationService.validateManagerAccess(reservation, managerId); + Reservation reservation = reservationService.validateReservation(reservationId, managerId); existsByReservationId(reservation.getId()); ServiceIssue issue = ServiceIssue.builder() @@ -50,8 +49,7 @@ public void createIssue(Long reservationId, Long managerId, String content, @Transactional(readOnly = true) public ServiceIssue getIssueByReservation(Long reservationId, Long userId) { - Reservation reservation = reservationService.validateReservation(reservationId); - reservationService.validateUserAccess(reservation, userId); + reservationService.validateReservationAndUserAccess(reservationId, userId); return findByReservationId(reservationId); } diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java index acef2b5a..9ab1cdd0 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationService.java @@ -27,9 +27,7 @@ public interface ReservationService { Page getReservationsByManager(Long userId, Pageable pageable); - Reservation validateReservation(Long reservationId); + Reservation validateReservation(Long reservationId, Long managerId); - void validateManagerAccess(Reservation reservation, Long managerId); - - void validateUserAccess(Reservation reservation, Long managerId); + void validateReservationAndUserAccess(Long reservationId, Long userId); } diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java index a2ece6bf..383e779d 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -142,25 +142,26 @@ private Map getCustomersFromReservations(Page reser } @Override - public Reservation validateReservation(Long reservationId) { + @Transactional(readOnly = true) + public Reservation validateReservation(Long reservationId, Long managerId) { Reservation reservation = reservationReader.getReservation(reservationId); if (reservation.getStatus() != ReservationStatus.COMPLETED) { throw new CustomException(ReservationErrorCode.RESERVATION_NOT_COMPLETED); } - return reservation; - } - - @Override - public void validateManagerAccess(Reservation reservation, Long managerId) { if (!reservation.getManagerId().equals(managerId)) { throw new CustomException(ReservationErrorCode.RESERVATION_MANAGER_MISMATCH); } + + return reservation; } @Override - public void validateUserAccess(Reservation reservation, Long userId) { + @Transactional(readOnly = true) + public void validateReservationAndUserAccess(Long reservationId, Long userId) { + Reservation reservation = reservationReader.getReservation(reservationId); + boolean isManager = userId.equals(reservation.getManagerId()); boolean isCustomer = userId.equals(reservation.getCustomer().getId()); From 4ae8fbd9e57c9b99f0c97986d30df1c57f3e3e43 Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 14 Jul 2025 16:57:33 +0900 Subject: [PATCH 10/10] =?UTF-8?q?refactor:=20reservationDtoMapper=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=98=EC=97=AC=20dto=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../payment/service/PaymentServiceImpl.java | 4 +- .../controller/ReservationController.java | 3 +- .../reservation/dto/ReservationDtoMapper.java | 10 +++ .../dto/ReservationDtoMapperImpl.java | 70 +++++++++++++++++++ .../request/UpdateReservationRequestDto.java | 34 --------- .../dto/response/ReservationResponseDto.java | 38 ---------- .../service/ReservationServiceImpl.java | 10 ++- 7 files changed, 92 insertions(+), 77 deletions(-) delete mode 100644 reservation/src/main/java/com/homeaid/reservation/dto/request/UpdateReservationRequestDto.java diff --git a/payment/src/main/java/com/homeaid/payment/service/PaymentServiceImpl.java b/payment/src/main/java/com/homeaid/payment/service/PaymentServiceImpl.java index df551073..6be0de24 100644 --- a/payment/src/main/java/com/homeaid/payment/service/PaymentServiceImpl.java +++ b/payment/src/main/java/com/homeaid/payment/service/PaymentServiceImpl.java @@ -12,6 +12,7 @@ import com.homeaid.payment.exception.PaymentErrorCode; import com.homeaid.payment.repository.PaymentRepository; import com.homeaid.payment.validator.PaymentValidator; +import com.homeaid.reservation.dto.ReservationDtoMapper; import com.homeaid.reservation.dto.response.ReservationResponseDto; import com.homeaid.reservation.repository.ReservationRepository; import com.homeaid.repository.UserRepository; @@ -30,6 +31,7 @@ public class PaymentServiceImpl implements PaymentService { private final ReservationRepository reservationRepository; private final UserRepository userRepository; private final PaymentValidator paymentValidator; + private final ReservationDtoMapper reservationDtoMapper; @Override @Transactional @@ -80,7 +82,7 @@ public ReservationPaymentDetailResponseDto getReservationPaymentDetail(Long cust String customerName = getCustomerName(reservation.getCustomer().getId()); - ReservationResponseDto reservationDto = ReservationResponseDto.toDto(reservation); + ReservationResponseDto reservationDto = reservationDtoMapper.toDto(reservation); PaymentResponseDto paymentDto = PaymentResponseDto.toDto(payment, customerName); return ReservationPaymentDetailResponseDto.of(reservationDto, paymentDto); diff --git a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java index d3d0fd4c..d6b6a5f5 100644 --- a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java +++ b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java @@ -156,8 +156,9 @@ public ResponseEntity Page reservations = reservationService.getReservationsByCustomer(user.getUserId(), pageable); + PagedResponseDto response = - PagedResponseDto.fromPage(reservations, ReservationResponseDto::toDto); + PagedResponseDto.fromPage(reservations, reservationDtoMapper::toDto); return ResponseEntity.ok(CommonApiResponse.success(response)); } diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java index e63f9138..9fc246dd 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java @@ -1,7 +1,10 @@ package com.homeaid.reservation.dto; +import com.homeaid.matching.domain.Matching; +import com.homeaid.reservation.domain.Reservation; import com.homeaid.reservation.dto.request.ReservationCommand; +import com.homeaid.reservation.dto.response.ManagerReservationResponseDto; import com.homeaid.reservation.dto.response.ReservationInfo; import com.homeaid.reservation.dto.request.ReservationRequestDto; import com.homeaid.reservation.dto.response.ReservationResponseDto; @@ -13,4 +16,11 @@ public interface ReservationDtoMapper { ReservationCommand toCommand(ReservationRequestDto reservationRequestDto, Long userId, Long reservationId); ReservationResponseDto toDto(ReservationInfo reservationInfo); + + ReservationResponseDto toDto(Reservation reservation); + + ReservationResponseDto toDto(Reservation reservation, String customerName, String managerName); + + ManagerReservationResponseDto toDto(Reservation reservation, String customerName, Matching matching); + } diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java index eed90e09..71403b53 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java @@ -1,9 +1,13 @@ package com.homeaid.reservation.dto; +import com.homeaid.matching.domain.Matching; +import com.homeaid.reservation.domain.Reservation; import com.homeaid.reservation.dto.request.ReservationCommand; +import com.homeaid.reservation.dto.response.ManagerReservationResponseDto; import com.homeaid.reservation.dto.response.ReservationInfo; import com.homeaid.reservation.dto.request.ReservationRequestDto; import com.homeaid.reservation.dto.response.ReservationResponseDto; +import java.time.LocalDateTime; import org.springframework.stereotype.Component; @Component @@ -70,5 +74,71 @@ public ReservationResponseDto toDto(ReservationInfo reservationInfo) { .build(); } + @Override + public ReservationResponseDto toDto(Reservation reservation) { + if (reservation == null) { + return null; + } + + return ReservationResponseDto.builder() + .reservationId(reservation.getId()) + .status(reservation.getStatus()) + .totalPrice(reservation.getTotalPrice()) + .totalDuration(reservation.getDuration()) + .serviceOptionName(reservation.getItem().getServiceOptionName()) + .customerId(reservation.getCustomer().getId()) + .managerId(reservation.getManagerId()) + .requestedDate(reservation.getRequestedDate()) + .requestedTime(reservation.getRequestedTime()) + .address(reservation.getAddress()) + .addressDetail(reservation.getAddressDetail()) + .customerMemo(reservation.getCustomerMemo()) + .build(); + } + + @Override + public ReservationResponseDto toDto(Reservation reservation, String customerName, + String managerName) { + + if (reservation == null) { + return null; + } + + return ReservationResponseDto.builder() + .reservationId(reservation.getId()) + .status(reservation.getStatus()) + .totalPrice(reservation.getTotalPrice()) + .totalDuration(reservation.getDuration()) + .serviceOptionName(reservation.getItem().getServiceOptionName()) + .startTime(LocalDateTime.of( + reservation.getRequestedDate(), + reservation.getRequestedTime() + )) + .customerName(customerName) + .matchedManagerName(managerName) + .build(); + } + + @Override + public ManagerReservationResponseDto toDto(Reservation reservation, String customerName, + Matching matching) { + + if (reservation == null) { + return null; + } + + return ManagerReservationResponseDto.builder() + .reservationId(reservation.getId()) + .matchingId(matching.getId()) + .status(reservation.getStatus()) + .serviceOptionName(reservation.getItem().getServiceOptionName()) + .startTime(LocalDateTime.of( + reservation.getRequestedDate(), + reservation.getRequestedTime() + )) + .matchingStatus(matching.getStatus()) + .customerName(customerName) + .build(); + } } diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/request/UpdateReservationRequestDto.java b/reservation/src/main/java/com/homeaid/reservation/dto/request/UpdateReservationRequestDto.java deleted file mode 100644 index 6cec0f1a..00000000 --- a/reservation/src/main/java/com/homeaid/reservation/dto/request/UpdateReservationRequestDto.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.homeaid.reservation.dto.request; - -import com.homeaid.reservation.domain.Reservation; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import java.time.LocalDate; -import java.time.LocalTime; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@Getter -public class UpdateReservationRequestDto { - - @NotNull - @Schema(description = "예약 요청 날짜 (yyyy-MM-dd)", example = "2025-06-10") - private LocalDate requestedDate; - - @NotNull - @Schema(description = "예약 요청 시간 (HH:mm:ss)", example = "14:00:00") - private LocalTime requestedTime; - - - public static Reservation toEntity(ReservationRequestDto reservationRequestDto) { - return Reservation.builder() - .requestedDate(reservationRequestDto.getRequestedDate()) - .requestedTime(reservationRequestDto.getRequestedTime()) - .build(); - } - -} diff --git a/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationResponseDto.java b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationResponseDto.java index 5f214543..037cca16 100644 --- a/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationResponseDto.java +++ b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationResponseDto.java @@ -1,7 +1,6 @@ package com.homeaid.reservation.dto.response; -import com.homeaid.reservation.domain.Reservation; import com.homeaid.matching.controller.enumerate.MatchingStatus; import com.homeaid.reservation.domain.enumerate.ReservationStatus; import io.swagger.v3.oas.annotations.media.Schema; @@ -67,41 +66,4 @@ public class ReservationResponseDto { @Schema(description = "매칭 ID", example = "99") private Long matchingId; - public static ReservationResponseDto toDto(Reservation reservation, String customerName, String managerName) { - return ReservationResponseDto.builder() - .reservationId(reservation.getId()) - .status(reservation.getStatus()) - .totalPrice(reservation.getTotalPrice()) - .totalDuration(reservation.getDuration()) - .serviceOptionName(reservation.getItem().getServiceOptionName()) - .startTime(LocalDateTime.of( - reservation.getRequestedDate(), - reservation.getRequestedTime() - )) - .customerName(customerName) - .matchedManagerName(managerName) - .build(); - } - - public static ReservationResponseDto toDto(Reservation reservation, MatchingStatus matchingStatus, String managerName, Long matchingId) { - return ReservationResponseDto.builder() - .reservationId(reservation.getId()) - .status(reservation.getStatus()) - .totalPrice(reservation.getTotalPrice()) - .totalDuration(reservation.getDuration()) - .serviceOptionName(reservation.getItem().getServiceOptionName()) - .customerId(reservation.getCustomer().getId()) - .startTime(LocalDateTime.of( - reservation.getRequestedDate(), - reservation.getRequestedTime() - )) - .matchedManagerName(managerName) - .address(reservation.getAddress()) - .addressDetail(reservation.getAddressDetail()) - .matchingStatus(matchingStatus) - .matchingId(matchingId) - .build(); - } - - } diff --git a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java index 383e779d..32590cda 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -11,6 +11,7 @@ import com.homeaid.reservation.domain.enumerate.ReservationStatus; import com.homeaid.domain.enumerate.UserRole; import com.homeaid.dto.RequestAlert; +import com.homeaid.reservation.dto.ReservationDtoMapper; import com.homeaid.reservation.dto.request.ReservationCommand; import com.homeaid.reservation.dto.response.ManagerReservationResponseDto; import com.homeaid.reservation.dto.response.ReservationInfo; @@ -38,6 +39,8 @@ public class ReservationServiceImpl implements ReservationService { private final ReservationReader reservationReader; + private final ReservationDtoMapper reservationDtoMapper; + private final NotificationPublisher notificationPublisher; @Override @@ -100,7 +103,7 @@ public Page getReservations(Pageable pageable, Reservati managerName = latestMatching.getManager().getName(); } - return ReservationResponseDto.toDto(reservation, reservation.getCustomer().getName(), + return reservationDtoMapper.toDto(reservation, reservation.getCustomer().getName(), managerName); }); } @@ -116,7 +119,8 @@ public Page getReservationsByCustomer(Long userId, Pageable pageabl public Page getReservationsByManager(Long managerId, Pageable pageable) { - Page reservations = reservationReader.getReservationsByManagerId(managerId, pageable); + Page reservations = reservationReader.getReservationsByManagerId(managerId, + pageable); Map customerMap = getCustomersFromReservations(reservations); @@ -132,7 +136,7 @@ public Page getReservationsByManager(Long manager Matching matching = getLatestMatching(reservation).get(); - return ManagerReservationResponseDto.toDto(reservation, customer.getName(), matching); + return reservationDtoMapper.toDto(reservation, customer.getName(), matching); }); }