Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/main/java/cleancode/studycafe/asis/StudyCafeApplication.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
package cleancode.studycafe.asis;

import cleancode.studycafe.asis.io.provider.LockerPassFileReader;
import cleancode.studycafe.asis.io.provider.SeatPassFileReader;
import cleancode.studycafe.asis.provider.LockerPassProvider;
import cleancode.studycafe.asis.provider.SeatPassProvider;

public class StudyCafeApplication {

public static void main(String[] args) {
StudyCafePassMachine studyCafePassMachine = new StudyCafePassMachine();
SeatPassProvider seatPassProvider = new SeatPassFileReader();
LockerPassProvider lockerPassProvider = new LockerPassFileReader();

StudyCafePassMachine studyCafePassMachine = new StudyCafePassMachine(
seatPassProvider, lockerPassProvider
);
studyCafePassMachine.run();
}

Expand Down
129 changes: 65 additions & 64 deletions src/main/java/cleancode/studycafe/asis/StudyCafePassMachine.java
Original file line number Diff line number Diff line change
@@ -1,81 +1,82 @@
package cleancode.studycafe.asis;

import cleancode.studycafe.asis.exception.AppException;
import cleancode.studycafe.asis.io.InputHandler;
import cleancode.studycafe.asis.io.OutputHandler;
import cleancode.studycafe.asis.io.StudyCafeFileHandler;
import cleancode.studycafe.asis.model.StudyCafeLockerPass;
import cleancode.studycafe.asis.model.StudyCafePass;
import cleancode.studycafe.asis.model.StudyCafePassType;
import cleancode.studycafe.asis.io.StudyCafeIOHandler;
import cleancode.studycafe.asis.model.order.StudyCafePassOrder;
import cleancode.studycafe.asis.model.pass.*;
import cleancode.studycafe.asis.model.pass.locker.StudyCafeLockerPass;
import cleancode.studycafe.asis.model.pass.locker.StudyCafeLockerPasses;
import cleancode.studycafe.asis.provider.LockerPassProvider;
import cleancode.studycafe.asis.provider.SeatPassProvider;

import java.util.List;
import java.util.Optional;

public class StudyCafePassMachine {

private final InputHandler inputHandler = new InputHandler();
private final OutputHandler outputHandler = new OutputHandler();
private final StudyCafeIOHandler ioHandler = new StudyCafeIOHandler();
private final SeatPassProvider seatPassProvider;
private final LockerPassProvider lockerPassProvider;

public StudyCafePassMachine(SeatPassProvider seatPassProvider, LockerPassProvider lockerPassProvider) {
this.seatPassProvider = seatPassProvider;
this.lockerPassProvider = lockerPassProvider;
}

public void run() {
try {
outputHandler.showWelcomeMessage();
outputHandler.showAnnouncement();

outputHandler.askPassTypeSelection();
StudyCafePassType studyCafePassType = inputHandler.getPassTypeSelectingUserAction();

if (studyCafePassType == StudyCafePassType.HOURLY) {
StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler();
List<StudyCafePass> studyCafePasses = studyCafeFileHandler.readStudyCafePasses();
List<StudyCafePass> hourlyPasses = studyCafePasses.stream()
.filter(studyCafePass -> studyCafePass.getPassType() == StudyCafePassType.HOURLY)
.toList();
outputHandler.showPassListForSelection(hourlyPasses);
StudyCafePass selectedPass = inputHandler.getSelectPass(hourlyPasses);
outputHandler.showPassOrderSummary(selectedPass, null);
} else if (studyCafePassType == StudyCafePassType.WEEKLY) {
StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler();
List<StudyCafePass> studyCafePasses = studyCafeFileHandler.readStudyCafePasses();
List<StudyCafePass> weeklyPasses = studyCafePasses.stream()
.filter(studyCafePass -> studyCafePass.getPassType() == StudyCafePassType.WEEKLY)
.toList();
outputHandler.showPassListForSelection(weeklyPasses);
StudyCafePass selectedPass = inputHandler.getSelectPass(weeklyPasses);
outputHandler.showPassOrderSummary(selectedPass, null);
} else if (studyCafePassType == StudyCafePassType.FIXED) {
StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler();
List<StudyCafePass> studyCafePasses = studyCafeFileHandler.readStudyCafePasses();
List<StudyCafePass> fixedPasses = studyCafePasses.stream()
.filter(studyCafePass -> studyCafePass.getPassType() == StudyCafePassType.FIXED)
.toList();
outputHandler.showPassListForSelection(fixedPasses);
StudyCafePass selectedPass = inputHandler.getSelectPass(fixedPasses);

List<StudyCafeLockerPass> lockerPasses = studyCafeFileHandler.readLockerPasses();
StudyCafeLockerPass lockerPass = lockerPasses.stream()
.filter(option ->
option.getPassType() == selectedPass.getPassType()
&& option.getDuration() == selectedPass.getDuration()
)
.findFirst()
.orElse(null);

boolean lockerSelection = false;
if (lockerPass != null) {
outputHandler.askLockerPass(lockerPass);
lockerSelection = inputHandler.getLockerSelection();
}

if (lockerSelection) {
outputHandler.showPassOrderSummary(selectedPass, lockerPass);
} else {
outputHandler.showPassOrderSummary(selectedPass, null);
}
}
ioHandler.showWelcomeMessage();
ioHandler.showAnnouncement();

StudyCafeSeatPass selectedPass = selectPass();
Optional<StudyCafeLockerPass> optionalLockerPass = selectLockerPass(selectedPass);
StudyCafePassOrder passOrder = StudyCafePassOrder.of(
selectedPass,
optionalLockerPass.orElse(null)
);

ioHandler.showPassOrderSummary(passOrder);
} catch (AppException e) {
outputHandler.showSimpleMessage(e.getMessage());
ioHandler.showSimpleMessage(e.getMessage());
} catch (Exception e) {
outputHandler.showSimpleMessage("알 수 없는 오류가 발생했습니다.");
ioHandler.showSimpleMessage("알 수 없는 오류가 발생했습니다.");
}
}

private StudyCafeSeatPass selectPass() {
StudyCafePassType passType = ioHandler.askPassTypeSelecting();
List<StudyCafeSeatPass> passCandidates = findPassCandidatesBy(passType);

return ioHandler.askPassSelecting(passCandidates);
}

private List<StudyCafeSeatPass> findPassCandidatesBy(StudyCafePassType studyCafePassType) {
StudyCafeSeatPasses allPasses = seatPassProvider.getSeatPasses();
return allPasses.findPassBy(studyCafePassType);
}

private Optional<StudyCafeLockerPass> selectLockerPass(StudyCafeSeatPass selectedPass) {
if (selectedPass.cannotUseLocker()) {
return Optional.empty();
}

Optional<StudyCafeLockerPass> lockerPassCandidate = findLockerPassCandidateBy(selectedPass);

if (lockerPassCandidate.isPresent()) {
StudyCafeLockerPass lockerPass = lockerPassCandidate.get();

boolean isLockerSelected = ioHandler.askLockerPass(lockerPass);
if (isLockerSelected) {
return Optional.of(lockerPass);
}
}

return Optional.empty();
}

private Optional<StudyCafeLockerPass> findLockerPassCandidateBy(StudyCafeSeatPass pass) {
StudyCafeLockerPasses allLockerPasses = lockerPassProvider.getLockerPasses();
return allLockerPasses.findLockerPassBy(pass);
}

}
6 changes: 3 additions & 3 deletions src/main/java/cleancode/studycafe/asis/io/InputHandler.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package cleancode.studycafe.asis.io;

import cleancode.studycafe.asis.exception.AppException;
import cleancode.studycafe.asis.model.StudyCafePass;
import cleancode.studycafe.asis.model.StudyCafePassType;
import cleancode.studycafe.asis.model.pass.StudyCafeSeatPass;
import cleancode.studycafe.asis.model.pass.StudyCafePassType;

import java.util.List;
import java.util.Scanner;
Expand All @@ -26,7 +26,7 @@ public StudyCafePassType getPassTypeSelectingUserAction() {
throw new AppException("잘못된 입력입니다.");
}

public StudyCafePass getSelectPass(List<StudyCafePass> passes) {
public StudyCafeSeatPass getSelectPass(List<StudyCafeSeatPass> passes) {
String userInput = SCANNER.nextLine();
int selectedIndex = Integer.parseInt(userInput) - 1;
return passes.get(selectedIndex);
Expand Down
52 changes: 38 additions & 14 deletions src/main/java/cleancode/studycafe/asis/io/OutputHandler.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package cleancode.studycafe.asis.io;

import cleancode.studycafe.asis.model.StudyCafeLockerPass;
import cleancode.studycafe.asis.model.StudyCafePass;
import cleancode.studycafe.asis.model.order.StudyCafePassOrder;
import cleancode.studycafe.asis.model.pass.StudyCafePass;
import cleancode.studycafe.asis.model.pass.StudyCafePassType;
import cleancode.studycafe.asis.model.pass.StudyCafeSeatPass;
import cleancode.studycafe.asis.model.pass.locker.StudyCafeLockerPass;

import java.util.List;
import java.util.Optional;

public class OutputHandler {

Expand All @@ -22,41 +26,44 @@ public void askPassTypeSelection() {
System.out.println("1. 시간 이용권(자유석) | 2. 주단위 이용권(자유석) | 3. 1인 고정석");
}

public void showPassListForSelection(List<StudyCafePass> passes) {
public void showPassListForSelection(List<StudyCafeSeatPass> passes) {
System.out.println();
System.out.println("이용권 목록");
for (int index = 0; index < passes.size(); index++) {
StudyCafePass pass = passes.get(index);
System.out.println(String.format("%s. ", index + 1) + pass.display());
StudyCafeSeatPass pass = passes.get(index);
System.out.println(String.format("%s. ", index + 1) + display(pass));
}
}

public void askLockerPass(StudyCafeLockerPass lockerPass) {
System.out.println();
String askMessage = String.format(
"사물함을 이용하시겠습니까? (%s)",
lockerPass.display()
display(lockerPass)
);

System.out.println(askMessage);
System.out.println("1. 예 | 2. 아니오");
}

public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass lockerPass) {
public void showPassOrderSummary(StudyCafePassOrder passOrder) {
StudyCafeSeatPass selectedPass = passOrder.getSeatPass();
Optional<StudyCafeLockerPass> optionalLockerPass = passOrder.getLockerPass();

System.out.println();
System.out.println("이용 내역");
System.out.println("이용권: " + selectedPass.display());
if (lockerPass != null) {
System.out.println("사물함: " + lockerPass.display());
}
System.out.println("이용권: " + display(selectedPass));

double discountRate = selectedPass.getDiscountRate();
int discountPrice = (int) (selectedPass.getPrice() * discountRate);
optionalLockerPass.ifPresent(lockerPass ->
System.out.println("사물함: " + display(lockerPass))
);

int discountPrice = passOrder.getDiscountPrice();
if (discountPrice > 0) {
System.out.println("이벤트 할인 금액: " + discountPrice + "원");
}

int totalPrice = selectedPass.getPrice() - discountPrice + (lockerPass != null ? lockerPass.getPrice() : 0);
int totalPrice = passOrder.getTotalPrice();
System.out.println("총 결제 금액: " + totalPrice + "원");
System.out.println();
}
Expand All @@ -65,4 +72,21 @@ public void showSimpleMessage(String message) {
System.out.println(message);
}

private String display(StudyCafePass pass) {
StudyCafePassType passType = pass.getPassType();
int duration = pass.getDuration();
int price = pass.getPrice();

if (passType == StudyCafePassType.HOURLY) {
return String.format("%s시간권 - %d원", duration, price);
}
if (passType == StudyCafePassType.WEEKLY) {
return String.format("%s주권 - %d원", duration, price);
}
if (passType == StudyCafePassType.FIXED) {
return String.format("%s주권 - %d원", duration, price);
}
return "";
}

}

This file was deleted.

48 changes: 48 additions & 0 deletions src/main/java/cleancode/studycafe/asis/io/StudyCafeIOHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package cleancode.studycafe.asis.io;

import cleancode.studycafe.asis.io.InputHandler;
import cleancode.studycafe.asis.io.OutputHandler;
import cleancode.studycafe.asis.model.order.StudyCafePassOrder;
import cleancode.studycafe.asis.model.pass.locker.StudyCafeLockerPass;
import cleancode.studycafe.asis.model.pass.StudyCafeSeatPass;
import cleancode.studycafe.asis.model.pass.StudyCafePassType;

import java.util.List;

public class StudyCafeIOHandler {

private final InputHandler inputHandler = new InputHandler();
private final OutputHandler outputHandler = new OutputHandler();

public void showWelcomeMessage() {
outputHandler.showWelcomeMessage();
}

public void showAnnouncement() {
outputHandler.showAnnouncement();
}

public void showPassOrderSummary(StudyCafePassOrder passOrder) {
outputHandler.showPassOrderSummary(passOrder);
}

public void showSimpleMessage(String message) {
outputHandler.showSimpleMessage(message);
}

public StudyCafePassType askPassTypeSelecting() {
outputHandler.askPassTypeSelection();
return inputHandler.getPassTypeSelectingUserAction();
}

public StudyCafeSeatPass askPassSelecting(List<StudyCafeSeatPass> passCandidates) {
outputHandler.showPassListForSelection(passCandidates);
return inputHandler.getSelectPass(passCandidates);
}

public boolean askLockerPass(StudyCafeLockerPass lockerPassCandidate) {
outputHandler.askLockerPass(lockerPassCandidate);
return inputHandler.getLockerSelection();
}

}
Loading