Skip to content

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -18,4 +17,8 @@ public Cabinet(CabinetStatus status) {
public void id(Long id) {
this.cabinetId = id;
}

public void changeStatus(CabinetStatus status) {
this.cabinetStatus = status;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.example.lent.domain;

public class CabinetConfig {

public static final int LENDING_PERIOD = 31;
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
@@ -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<LentHistory> findAll();
Expand Down
Original file line number Diff line number Diff line change
@@ -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<LentHistory> 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<LentHistory> findAll() {
return null;
return List.copyOf(TABLE);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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<LentHistory> 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<LentHistory> 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<LentHistory> 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());
}
}