From 8c6d22e75ca39f2143ca2f7c7d6d8eb690b50eb3 Mon Sep 17 00:00:00 2001 From: chaerlo127 Date: Fri, 1 Dec 2023 03:04:46 +0900 Subject: [PATCH] =?UTF-8?q?[PDS-213]=20fix:=20=EA=B8=B0=ED=9A=8D=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=ED=83=88=ED=87=B4=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/carBooking/CarBookingCustom.java | 1 + .../carBooking/CarBookingRepositoryImpl.java | 15 +++++++++++++++ .../global/entityListener/UserEntityListener.java | 4 ++++ .../global/exception/BaseResponseCode.java | 2 ++ .../product/car/repository/CarRepository.java | 2 ++ .../resource/repository/ResourceRepository.java | 3 +++ .../user/controller/AdminUserController.java | 1 + .../user/controller/UserController.java | 1 + .../pladialmserver/user/service/UserService.java | 7 +++++++ 9 files changed, 36 insertions(+) diff --git a/src/main/java/com/example/pladialmserver/booking/repository/carBooking/CarBookingCustom.java b/src/main/java/com/example/pladialmserver/booking/repository/carBooking/CarBookingCustom.java index 0f52e2bc..79db58c5 100644 --- a/src/main/java/com/example/pladialmserver/booking/repository/carBooking/CarBookingCustom.java +++ b/src/main/java/com/example/pladialmserver/booking/repository/carBooking/CarBookingCustom.java @@ -25,4 +25,5 @@ public interface CarBookingCustom { List getBookedTime(Car car, LocalDate date); List findCarBookingByDate(Car car, LocalDate date); + void updateBookingStatusForResigning(User user); } diff --git a/src/main/java/com/example/pladialmserver/booking/repository/carBooking/CarBookingRepositoryImpl.java b/src/main/java/com/example/pladialmserver/booking/repository/carBooking/CarBookingRepositoryImpl.java index 2ee43a98..6c13172b 100644 --- a/src/main/java/com/example/pladialmserver/booking/repository/carBooking/CarBookingRepositoryImpl.java +++ b/src/main/java/com/example/pladialmserver/booking/repository/carBooking/CarBookingRepositoryImpl.java @@ -14,6 +14,7 @@ import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import javax.persistence.EntityManager; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -28,6 +29,7 @@ @RequiredArgsConstructor public class CarBookingRepositoryImpl implements CarBookingCustom { private final JPAQueryFactory jpaQueryFactory; + private final EntityManager entityManager; @Override public boolean existsDateTime(Car car, LocalDateTime startDateTime, LocalDateTime endDateTime) { @@ -210,4 +212,17 @@ public List findCarBookingByDate(Car car, LocalDate standardD return bookings.stream().map(ProductBookingRes::toDto).collect(Collectors.toList()); } + + // 회원 탈퇴를 위한 예약 상태 변경 + @Override + public void updateBookingStatusForResigning(User user) { + jpaQueryFactory.update(carBooking) + .set(carBooking.status, BookingStatus.CANCELED) + .where(carBooking.user.eq(user) + .and(carBooking.status.in(BookingStatus.WAITING, BookingStatus.BOOKED, BookingStatus.USING))) + .execute(); + + // 영속성 컨텍스트를 DB 에 즉시 반영 + entityManager.flush(); + } } diff --git a/src/main/java/com/example/pladialmserver/global/entityListener/UserEntityListener.java b/src/main/java/com/example/pladialmserver/global/entityListener/UserEntityListener.java index 3817eebd..fc916d75 100644 --- a/src/main/java/com/example/pladialmserver/global/entityListener/UserEntityListener.java +++ b/src/main/java/com/example/pladialmserver/global/entityListener/UserEntityListener.java @@ -1,5 +1,6 @@ package com.example.pladialmserver.global.entityListener; +import com.example.pladialmserver.booking.repository.carBooking.CarBookingRepository; import com.example.pladialmserver.booking.repository.officeBooking.OfficeBookingRepository; import com.example.pladialmserver.booking.repository.resourceBooking.ResourceBookingRepository; import com.example.pladialmserver.global.utils.BeanUtil; @@ -16,5 +17,8 @@ public void onUpdate(User user){ // 자원 예약 확인 및 예약 취소 ResourceBookingRepository resourceBookingRepository = BeanUtil.getBean(ResourceBookingRepository.class); resourceBookingRepository.updateBookingStatusForResigning(user); + // 차량 예약 확인 및 예약 취소 + CarBookingRepository carBookingRepository = BeanUtil.getBean(CarBookingRepository.class); + carBookingRepository.updateBookingStatusForResigning(user); } } diff --git a/src/main/java/com/example/pladialmserver/global/exception/BaseResponseCode.java b/src/main/java/com/example/pladialmserver/global/exception/BaseResponseCode.java index 2bfca83c..28046c29 100644 --- a/src/main/java/com/example/pladialmserver/global/exception/BaseResponseCode.java +++ b/src/main/java/com/example/pladialmserver/global/exception/BaseResponseCode.java @@ -49,6 +49,8 @@ public enum BaseResponseCode { EXISTS_PHONE("U0019", HttpStatus.CONFLICT, "존재하는 휴대폰번호입니다."), NOT_EMPTY_AFFILIATION("U0020", HttpStatus.BAD_REQUEST, "소속을 입력해주세요."), AFFILIATION_NOT_FOUND("U0021", HttpStatus.NOT_FOUND, "소속을 찾을 수 없습니다."), + EXISTS_CAR_AMDIN_USER("U0022", HttpStatus.BAD_REQUEST, "차량을 관리하는 직원입니다. 관리자를 변경해주세요."), + EXISTS_RESOURCE_AMDIN_USER("U0023", HttpStatus.BAD_REQUEST, "장비을 관리하는 직원입니다. 관리자를 변경해주세요."), // Booking DATE_OR_TIME_IS_NULL("B0001", HttpStatus.BAD_REQUEST, "날짜와 시간을 모두 입력해주세요."), diff --git a/src/main/java/com/example/pladialmserver/product/car/repository/CarRepository.java b/src/main/java/com/example/pladialmserver/product/car/repository/CarRepository.java index c0e5e4c1..aef554d4 100644 --- a/src/main/java/com/example/pladialmserver/product/car/repository/CarRepository.java +++ b/src/main/java/com/example/pladialmserver/product/car/repository/CarRepository.java @@ -1,6 +1,7 @@ package com.example.pladialmserver.product.car.repository; import com.example.pladialmserver.product.car.entity.Car; +import com.example.pladialmserver.user.entity.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -26,4 +27,5 @@ public interface CarRepository extends JpaRepository,CarCustom { Page findAllByIsEnableTrueAndIsActiveTrue(Pageable pageable); Optional findByCarIdAndIsEnable(Long carId, boolean isEnable); + Boolean existsByUserAndIsEnable(User user, Boolean isEnable); } diff --git a/src/main/java/com/example/pladialmserver/product/resource/repository/ResourceRepository.java b/src/main/java/com/example/pladialmserver/product/resource/repository/ResourceRepository.java index 4e484c28..ae16bafc 100644 --- a/src/main/java/com/example/pladialmserver/product/resource/repository/ResourceRepository.java +++ b/src/main/java/com/example/pladialmserver/product/resource/repository/ResourceRepository.java @@ -1,6 +1,7 @@ package com.example.pladialmserver.product.resource.repository; import com.example.pladialmserver.product.resource.entity.Resource; +import com.example.pladialmserver.user.entity.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -32,4 +33,6 @@ public interface ResourceRepository extends JpaRepository, Resou "WHERE r.isEnable = true AND r.isActive = true") Page findAllByIsEnableTrueAndIsActiveTrue(Pageable pageable); + Boolean existsByUserAndIsEnable(User user, Boolean isEnable); + } diff --git a/src/main/java/com/example/pladialmserver/user/controller/AdminUserController.java b/src/main/java/com/example/pladialmserver/user/controller/AdminUserController.java index 79a0ae91..3c51258a 100644 --- a/src/main/java/com/example/pladialmserver/user/controller/AdminUserController.java +++ b/src/main/java/com/example/pladialmserver/user/controller/AdminUserController.java @@ -100,6 +100,7 @@ public ResponseCustom getUserInfo(@Account User user, @Operation(summary = "직원 탈퇴 (장채은)", description = "직원을 탈퇴 시킨다.") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "(S0001)직원 탈퇴 성공"), + @ApiResponse(responseCode = "400", description = "(U0022)차량을 관리하는 직원입니다. 관리자를 변경해주세요.\n (U0023)장비을 관리하는 직원입니다. 관리자를 변경해주세요."), @ApiResponse(responseCode = "403", description = "(G0002)접근 권한이 없습니다.", content = @Content(schema = @Schema(implementation = ResponseCustom.class))), @ApiResponse(responseCode = "404", description = "(U0001)사용자를 찾을 수 없습니다.[관리자 및 직원 모두]", content = @Content(schema = @Schema(implementation = ResponseCustom.class))) }) diff --git a/src/main/java/com/example/pladialmserver/user/controller/UserController.java b/src/main/java/com/example/pladialmserver/user/controller/UserController.java index 36a04d0b..90be3a60 100644 --- a/src/main/java/com/example/pladialmserver/user/controller/UserController.java +++ b/src/main/java/com/example/pladialmserver/user/controller/UserController.java @@ -127,6 +127,7 @@ public ResponseCustom getResponsibilityList( @Operation(summary = "직원 탈퇴 (장채은)", description = "직원을 탈퇴한다.") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "(S0001)직원 탈퇴 성공"), + @ApiResponse(responseCode = "400", description = "(U0022)차량을 관리하는 직원입니다. 관리자를 변경해주세요.\n (U0023)장비을 관리하는 직원입니다. 관리자를 변경해주세요."), @ApiResponse(responseCode = "404", description = "(U0001)사용자를 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ResponseCustom.class))) }) @DeleteMapping("") diff --git a/src/main/java/com/example/pladialmserver/user/service/UserService.java b/src/main/java/com/example/pladialmserver/user/service/UserService.java index 97a0ff26..db933d4f 100644 --- a/src/main/java/com/example/pladialmserver/user/service/UserService.java +++ b/src/main/java/com/example/pladialmserver/user/service/UserService.java @@ -6,6 +6,8 @@ import com.example.pladialmserver.global.utils.JwtUtil; import com.example.pladialmserver.notification.entity.PushNotification; import com.example.pladialmserver.notification.repository.PushNotificationRepository; +import com.example.pladialmserver.product.car.repository.CarRepository; +import com.example.pladialmserver.product.resource.repository.ResourceRepository; import com.example.pladialmserver.user.dto.TokenDto; import com.example.pladialmserver.user.dto.request.*; import com.example.pladialmserver.user.dto.response.DepartmentListDto; @@ -42,6 +44,8 @@ public class UserService { private final UserRepository userRepository; private final DepartmentRepository departmentRepository; private final PushNotificationRepository notificationRepository; + private final CarRepository carRepository; + private final ResourceRepository resourceRepository; private final AffiliationRepository affiliationRepository; private final PasswordEncoder passwordEncoder; private final JwtUtil jwtUtil; @@ -116,6 +120,9 @@ public ResponsibilityListRes getResponsibilityList(String name) { } // 직원 접근 탈퇴 public void resignUser(User user) { + // 탈회하려는 회원이 장비, 차량 관리자인 경우 애러처리 + if (resourceRepository.existsByUserAndIsEnable(user, true)) throw new BaseException(EXISTS_RESOURCE_AMDIN_USER); + if (carRepository.existsByUserAndIsEnable(user, true)) throw new BaseException(EXISTS_CAR_AMDIN_USER); jwtUtil.deleteRefreshToken(user.getUserId()); userRepository.delete(user); }