diff --git a/build.gradle b/build.gradle index 57267157c..1f450261e 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,10 @@ 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' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.h2database:h2' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.rest-assured:rest-assured:5.3.1' } diff --git a/src/main/java/roomescape/Controller/ReservationController.java b/src/main/java/roomescape/Controller/ReservationController.java new file mode 100644 index 000000000..c2695a9f8 --- /dev/null +++ b/src/main/java/roomescape/Controller/ReservationController.java @@ -0,0 +1,80 @@ +package roomescape.Controller; + +import java.net.URI; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import roomescape.DTO.ReservationRequest; +import roomescape.Domain.Reservation; +import roomescape.Domain.Time; +import roomescape.Exception.NotFoundReservationException; +import roomescape.Service.ReservationService; + +@RestController +public class ReservationController { + + private final ReservationService reservationService; + + public ReservationController(ReservationService reservationService) { + this.reservationService = reservationService; + } + + @PostMapping("/reservations") + public ResponseEntity create(@RequestBody ReservationRequest request) { + + if (request.getName() == null || request.getName().isEmpty() || + request.getDate() == null || request.getDate().isEmpty() || + request.getTime() == null || request.getTime().isEmpty()) { + throw new NotFoundReservationException("Reservation not found"); + } + + Long timeId; + try { + timeId = Long.valueOf(request.getTime()); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid time format"); + } + + Time time = new Time(timeId, null); + Reservation reservation = new Reservation(null, request.getName(), request.getDate(), time); + + Long id = reservationService.addReservationByKey(reservation); + + Reservation savedReservation = reservationService.getReservationByID(id); + + return ResponseEntity.created(URI.create("/reservations/" + savedReservation.getId())) + .body(savedReservation); + } + + @GetMapping("/reservations") + public ResponseEntity> read() { + List reservations = reservationService.getAllReservations(); + + return ResponseEntity.ok().body(reservations); + } + + @DeleteMapping("/reservations/{id}") + public ResponseEntity delete(@PathVariable long id) { + + List reservations = reservationService.getReservationsByID(id); + + if (reservations.isEmpty()) { + throw new NotFoundReservationException("Reservation not found"); + } + + reservationService.deleteReservationByID(id); + + return ResponseEntity.noContent().build(); + } + + @ExceptionHandler(NotFoundReservationException.class) + public ResponseEntity handleException(NotFoundReservationException e) { + return ResponseEntity.badRequest().build(); + } +} diff --git a/src/main/java/roomescape/Controller/TimeController.java b/src/main/java/roomescape/Controller/TimeController.java new file mode 100644 index 000000000..bf3a8c95d --- /dev/null +++ b/src/main/java/roomescape/Controller/TimeController.java @@ -0,0 +1,71 @@ +package roomescape.Controller; + +import java.net.URI; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import roomescape.Domain.Time; +import roomescape.Exception.NotFoundTimeException; +import roomescape.Service.TimeService; + +@RestController +public class TimeController { + + private final TimeService timeService; + + public TimeController(TimeService timeService) { + this.timeService = timeService; + } + + @PostMapping("/times") + public ResponseEntity