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/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/controller/ReservationController.java b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java index 56f7aaf3..d6b6a5f5 100644 --- a/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java +++ b/reservation/src/main/java/com/homeaid/reservation/controller/ReservationController.java @@ -4,9 +4,10 @@ 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; import com.homeaid.reservation.dto.response.ReservationResponseDto; import com.homeaid.auth.user.CustomUserDetails; @@ -45,22 +46,25 @@ public class ReservationController { private final ReservationService reservationService; + private final ReservationDtoMapper reservationDtoMapper; + + @PostMapping @Operation(summary = "예약 생성", description = "고객이 예약 옵션을 선택하여 예약을 생성합니다.") @ApiResponse(responseCode = "201", description = "예약 생성 성공", 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()); + 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}") @@ -71,13 +75,13 @@ 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( - CommonApiResponse.success(reservationService.getReservation(reservationId))); + CommonApiResponse.success(reservationDtoMapper.toDto(reservationService.getReservation(reservationId)))); } @PutMapping("/{reservationId}") @@ -88,19 +92,16 @@ 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( - 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}") @@ -114,7 +115,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 +126,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 +145,21 @@ 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); + PagedResponseDto.fromPage(reservations, reservationDtoMapper::toDto); + return ResponseEntity.ok(CommonApiResponse.success(response)); } @@ -163,17 +168,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/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/ReservationReader.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java new file mode 100644 index 00000000..7d5c8d05 --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReader.java @@ -0,0 +1,18 @@ +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); + + 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 new file mode 100644 index 00000000..1e546849 --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationReaderImpl.java @@ -0,0 +1,45 @@ +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 +@Slf4j +@RequiredArgsConstructor +public class ReservationReaderImpl implements ReservationReader { + + private final ReservationRepository reservationRepository; + + @Override + public Reservation getReservation(Long reservationId) { + return getReservationById(reservationId); + } + + @Override + public Page getReservationByStatus(ReservationStatus status, Pageable pageable) { + 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/domain/ReservationStore.java b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java new file mode 100644 index 00000000..2091aa3f --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStore.java @@ -0,0 +1,12 @@ +package com.homeaid.reservation.domain; + +import com.homeaid.reservation.dto.request.ReservationCommand; + +public interface ReservationStore { + + Reservation save(ReservationCommand reservationCommand); + + 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 new file mode 100644 index 00000000..834e1d96 --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/domain/ReservationStoreImpl.java @@ -0,0 +1,95 @@ +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.domain.enumerate.ReservationStatus; +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); + + log.info("[예약 생성] customerId={}, serviceOptionId={}", reservationCommand.getUserId(), + reservationCommand.getOptionId()); + + 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; + } + + @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)); + } + + 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 new file mode 100644 index 00000000..9fc246dd --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapper.java @@ -0,0 +1,26 @@ +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; + +public interface ReservationDtoMapper { + + ReservationCommand toCommand(ReservationRequestDto reservationRequestDto, Long userId); + + 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 new file mode 100644 index 00000000..71403b53 --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/dto/ReservationDtoMapperImpl.java @@ -0,0 +1,144 @@ +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 +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 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) { + 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()) + .matchingStatus(reservationInfo.getMatchingStatus()) + .matchedManagerName(reservationInfo.getManagerName()) + .matchingId(reservationInfo.getMatchingId()) + .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/ReservationCommand.java b/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationCommand.java new file mode 100644 index 00000000..4b9ffe0b --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/dto/request/ReservationCommand.java @@ -0,0 +1,35 @@ +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; + private final Long reservationId; + + 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/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/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/dto/response/ReservationInfo.java b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationInfo.java new file mode 100644 index 00000000..5f212fbb --- /dev/null +++ b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationInfo.java @@ -0,0 +1,91 @@ +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; + 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; + private final MatchingStatus matchingStatus; + private final String managerName; + private final Long matchingId; + + 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/dto/response/ReservationResponseDto.java b/reservation/src/main/java/com/homeaid/reservation/dto/response/ReservationResponseDto.java index 4d5e6884..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,57 +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(); - } - - 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..9ab1cdd0 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,11 +13,11 @@ public interface ReservationService { - Reservation createReservation(Reservation reservation, Long userId, Long serviceOptionId); + ReservationInfo createReservation(ReservationCommand reservationCommand); - ReservationResponseDto getReservation(Long reservationId); + ReservationInfo getReservation(Long reservationId); - Reservation updateReservation(Long reservationId, Long userId, Reservation reservation, Long serviceOptionId); + ReservationInfo updateReservation(ReservationCommand reservationCommand); Page getReservations(Pageable pageable, ReservationStatus status); @@ -25,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 675d2889..32590cda 100644 --- a/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java +++ b/reservation/src/main/java/com/homeaid/reservation/service/ReservationServiceImpl.java @@ -4,26 +4,24 @@ 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; +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.ReservationDtoMapper; +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; 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; @@ -37,105 +35,65 @@ @Slf4j public class ReservationServiceImpl implements ReservationService { - private final ReservationRepository reservationRepository; + private final ReservationStore reservationStore; - private final CustomerRepository customerRepository; + private final ReservationReader reservationReader; - - private final ServiceOptionRepository serviceOptionRepository; + private final ReservationDtoMapper reservationDtoMapper; 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) { + 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 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); String managerName = null; MatchingStatus status = null; Long matchingId = null; + if (latestMatching != null) { managerName = latestMatching.getManager().getName(); status = latestMatching.getStatus(); matchingId = latestMatching.getId(); } - return ReservationResponseDto.toDto(reservation, status, managerName, matchingId); + return ReservationInfo.toInfo(reservation, status, managerName, matchingId); } @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 ReservationInfo.toInfo(reservationStore.update(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 @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 -> { @@ -145,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); }); } @@ -153,19 +111,22 @@ 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(), @@ -175,42 +136,36 @@ public Page getReservationsByManager(Long manager Matching matching = getLatestMatching(reservation).get(); - return ManagerReservationResponseDto.toDto(reservation, customer, matching); + return reservationDtoMapper.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)); + @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()); @@ -219,16 +174,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(); } 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 09800c0d..9f05dbdf 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 @@ -129,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); }