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..3d42c5d 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,17 @@ -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..afb39a7 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" @@ -18,4 +18,16 @@ public Cabinet(CabinetStatus status) { public void id(Long id) { this.cabinetId = id; } + + public boolean isAvailable() { + return this.cabinetStatus == CabinetStatus.AVAILABLE; + } + + public void lent() { + this.cabinetStatus = CabinetStatus.FULL; + } + + public void returned() { + this.cabinetStatus = CabinetStatus.AVAILABLE; + } } 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..a70f62a 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" @@ -23,4 +23,8 @@ public LentHistory(Long cabinetId, Long userId, String lentUserName, LocalDateTi this.createdAt = createdAt; this.expiredAt = expiredAt; } + + public void id(Long lentHistoryId) { + this.lentHistoryId = lentHistoryId; + } } 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..b9799db 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,4 +1,4 @@ -package com.example.lent; +package com.example.lent.repository; import com.example.lent.domain.LentHistory; 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 64% 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..e3854b2 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,4 +1,4 @@ -package com.example.lent; +package com.example.lent.repository; import com.example.lent.domain.LentHistory; @@ -13,11 +13,18 @@ public class LentHistoryRepositoryImpl implements LentHistoryRepository { @Override public LentHistory save(LentHistory lentHistory) { - return null; + if (lentHistory.getLentHistoryId() != null) { + TABLE.removeIf(e -> e.getLentHistoryId().equals(lentHistory.getLentHistoryId())); + } else { + lentHistory.id(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 82% 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..3c92487 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,4 +1,4 @@ -package com.example.lent; +package com.example.lent.service; import com.example.lent.dto.LentRequest; import com.example.lent.dto.LentResponse; 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..15d4815 --- /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,72 @@ +package com.example.lent.service; + +import com.example.lent.domain.Cabinet; +import com.example.lent.domain.LentHistory; +import com.example.lent.dto.LentRequest; +import com.example.lent.dto.LentResponse; +import com.example.lent.repository.LentHistoryRepository; +import com.example.lent.testutil.CabinetRepository; +import com.example.lent.testutil.UserRepository; +import lombok.RequiredArgsConstructor; + +/*서비스는 뭘까요?*/ +@RequiredArgsConstructor +public class LentServiceImpl implements LentService { + private static final int LENT_PERIOD = 31; + + private final LentHistoryRepository lentHistoryRepository; + private final CabinetRepository cabinetRepository; + private final UserRepository userRepository; + + @Override + public LentResponse lent(LentRequest request) { + if (isBannedUser(request.getUserId())) { + throw new RuntimeException("사용 정지상태인 유저입니다."); + } + if (isAlreadyLent(request.getCabinetId())) { + throw new RuntimeException("이미 사용 중인 사물함입니다."); + } + if (isAlreadyLentUser(request.getUserId())) { + throw new RuntimeException("이미 대여 중인 유저입니다."); + } + + Cabinet cabinet = cabinetRepository.findAll().stream() + .filter(e -> e.getCabinetId().equals(request.getCabinetId())) + .findAny() + .orElseThrow(() -> new RuntimeException("존재하지 않는 사물함입니다.")); + cabinet.lent(); + LentHistory lentHistory = new LentHistory( + request.getCabinetId(), + request.getUserId(), + userRepository.findById(request.getUserId()).getName(), + request.getCreatedAt(), + request.getCreatedAt().plusDays(LENT_PERIOD) + ); + lentHistoryRepository.save(lentHistory); + + return new LentResponse( + lentHistory.getLentHistoryId(), + lentHistory.getCabinetId(), + lentHistory.getLentUserName(), + lentHistory.getCreatedAt(), + lentHistory.getExpiredAt() + ); + } + + private boolean isBannedUser(Long userId) { + return userRepository.findById(userId).isBanned(); + } + + private boolean isAlreadyLent(Long cabinetId) { + Cabinet cabinet = cabinetRepository.findAll().stream() + .filter(e -> e.getCabinetId().equals(cabinetId)) + .findAny() + .orElse(null); + return (cabinet != null && !cabinet.isAvailable()); + } + + private boolean isAlreadyLentUser(Long userId) { + return lentHistoryRepository.findAll().stream() + .anyMatch(e -> e.getUserId().equals(userId)); + } +} 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/test/java/com/example/lent/LentTest.java" "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/test/java/com/example/lent/LentTest.java" index 7b0211c..340af7e 100644 --- "a/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/test/java/com/example/lent/LentTest.java" +++ "b/v1/backend/SPRING_LV_2_\352\260\234\353\205\270\353\213\265_3\352\263\204\354\270\265/src/test/java/com/example/lent/LentTest.java" @@ -1,11 +1,16 @@ package com.example.lent; +import com.example.lent.controller.LentController; 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.repository.LentHistoryRepository; +import com.example.lent.repository.LentHistoryRepositoryImpl; +import com.example.lent.service.LentService; +import com.example.lent.service.LentServiceImpl; import com.example.lent.testutil.CabinetRepository; import com.example.lent.testutil.UserRepository; import org.junit.jupiter.api.BeforeEach;