diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentServiceImpl.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentServiceImpl.java" deleted file mode 100644 index 4ecff32..0000000 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentServiceImpl.java" +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.lent; - -import com.example.lent.dto.LentRequest; -import com.example.lent.dto.LentResponse; - -/*서비스는 뭘까요?*/ -public class LentServiceImpl implements LentService { - @Override - public LentResponse lent(LentRequest request) { - return null; - } -} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentController.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/controller/LentController.java" similarity index 54% rename from "v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentController.java" rename to "v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/controller/LentController.java" index be46233..7abec81 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentController.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/controller/LentController.java" @@ -1,14 +1,18 @@ -package com.example.lent; +package com.example.lent.controller; import com.example.lent.dto.LentRequest; import com.example.lent.dto.LentResponse; +import com.example.lent.service.LentService; +import lombok.RequiredArgsConstructor; /*컨트롤러는 뭘까요?*/ /*컨트롤러는 왜 인터페이스가 없어도 될까요?*/ +@RequiredArgsConstructor public class LentController { - private LentService lentService; + + private final LentService lentService; public LentResponse lent(LentRequest request) { - return null; + return lentService.lent(request); } } diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/Cabinet.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/Cabinet.java" index d86aa42..69d62a1 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/Cabinet.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/Cabinet.java" @@ -1,12 +1,11 @@ package com.example.lent.domain; -import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; /*Entity가 뭘까요?*/ @Getter public class Cabinet { + private Long cabinetId; private CabinetStatus cabinetStatus; @@ -18,4 +17,8 @@ public Cabinet(CabinetStatus status) { public void id(Long id) { this.cabinetId = id; } + + public void changeStatus(CabinetStatus status) { + this.cabinetStatus = status; + } } diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/CabinetConfig.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/CabinetConfig.java" new file mode 100644 index 0000000..59e8d3e --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/CabinetConfig.java" @@ -0,0 +1,6 @@ +package com.example.lent.domain; + +public class CabinetConfig { + + public static final int LENDING_PERIOD = 31; +} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/LentHistory.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/LentHistory.java" index d7f3169..63e84c1 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/LentHistory.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/domain/LentHistory.java" @@ -1,26 +1,29 @@ package com.example.lent.domain; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - import java.time.LocalDateTime; +import lombok.Getter; /*Entity가 뭘까요?*/ @Getter public class LentHistory { + + private final Long userId; + private final Long cabinetId; + private final String lentUserName; + private final LocalDateTime createdAt; + private final LocalDateTime expiredAt; private Long lentHistoryId; - private Long userId; - private Long cabinetId; - private String lentUserName; - private LocalDateTime createdAt; - private LocalDateTime expiredAt; - public LentHistory(Long cabinetId, Long userId, String lentUserName, LocalDateTime createdAt, LocalDateTime expiredAt) { + public LentHistory(Long cabinetId, Long userId, String lentUserName, LocalDateTime createdAt, + LocalDateTime expiredAt) { this.cabinetId = cabinetId; this.userId = userId; this.lentUserName = lentUserName; this.createdAt = createdAt; this.expiredAt = expiredAt; } + + public void setId(Long id) { + this.lentHistoryId = id; + } } diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/CabinetAlreadyLentException.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/CabinetAlreadyLentException.java" new file mode 100644 index 0000000..7f11032 --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/CabinetAlreadyLentException.java" @@ -0,0 +1,10 @@ +package com.example.lent.exception; + +import static com.example.lent.exception.ExceptionMessages.CABINET_ALREADY_LENT; + +public class CabinetAlreadyLentException extends RuntimeException { + + public CabinetAlreadyLentException() { + super(CABINET_ALREADY_LENT.getMessage()); + } +} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/CabinetNotExistException.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/CabinetNotExistException.java" new file mode 100644 index 0000000..b4583ce --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/CabinetNotExistException.java" @@ -0,0 +1,10 @@ +package com.example.lent.exception; + +import static com.example.lent.exception.ExceptionMessages.CABINET_NOT_EXIST; + +public class CabinetNotExistException extends RuntimeException { + + public CabinetNotExistException() { + super(CABINET_NOT_EXIST.getMessage()); + } +} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/ExceptionMessages.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/ExceptionMessages.java" new file mode 100644 index 0000000..58d02d2 --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/ExceptionMessages.java" @@ -0,0 +1,18 @@ +package com.example.lent.exception; + +public enum ExceptionMessages { + CABINET_ALREADY_LENT("이미 사용 중인 사물함입니다."), + USER_ALREADY_LENT("이미 대여 중인 유저입니다."), + USER_BANNED("사용 정지상태인 유저입니다."), + CABINET_NOT_EXIST("해당 사물함을 찾을 수 없습니다."); + + private final String message; + + ExceptionMessages(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/UserAlreadyLentException.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/UserAlreadyLentException.java" new file mode 100644 index 0000000..86693c5 --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/UserAlreadyLentException.java" @@ -0,0 +1,10 @@ +package com.example.lent.exception; + +import static com.example.lent.exception.ExceptionMessages.USER_ALREADY_LENT; + +public class UserAlreadyLentException extends RuntimeException { + + public UserAlreadyLentException() { + super(USER_ALREADY_LENT.getMessage()); + } +} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/UserBannedException.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/UserBannedException.java" new file mode 100644 index 0000000..d651591 --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/exception/UserBannedException.java" @@ -0,0 +1,10 @@ +package com.example.lent.exception; + +import static com.example.lent.exception.ExceptionMessages.USER_BANNED; + +public class UserBannedException extends RuntimeException { + + public UserBannedException() { + super(USER_BANNED.getMessage()); + } +} diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepository.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepository.java" similarity index 83% rename from "v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepository.java" rename to "v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepository.java" index 534a121..7208fcf 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepository.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepository.java" @@ -1,10 +1,10 @@ -package com.example.lent; +package com.example.lent.repository; import com.example.lent.domain.LentHistory; - import java.util.List; public interface LentHistoryRepository { + LentHistory save(LentHistory lentHistory); List findAll(); diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepositoryImpl.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepositoryImpl.java" similarity index 73% rename from "v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepositoryImpl.java" rename to "v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepositoryImpl.java" index 96cff00..daf90a8 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentHistoryRepositoryImpl.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/repository/LentHistoryRepositoryImpl.java" @@ -1,23 +1,25 @@ -package com.example.lent; +package com.example.lent.repository; import com.example.lent.domain.LentHistory; - import java.util.ArrayList; import java.util.List; /*리포지토리는 뭘까요?*/ public class LentHistoryRepositoryImpl implements LentHistoryRepository { - private static Long ID_SEQUENCE = 1L; + /*실제 DB를 사용하지 않으므로 내부 Collection으로 대체합니다. - Collection이 뭘까요?*/ private static final List TABLE = new ArrayList<>(); + private Long ID_SEQUENCE = 1L; @Override public LentHistory save(LentHistory lentHistory) { - return null; + lentHistory.setId(ID_SEQUENCE++); + TABLE.add(lentHistory); + return lentHistory; } @Override public List findAll() { - return null; + return List.copyOf(TABLE); } } diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentService.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentService.java" similarity index 81% rename from "v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentService.java" rename to "v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentService.java" index 1892b70..fea3af2 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/LentService.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentService.java" @@ -1,8 +1,9 @@ -package com.example.lent; +package com.example.lent.service; import com.example.lent.dto.LentRequest; import com.example.lent.dto.LentResponse; public interface LentService { + LentResponse lent(LentRequest request); } diff --git "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentServiceImpl.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentServiceImpl.java" new file mode 100644 index 0000000..918e349 --- /dev/null +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/main/java/com/example/lent/service/LentServiceImpl.java" @@ -0,0 +1,84 @@ +package com.example.lent.service; + +import static com.example.lent.domain.CabinetConfig.LENDING_PERIOD; + +import com.example.lent.domain.Cabinet; +import com.example.lent.domain.CabinetStatus; +import com.example.lent.domain.LentHistory; +import com.example.lent.domain.User; +import com.example.lent.dto.LentRequest; +import com.example.lent.dto.LentResponse; +import com.example.lent.exception.CabinetAlreadyLentException; +import com.example.lent.exception.CabinetNotExistException; +import com.example.lent.exception.UserAlreadyLentException; +import com.example.lent.exception.UserBannedException; +import com.example.lent.repository.LentHistoryRepository; +import com.example.lent.testutil.CabinetRepository; +import com.example.lent.testutil.UserRepository; +import java.util.List; +import lombok.RequiredArgsConstructor; + +/*서비스는 뭘까요?*/ +@RequiredArgsConstructor +public class LentServiceImpl implements LentService { + + private final LentHistoryRepository lentHistoryRepository; + private final CabinetRepository cabinetRepository; + private final UserRepository userRepository; + + private static void checkCabinetAvailabilityAndUserStatus(Cabinet findCabinet, + List lentHistoryList, + User findUser) { + // 사물함의 상태가 사용중인 경우 + if (findCabinet.getCabinetStatus() == CabinetStatus.FULL) { + throw new CabinetAlreadyLentException(); + } + + // 유저가 현재 사물함을 대여중인 경우 + if (isUserLent(lentHistoryList, findUser)) { + throw new UserAlreadyLentException(); + } + + // 사용 정지 상태인 유저인 경우 + if (findUser.isBanned()) { + throw new UserBannedException(); + } + } + + private static boolean isUserLent(List lentHistoryList, User findUser) { + return lentHistoryList.stream() + .findFirst() + .filter(lentHistory -> lentHistory.getLentUserName() == findUser.getName()) + .isPresent(); + } + + @Override + public LentResponse lent(LentRequest request) { + Cabinet findCabinet = cabinetRepository.findAll() + .stream() + .filter(cabinet -> cabinet.getCabinetId() == request.getCabinetId()) + .findFirst() + .orElseThrow(() -> new CabinetNotExistException()); + + User findUser = userRepository.findById(request.getUserId()); + List lentHistoryList = lentHistoryRepository.findAll(); + + checkCabinetAvailabilityAndUserStatus(findCabinet, lentHistoryList, findUser); + + findCabinet.changeStatus(CabinetStatus.FULL); + cabinetRepository.save(findCabinet); + + LentHistory lentHistory = lentHistoryRepository.save(new LentHistory( + findCabinet.getCabinetId(), + findUser.getUserId(), + findUser.getName(), + request.getCreatedAt(), + request.getCreatedAt().plusDays(LENDING_PERIOD))); + + return new LentResponse(lentHistory.getLentHistoryId(), + lentHistory.getCabinetId(), + findUser.getName(), + lentHistory.getCreatedAt(), + lentHistory.getExpiredAt()); + } +}