From 23a4c67fe91c5e601c9d02ae9501e7eaed63ef75 Mon Sep 17 00:00:00 2001 From: "Park, Sojeong" Date: Mon, 15 Jul 2024 18:11:20 +0900 Subject: [PATCH 1/8] =?UTF-8?q?Feat:=208-1=EB=8B=A8=EA=B3=84=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EC=B6=94=EA=B0=80=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/ReservationResponseDto.java | 8 ++-- src/main/java/roomescape/Time.java | 27 +++++++++++++ src/main/java/roomescape/TimeController.java | 39 +++++++++++++++++++ src/main/java/roomescape/TimeDAO.java | 32 +++++++++++++++ src/main/java/roomescape/TimeResponseDto.java | 25 ++++++++++++ .../java/roomescape/TimeSaveRequestDto.java | 13 +++++++ src/main/resources/schema.sql | 7 ++++ src/test/java/roomescape/MissionStepTest.java | 15 +++++++ 8 files changed, 162 insertions(+), 4 deletions(-) create mode 100644 src/main/java/roomescape/Time.java create mode 100644 src/main/java/roomescape/TimeController.java create mode 100644 src/main/java/roomescape/TimeDAO.java create mode 100644 src/main/java/roomescape/TimeResponseDto.java create mode 100644 src/main/java/roomescape/TimeSaveRequestDto.java diff --git a/src/main/java/roomescape/ReservationResponseDto.java b/src/main/java/roomescape/ReservationResponseDto.java index d2c2d972b..fafb57093 100644 --- a/src/main/java/roomescape/ReservationResponseDto.java +++ b/src/main/java/roomescape/ReservationResponseDto.java @@ -2,10 +2,10 @@ public class ReservationResponseDto { - private final Long id; - private final String name; - private final String date; - private final String time; + private Long id; + private String name; + private String date; + private String time; public ReservationResponseDto(Reservation reservation) { this.id = reservation.getId(); diff --git a/src/main/java/roomescape/Time.java b/src/main/java/roomescape/Time.java new file mode 100644 index 000000000..85dc6c219 --- /dev/null +++ b/src/main/java/roomescape/Time.java @@ -0,0 +1,27 @@ +package roomescape; + +public class Time { + + private Long id; + private String time; + + public Time() { + } + + public Time(String time) { + this.time = time; + } + + public Time(Long id, String time) { + this.id = id; + this.time = time; + } + + public Long getId() { + return this.id; + } + + public String getTime() { + return this.time; + } +} diff --git a/src/main/java/roomescape/TimeController.java b/src/main/java/roomescape/TimeController.java new file mode 100644 index 000000000..a889c02dd --- /dev/null +++ b/src/main/java/roomescape/TimeController.java @@ -0,0 +1,39 @@ +package roomescape; + +import java.net.URI; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@Controller +public class TimeController { + + private final TimeDAO timeDAO; + + public TimeController(TimeDAO timeDAO) { + this.timeDAO = timeDAO; + } + + @PostMapping("/times") + public ResponseEntity createReservation(@RequestBody TimeSaveRequestDto requestDto) { + if (isTimeArgumentEmpty(requestDto)) { + throw new IllegalArgumentException("잘못된 요청입니다."); + } + + Time time = new Time(requestDto.getTime()); + + Long id = timeDAO.insert(time); + + return ResponseEntity.created(URI.create("/times/" + id)) + .body(new TimeResponseDto(id, time)); + } + + private boolean isTimeArgumentEmpty(TimeSaveRequestDto requestDto) { + return isStringEmpty(requestDto.getTime()); + } + + private boolean isStringEmpty(String argument) { + return argument == null || argument.trim().isEmpty(); + } +} diff --git a/src/main/java/roomescape/TimeDAO.java b/src/main/java/roomescape/TimeDAO.java new file mode 100644 index 000000000..710c5409f --- /dev/null +++ b/src/main/java/roomescape/TimeDAO.java @@ -0,0 +1,32 @@ +package roomescape; + +import java.sql.PreparedStatement; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; + +@Repository +public class TimeDAO { + + private final JdbcTemplate jdbcTemplate; + + public TimeDAO(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public Long insert(Time time) { + String sql = "INSERT INTO time (time) VALUES ?"; + KeyHolder keyHolder = new GeneratedKeyHolder(); + + jdbcTemplate.update(connect -> { + PreparedStatement ps = connect.prepareStatement( + sql, + new String[]{"id"}); + ps.setString(1, time.getTime()); + return ps; + }, keyHolder); + + return keyHolder.getKey().longValue(); + } +} diff --git a/src/main/java/roomescape/TimeResponseDto.java b/src/main/java/roomescape/TimeResponseDto.java new file mode 100644 index 000000000..e1b539543 --- /dev/null +++ b/src/main/java/roomescape/TimeResponseDto.java @@ -0,0 +1,25 @@ +package roomescape; + +public class TimeResponseDto { + + private Long id; + private String time; + + public TimeResponseDto(Time time) { + this.id = time.getId(); + this.time = time.getTime(); + } + + public TimeResponseDto(Long id, Time time) { + this.id = id; + this.time = time.getTime(); + } + + public Long getId() { + return this.id; + } + + public String getTime() { + return this.time; + } +} diff --git a/src/main/java/roomescape/TimeSaveRequestDto.java b/src/main/java/roomescape/TimeSaveRequestDto.java new file mode 100644 index 000000000..3a41040fe --- /dev/null +++ b/src/main/java/roomescape/TimeSaveRequestDto.java @@ -0,0 +1,13 @@ +package roomescape; + +public class TimeSaveRequestDto { + + private String time; + + public TimeSaveRequestDto() { + } + + public String getTime() { + return this.time; + } +} diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 8d9ab2754..7adcd0fc9 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -6,3 +6,10 @@ CREATE TABLE reservation time VARCHAR(255) NOT NULL, PRIMARY KEY (id) ); + +CREATE TABLE time +( + id BIGINT NOT NULL AUTO_INCREMENT, + time VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index e4b3ccdb2..7b9f1274d 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -212,4 +212,19 @@ void should_deleteReservationAtDB_when_getMethodReservationsIdURI() { Integer countAfterDelete = jdbcTemplate.queryForObject("SELECT count(1) from reservation", Integer.class); assertThat(countAfterDelete).isEqualTo(0); } + + @Test + @DisplayName("시간 추가 API 테스트") + void should_createTime_when_postMethodTimesURI() { + Map params = new HashMap<>(); + params.put("time", "10:00"); + + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(params) + .when().post("/times") + .then().log().all() + .statusCode(201) + .header("Location", "/times/1"); + } } From 9139729476fa3b3e040e32e9a5d4654e5a828ec4 Mon Sep 17 00:00:00 2001 From: "Park, Sojeong" Date: Mon, 15 Jul 2024 18:27:56 +0900 Subject: [PATCH 2/8] =?UTF-8?q?Feat:=208-2=EB=8B=A8=EA=B3=84=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/TimeController.java | 12 ++++++++++++ src/main/java/roomescape/TimeDAO.java | 16 ++++++++++++++++ src/test/java/roomescape/MissionStepTest.java | 18 ++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/src/main/java/roomescape/TimeController.java b/src/main/java/roomescape/TimeController.java index a889c02dd..5aaea9711 100644 --- a/src/main/java/roomescape/TimeController.java +++ b/src/main/java/roomescape/TimeController.java @@ -1,8 +1,11 @@ package roomescape; import java.net.URI; +import java.util.List; +import java.util.stream.Collectors; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -29,6 +32,15 @@ public ResponseEntity createReservation(@RequestBody TimeSaveRe .body(new TimeResponseDto(id, time)); } + @GetMapping("/times") + public ResponseEntity> readAllTimes() { + List timeResponseDtos = timeDAO.findAllTimes() + .stream() + .map(TimeResponseDto::new) + .collect(Collectors.toList()); + return ResponseEntity.ok().body(timeResponseDtos); + } + private boolean isTimeArgumentEmpty(TimeSaveRequestDto requestDto) { return isStringEmpty(requestDto.getTime()); } diff --git a/src/main/java/roomescape/TimeDAO.java b/src/main/java/roomescape/TimeDAO.java index 710c5409f..9ddbdab3c 100644 --- a/src/main/java/roomescape/TimeDAO.java +++ b/src/main/java/roomescape/TimeDAO.java @@ -1,7 +1,9 @@ package roomescape; import java.sql.PreparedStatement; +import java.util.List; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; @@ -29,4 +31,18 @@ public Long insert(Time time) { return keyHolder.getKey().longValue(); } + + public List