diff --git a/build.gradle b/build.gradle index 57267157c..a847659f3 100644 --- a/build.gradle +++ b/build.gradle @@ -13,9 +13,15 @@ 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' + compileOnly 'org.projectlombok:lombok:1.18.34' + annotationProcessor 'org.projectlombok:lombok' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.h2database:h2' } test { diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java new file mode 100644 index 000000000..3d0882f31 --- /dev/null +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -0,0 +1,60 @@ +package roomescape.controller; + +import java.net.URI; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +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 roomescape.domain.Reservation; +import roomescape.domain.Reservation.NotFoundReservationException; +import roomescape.dto.ReservationRequestDto; +import roomescape.service.ReservationService; + +@Controller +@RequiredArgsConstructor +public class ReservationController { + private final ReservationService reservationService; + + @GetMapping("/reservation") + public String reservation() { + return "new-reservation"; + } + + @GetMapping("/reservations") + public ResponseEntity> reservations() { + List reservations = reservationService.getReservations(); + return ResponseEntity.ok(reservations); + } + + @PostMapping("/reservations") + public ResponseEntity addReservation(@RequestBody @Validated ReservationRequestDto reservationRequestDto) { + try { + Long.parseLong(reservationRequestDto.getTime()); + } catch (NumberFormatException e) { + return ResponseEntity.badRequest().build(); + } + + Reservation reservation = reservationService.addReservation(reservationRequestDto); + return ResponseEntity + .created(URI.create("/reservations/" + reservation.getId())) + .body(reservation); + } + + @DeleteMapping("/reservations/{id}") + public ResponseEntity deleteReservation(@PathVariable Long id) { + reservationService.removeReservation(id); + return ResponseEntity.noContent().build(); + } + + @ExceptionHandler(NotFoundReservationException.class) + public ResponseEntity handleException(NotFoundReservationException e) { + return ResponseEntity.badRequest().build(); + } +} \ No newline at end of file diff --git a/src/main/java/roomescape/controller/TimeController.java b/src/main/java/roomescape/controller/TimeController.java new file mode 100644 index 000000000..a54349edb --- /dev/null +++ b/src/main/java/roomescape/controller/TimeController.java @@ -0,0 +1,48 @@ +package roomescape.controller; + +import java.net.URI; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.DeleteMapping; +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 roomescape.domain.Time; +import roomescape.dto.TimeRequestDto; +import roomescape.service.TimeService; + +@Controller +@RequiredArgsConstructor +public class TimeController { + + private final TimeService timeService; + + @GetMapping("/time") + public String time() { + return "time"; + } + + @GetMapping("/times") + public ResponseEntity> getTimes() { + List