diff --git a/build.gradle b/build.gradle index 57267157c..6cfc05623 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,11 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.rest-assured:rest-assured:5.3.1' + testImplementation 'org.assertj:assertj-core:3.24.2' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'com.h2database:h2' } test { diff --git a/src/main/java/roomescape/GlobalExceptionHandler.java b/src/main/java/roomescape/GlobalExceptionHandler.java new file mode 100644 index 000000000..2c7fa41b8 --- /dev/null +++ b/src/main/java/roomescape/GlobalExceptionHandler.java @@ -0,0 +1,13 @@ +package roomescape; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler { + @ExceptionHandler(InvalidReservationException.class) + public ResponseEntity handleInvalidReservationException(InvalidReservationException ex) { + return ResponseEntity.badRequest().body(ex.getMessage()); + } +} diff --git a/src/main/java/roomescape/InvalidReservationException.java b/src/main/java/roomescape/InvalidReservationException.java new file mode 100644 index 000000000..f9a471674 --- /dev/null +++ b/src/main/java/roomescape/InvalidReservationException.java @@ -0,0 +1,7 @@ +package roomescape; + +public class InvalidReservationException extends RuntimeException { + public InvalidReservationException(String message) { + super(message); + } +} diff --git a/src/main/java/roomescape/InvalidTimeException.java b/src/main/java/roomescape/InvalidTimeException.java new file mode 100644 index 000000000..c01db2728 --- /dev/null +++ b/src/main/java/roomescape/InvalidTimeException.java @@ -0,0 +1,7 @@ +package roomescape; + +public class InvalidTimeException extends RuntimeException { + public InvalidTimeException(String message) { + super(message); + } +} diff --git a/src/main/java/roomescape/controller/HomeController.java b/src/main/java/roomescape/controller/HomeController.java new file mode 100644 index 000000000..34549a2af --- /dev/null +++ b/src/main/java/roomescape/controller/HomeController.java @@ -0,0 +1,12 @@ +package roomescape.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HomeController { + @GetMapping("/") + public String home() { + return "home"; + } +} diff --git a/src/main/java/roomescape/controller/ReservationAPIController.java b/src/main/java/roomescape/controller/ReservationAPIController.java new file mode 100644 index 000000000..d568edbac --- /dev/null +++ b/src/main/java/roomescape/controller/ReservationAPIController.java @@ -0,0 +1,66 @@ +package roomescape.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import roomescape.InvalidReservationException; +import roomescape.model.Reservation; +import roomescape.model.Time; +import roomescape.repository.ReservationRepository; + +import java.net.URI; +import java.util.List; +import java.util.Map; + + +@RestController +@RequestMapping("/reservations") +public class ReservationAPIController { + private final ReservationRepository reservationRepository; + + @Autowired + public ReservationAPIController(ReservationRepository reservationRepository) { + this.reservationRepository = reservationRepository; + } + @GetMapping + public List getReservations() { + return reservationRepository.findAll(); + } + @PostMapping + public ResponseEntity addReservation(@RequestBody Map params) { + String name=params.get("name"); + String date=params.get("date"); + String timeIdStr=params.get("time_id"); + + if (timeIdStr==null) { + throw new InvalidReservationException("timeid 값 오류"); + } + + if (name == null || name.isBlank() || date == null || date.isBlank()) { + throw new InvalidReservationException("name, date, time 모두 필요합니다."); + } + + Long timeId = Long.valueOf(timeIdStr); + Time time = new Time(); + time.setId(timeId); + + Reservation reservation = new Reservation(null, name, date, time); + Reservation saved= reservationRepository.save(reservation); + + return ResponseEntity + .created( URI.create("/reservations/" + reservation.getId())) + .body(saved); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteReservation(@PathVariable Long id) { + boolean deleted = reservationRepository.deleteById(id); + + if (!deleted) { + throw new InvalidReservationException("삭제 중 오류 발생"); + } + + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java new file mode 100644 index 000000000..3fb5105b8 --- /dev/null +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -0,0 +1,26 @@ +package roomescape.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import roomescape.model.Reservation; +import roomescape.repository.ReservationRepository; + +import java.util.ArrayList; +import java.util.List; + + +@Controller +public class ReservationController { + private final ReservationRepository reservationRepository; + + public ReservationController(ReservationRepository reservationRepository) { + this.reservationRepository = reservationRepository; + } + + @GetMapping("/reservation") + public String reservation() { + return "reservation"; + } + +} diff --git a/src/main/java/roomescape/controller/TimeAPIController.java b/src/main/java/roomescape/controller/TimeAPIController.java new file mode 100644 index 000000000..e7b8d390e --- /dev/null +++ b/src/main/java/roomescape/controller/TimeAPIController.java @@ -0,0 +1,49 @@ +package roomescape.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import roomescape.InvalidTimeException; +import roomescape.model.Time; +import roomescape.repository.ReservationRepository; +import roomescape.repository.TimeRepository; + +import java.net.URI; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/times") +public class TimeAPIController { + private final TimeRepository timeRepository; + + public TimeAPIController(TimeRepository timeRepository) { + this.timeRepository = timeRepository; + } + @GetMapping + public List