diff --git a/build.gradle b/build.gradle index 57267157c..40a581b15 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,8 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.rest-assured:rest-assured:5.3.1' } diff --git a/src/main/java/roomescape/Reservation.java b/src/main/java/roomescape/Reservation.java new file mode 100644 index 000000000..7cf2c13bd --- /dev/null +++ b/src/main/java/roomescape/Reservation.java @@ -0,0 +1,45 @@ +package roomescape; + +import roomescape.exception.InvalidReservationException; + +public class Reservation { + private long id; + private String name; + private String date; + private String time; + + public Reservation() { + } + + public Reservation(long id, String name, String date, String time) { + validate(name, date, time); + this.id = id; + this.name = name; + this.date = date; + this.time = time; + } + + private void validate(String name, String date, String time){ + if (name == null || name.isEmpty() || + date == null || date.isEmpty() || + time == null || time.isEmpty()) { + throw new InvalidReservationException(); + } + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDate() { + return date; + } + + public String getTime() { + return time; + } +} diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java new file mode 100644 index 000000000..bd3f2b092 --- /dev/null +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -0,0 +1,68 @@ +package roomescape.controller; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import roomescape.Reservation; +import roomescape.exception.InvalidReservationException; +import roomescape.exception.NotFoundReservationException; + +@Controller +public class ReservationController { + + private final List reservations = new ArrayList<>(); + private final AtomicLong index = new AtomicLong(0); + + @GetMapping("/reservation") + public String reservation() { + return "reservation"; + } + + @GetMapping("/reservations") + @ResponseBody + public List getReservations() { + return reservations; + } + + @PostMapping("/reservations") + public ResponseEntity addReservation(@RequestBody Reservation reservation) { + Reservation newReservation = new Reservation( + index.incrementAndGet(), + reservation.getName(), + reservation.getDate(), + reservation.getTime() + ); + + reservations.add(newReservation); + + return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())) + .body(newReservation); + } + + @DeleteMapping("/reservations/{id}") + public ResponseEntity deleteReservation(@PathVariable long id) { + Reservation reservation = reservations.stream() + .filter(it -> it.getId() == id) + .findFirst() + .orElseThrow(NotFoundReservationException::new); + + reservations.remove(reservation); + + return ResponseEntity.noContent().build(); + } + + @ExceptionHandler({NotFoundReservationException.class, InvalidReservationException.class}) + public ResponseEntity handleNotFoundException(RuntimeException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } +} diff --git a/src/main/java/roomescape/exception/InvalidReservationException.java b/src/main/java/roomescape/exception/InvalidReservationException.java new file mode 100644 index 000000000..f694d9ae8 --- /dev/null +++ b/src/main/java/roomescape/exception/InvalidReservationException.java @@ -0,0 +1,8 @@ +package roomescape.exception; + +public class InvalidReservationException extends RuntimeException { + + public InvalidReservationException() { + super("필수 인자값이 비어있습니다."); + } +} diff --git a/src/main/java/roomescape/exception/NotFoundReservationException.java b/src/main/java/roomescape/exception/NotFoundReservationException.java new file mode 100644 index 000000000..e3112d58e --- /dev/null +++ b/src/main/java/roomescape/exception/NotFoundReservationException.java @@ -0,0 +1,8 @@ +package roomescape.exception; + +public class NotFoundReservationException extends RuntimeException { + + public NotFoundReservationException() { + super("예약 내역을 찾을 수 없습니다."); + } +} diff --git a/src/main/resources/templates/home.html b/src/main/resources/static/index.html similarity index 98% rename from src/main/resources/templates/home.html rename to src/main/resources/static/index.html index 7ddf752a6..8724f9086 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/static/index.html @@ -20,7 +20,7 @@