Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ repositories {
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-validation'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/roomescape/common/GlobalExceptionHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ProblemDetail;
import org.springframework.web.HttpRequestMethodNotSupportedException;
Expand Down Expand Up @@ -44,6 +45,15 @@ public ProblemDetail httpRequestMethodNotSupportedExceptionHandle(HttpRequestMet
return ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, e.getMessage());
}

@ExceptionHandler(InvalidDataAccessApiUsageException.class)
public ProblemDetail invalidDataAccessApiUsageExceptionHandle(InvalidDataAccessApiUsageException e) {
if (e.getCause() instanceof RoomEscapeException roomEscapeException) {
return roomEscapeExceptionHandle(roomEscapeException);
}
log.error("๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค", e);
return ProblemDetail.forStatusAndDetail(HttpStatus.INTERNAL_SERVER_ERROR, DATABASE_ERROR);
}

@ExceptionHandler(DataIntegrityViolationException.class)
public ProblemDetail dataIntegrityViolationExceptionHandle(DataIntegrityViolationException e) {
log.info("๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์œ„๋ฐ˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.", e);
Expand Down
22 changes: 15 additions & 7 deletions src/main/java/roomescape/controller/ReservationController.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@
import roomescape.controller.dto.response.ReservationResponse;
import roomescape.controller.dto.response.ReservationResponses;
import roomescape.domain.reservation.Reservation;
import roomescape.domain.reservation.ReservationWithRank;
import roomescape.domain.reservation.Reservations;
import roomescape.service.ReservationCreateCommand;
import roomescape.service.ReservationService;
import roomescape.service.ReservationUpdateCommand;

import java.net.URI;
import java.util.List;

@RestController
public class ReservationController {
Expand All @@ -46,24 +48,30 @@ public ResponseEntity<ReservationResponse> create(

@GetMapping("/reservations")
public ResponseEntity<ReservationResponses> findList(
@RequestParam(required = false) String name
@RequestParam(required = false) Long memberId
) {
Reservations reservations = reservationService.findAll(name);
Reservations reservations = reservationService.findAll(memberId);
return ResponseEntity.ok(ReservationResponses.toDto(reservations));
}

@GetMapping("/reservations/{id}")
public ResponseEntity<ReservationResponse> find(@PathVariable long id) {
Reservation reservation = reservationService.find(id);
return ResponseEntity.ok(ReservationResponse.toDto(reservation));
ReservationWithRank reservationWithRank = reservationService.find(id);
return ResponseEntity.ok(ReservationResponse.toDto(reservationWithRank));
}

@GetMapping("/reservations-mine")
public ResponseEntity<ReservationResponses> findMine(@RequestParam Long memberId) {
List<ReservationWithRank> reservations = reservationService.findMine(memberId);
return ResponseEntity.ok(ReservationResponses.toDtoWithRank(reservations));
}

@DeleteMapping("/reservations/{id}")
public ResponseEntity<Void> delete(
@PathVariable long id,
@RequestParam String name
@RequestParam Long memberId
) {
reservationService.cancel(id, name);
reservationService.cancel(id, memberId);
return ResponseEntity.noContent().build();
}

Expand All @@ -72,7 +80,7 @@ public ResponseEntity<ReservationResponse> update(
@Valid @RequestBody ReservationUpdateRequest request,
@PathVariable long id
) {
Reservation updated = reservationService.update(ReservationUpdateCommand.from(request), id);
ReservationWithRank updated = reservationService.update(ReservationUpdateCommand.from(request), id);
return ResponseEntity.ok(ReservationResponse.toDto(updated));
}
}
40 changes: 40 additions & 0 deletions src/main/java/roomescape/controller/TestController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package roomescape.controller;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
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.Slot;
import roomescape.domain.reservation.SlotRepository;

import java.time.LocalTime;


/***
* ์–‘๋ฐฉํ–ฅ ๋งคํ•‘ ํ…Œ์ŠคํŠธ ์ปจํŠธ๋กค๋Ÿฌ
*
* 1๋‹จ๊ณ„ ์ดํ›„ ์‚ญ์ œํ•  ์˜ˆ์ •
*/
@RestController
public class TestController {

private final TestService service;

public TestController(TestService service) {
this.service = service;
}

@GetMapping("/test1")
public ResponseEntity<Slot> getTest1() {
return ResponseEntity.ok(service.test1());
}

@GetMapping("/test2")
public ResponseEntity<LocalTime> getTest2() {
return ResponseEntity.ok(service.test2());
}
}
36 changes: 36 additions & 0 deletions src/main/java/roomescape/controller/TestService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package roomescape.controller;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import roomescape.domain.reservation.Reservation;
import roomescape.domain.reservation.Slot;
import roomescape.domain.reservation.SlotRepository;

import java.time.LocalTime;
import java.util.List;


/***
* ์–‘๋ฐฉํ–ฅ ๋งคํ•‘ ํ…Œ์ŠคํŠธ ์„œ๋น„์Šค
*
* 1๋‹จ๊ณ„ ์ดํ›„ ์‚ญ์ œํ•  ์˜ˆ์ •
*/

@Service
@Transactional(readOnly = true)
public class TestService {

private final SlotRepository repository;

public TestService(SlotRepository repository) {
this.repository = repository;
}

public Slot test1() {
return repository.getById(1L);
}

public LocalTime test2() {
return repository.getById(1L).getTime().getStartAt();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
import java.time.LocalDate;

public class ReservationCreateRequest {
@NotNull(message = "์ด๋ฆ„์€ ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค")
private final String name;
@NotNull(message = "ํšŒ์› ID๋Š” ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
@Positive(message = "ํšŒ์› ID๋Š” ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
private final Long memberId;

@NotNull(message = "๋‚ ์งœ๋Š” ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค")
private final LocalDate date;
Expand All @@ -20,15 +21,15 @@ public class ReservationCreateRequest {
@Positive(message = "Theme ID๋Š” ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
private final Long themeId;

public ReservationCreateRequest(String name, LocalDate date, Long timeId, Long themeId) {
this.name = name;
public ReservationCreateRequest(Long memberId, LocalDate date, Long timeId, Long themeId) {
this.memberId = memberId;
this.date = date;
this.timeId = timeId;
this.themeId = themeId;
}

public String getName() {
return name;
public Long getMemberId() {
return memberId;
}

public LocalDate getDate() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
import java.time.LocalDate;

public class ReservationUpdateRequest {
@NotNull(message = "์ด๋ฆ„์€ ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค")
private final String name;
@NotNull(message = "ํšŒ์› ID๋Š” ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
@Positive(message = "ํšŒ์› ID๋Š” ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
private final Long memberId;

@NotNull(message = "๋‚ ์งœ๋Š” ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค")
private final LocalDate date;
Expand All @@ -20,15 +21,15 @@ public class ReservationUpdateRequest {
@Positive(message = "Theme ID๋Š” ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
private final Long themeId;

public ReservationUpdateRequest(String name, LocalDate date, Long timeId, Long themeId) {
this.name = name;
public ReservationUpdateRequest(Long memberId, LocalDate date, Long timeId, Long themeId) {
this.memberId = memberId;
this.date = date;
this.timeId = timeId;
this.themeId = themeId;
}

public String getName() {
return name;
public Long getMemberId() {
return memberId;
}

public LocalDate getDate() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package roomescape.controller.dto.response;

import roomescape.domain.reservation.Reservation;
import roomescape.domain.reservation.ReservationWithRank;
import roomescape.domain.reservation.Slot;

import java.time.LocalDate;
Expand All @@ -27,13 +28,25 @@ public ReservationResponse(long id, String name, LocalDate date, String state, L

public static ReservationResponse toDto(Reservation reservation) {
Slot slot = reservation.getSlot();
Long rank = reservation.getRank() != null ? reservation.getRank().getValue() : null;
return new ReservationResponse(
reservation.getId(),
reservation.getName().getValue(),
reservation.getMember().getName(),
slot.getDate().getDate(),
reservation.getStatus().getKoreanName(),
rank,
null,
ReservationTimeResponse.toDto(slot.getTime()),
ThemeResponse.toDto(slot.getTheme()));
}

public static ReservationResponse toDto(ReservationWithRank reservationWithRank) {
Reservation reservation = reservationWithRank.reservation();
Slot slot = reservation.getSlot();
return new ReservationResponse(
reservation.getId(),
reservation.getMember().getName(),
slot.getDate().getDate(),
reservation.getStatus().getKoreanName(),
reservationWithRank.rank(),
ReservationTimeResponse.toDto(slot.getTime()),
ThemeResponse.toDto(slot.getTheme()));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package roomescape.controller.dto.response;

import roomescape.domain.reservation.ReservationWithRank;
import roomescape.domain.reservation.Reservations;

import java.util.List;
Expand All @@ -18,6 +19,12 @@ public static ReservationResponses toDto(Reservations reservations) {
.toList());
}

public static ReservationResponses toDtoWithRank(List<ReservationWithRank> reservations) {
return new ReservationResponses(reservations.stream()
.map(ReservationResponse::toDto)
.toList());
}

public List<ReservationResponse> getReservations() {
return reservations;
}
Expand Down
38 changes: 38 additions & 0 deletions src/main/java/roomescape/domain/member/Member.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package roomescape.domain.member;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Member {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String name;

protected Member() {
}

public Member(Long id, String name) {
this.id = id;
this.name = name;
}

public static Member create(String name) {
return new Member(null, name);
}

public Long getId() {
return id;
}

public String getName() {
return name;
}
}
14 changes: 14 additions & 0 deletions src/main/java/roomescape/domain/member/MemberRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package roomescape.domain.member;

import org.springframework.data.jpa.repository.JpaRepository;
import roomescape.domain.RoomEscapeException;

import static roomescape.domain.DomainErrorCode.RESOURCE_NOT_FOUND;

public interface MemberRepository extends JpaRepository<Member, Long> {

default Member getById(Long id) {
return findById(id)
.orElseThrow(() -> new RoomEscapeException(RESOURCE_NOT_FOUND, "ํ•ด๋‹น ํšŒ์›์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. : " + id));
}
}
5 changes: 4 additions & 1 deletion src/main/java/roomescape/domain/reservation/Rank.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package roomescape.domain.reservation;

public class Rank {
private final long value;
private long value;

protected Rank(){
}

public Rank(long value) {
this.value = value;
Expand Down
Loading