diff --git a/build.gradle b/build.gradle index 57267157c..da136e045 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,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' + implementation 'org.springframework.boot:spring-boot-devtools' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.h2database:h2' + compileOnly 'org.projectlombok:lombok:1.18.30' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.rest-assured:rest-assured:5.3.1' } diff --git a/src/main/java/roomescape/RoomescapeApplication.java b/src/main/java/roomescape/RoomescapeApplication.java index 702706791..2ca0f743f 100644 --- a/src/main/java/roomescape/RoomescapeApplication.java +++ b/src/main/java/roomescape/RoomescapeApplication.java @@ -8,5 +8,4 @@ public class RoomescapeApplication { public static void main(String[] args) { SpringApplication.run(RoomescapeApplication.class, args); } - } diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java new file mode 100644 index 000000000..7127c3dd3 --- /dev/null +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -0,0 +1,68 @@ +package roomescape.controller; + +import jakarta.validation.Valid; +import java.net.URI; +import java.util.List; +import java.util.NoSuchElementException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.MethodArgumentNotValidException; +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.entity.Reservation; +import roomescape.service.ReservationService; + +@Controller +public class ReservationController { + + private final ReservationService reservationService; + + @Autowired + ReservationController(final ReservationService reservationService) { + this.reservationService = reservationService; + } + + + @GetMapping("/") + public String home() { + return "home"; + } + + @GetMapping("/reservation") + public String reservation() { + return "new-reservation"; + } + + @GetMapping("/reservations") + @ResponseBody + public List getAllReservations() { + return reservationService.searchAllReservations(); + } + + @PostMapping("/reservations") + @ResponseBody + public ResponseEntity createReservation(@RequestBody @Valid Reservation reservation) { + Reservation response = reservationService.makeReservation(reservation); + URI location = URI.create("/reservations/" + response.getId()); + + return ResponseEntity.created(location).body(response); + } + + @DeleteMapping("/reservations/{id}") + public ResponseEntity deleteReservation(@PathVariable("id") Long id) { + reservationService.cancelReservation(id); + + return ResponseEntity.noContent().build(); + } + + @ExceptionHandler({NoSuchElementException.class, MethodArgumentNotValidException.class}) + public ResponseEntity handleException(Exception 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..074bd9c74 --- /dev/null +++ b/src/main/java/roomescape/controller/TimeController.java @@ -0,0 +1,59 @@ +package roomescape.controller; + +import jakarta.validation.Valid; +import java.net.URI; +import java.util.List; +import java.util.NoSuchElementException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.MethodArgumentNotValidException; +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.entity.Time; +import roomescape.service.TimeService; + +@Controller +public class TimeController { + + TimeService timeService; + + @Autowired + TimeController(TimeService timeService) { + this.timeService = timeService; + } + + @GetMapping("/times") + @ResponseBody + public ResponseEntity> getAllTimes() { + List