diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/controller/AccommodationController.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/controller/AccommodationController.java index cd79abd0..150d91be 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/controller/AccommodationController.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/controller/AccommodationController.java @@ -2,8 +2,12 @@ import java.util.List; import kr.co.fastcampus.yanabada.common.response.ResponseBody; +import kr.co.fastcampus.yanabada.domain.accommodation.dto.request.AccommodationOptionSaveRequest; import kr.co.fastcampus.yanabada.domain.accommodation.dto.request.AccommodationSaveRequest; +import kr.co.fastcampus.yanabada.domain.accommodation.dto.request.RoomOptionSaveRequest; import kr.co.fastcampus.yanabada.domain.accommodation.dto.request.RoomSaveRequest; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.AccommodationOption; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.RoomOption; import kr.co.fastcampus.yanabada.domain.accommodation.service.AccommodationService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; @@ -26,9 +30,23 @@ public ResponseBody addAccommodations( return ResponseBody.ok(); } + @PostMapping("/options") + public ResponseBody addAccommodationOptions( + @RequestBody List requests + ) { + accommodationService.saveAccommodationOptions(requests); + return ResponseBody.ok(); + } + @PostMapping("/rooms") public ResponseBody addRoom(@RequestBody List requests) { accommodationService.saveRooms(requests); return ResponseBody.ok(); } + + @PostMapping("/rooms/options") + public ResponseBody addRoomOptions(@RequestBody List requests) { + accommodationService.saveRoomOptions(requests); + return ResponseBody.ok(); + } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/dto/request/AccommodationOptionSaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/dto/request/AccommodationOptionSaveRequest.java new file mode 100644 index 00000000..aefaaeba --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/dto/request/AccommodationOptionSaveRequest.java @@ -0,0 +1,25 @@ +package kr.co.fastcampus.yanabada.domain.accommodation.dto.request; + +import kr.co.fastcampus.yanabada.domain.accommodation.entity.Accommodation; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.AccommodationOption; + +public record AccommodationOptionSaveRequest( + Long accommodationId, + Boolean hasSauna, + Boolean hasRooftop, + Boolean hasPool, + Boolean hasGym, + Boolean hasLoungeBar +) { + + public AccommodationOption toEntity(Accommodation accommodation) { + return AccommodationOption.create( + accommodation, + hasSauna, + hasRooftop, + hasPool, + hasGym, + hasLoungeBar + ); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/dto/request/RoomOptionSaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/dto/request/RoomOptionSaveRequest.java new file mode 100644 index 00000000..b6fab0a1 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/dto/request/RoomOptionSaveRequest.java @@ -0,0 +1,41 @@ +package kr.co.fastcampus.yanabada.domain.accommodation.dto.request; + +import kr.co.fastcampus.yanabada.domain.accommodation.entity.Room; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.RoomOption; + +public record RoomOptionSaveRequest( + Long roomId, + Boolean canPark, + Boolean isPartyRoom, + Boolean canAccompanyPet, + Boolean isKidsRoom, + Boolean isCityView, + Boolean isOceanView, + Boolean hasPc, + Boolean hasOtt, + Boolean hasBathtub, + Boolean hasAmenity, + Boolean hasBreakfast, + Boolean canCook, + Boolean isNoKids +) { + + public RoomOption toEntity(Room room) { + return RoomOption.create( + room, + canPark, + isPartyRoom, + canAccompanyPet, + isKidsRoom, + isCityView, + isOceanView, + hasPc, + hasOtt, + hasBathtub, + hasAmenity, + hasBreakfast, + canCook, + isNoKids + ); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/dto/request/RoomSaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/dto/request/RoomSaveRequest.java index b641ac34..a22a200d 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/dto/request/RoomSaveRequest.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/dto/request/RoomSaveRequest.java @@ -14,7 +14,8 @@ public record RoomSaveRequest( String description, Integer minHeadCount, Integer maxHeadCount, - Double rating + Double rating, + String image ) { public Room toEntity(Accommodation accommodation) { @@ -27,7 +28,8 @@ public Room toEntity(Accommodation accommodation) { description, minHeadCount, maxHeadCount, - rating + rating, + image ); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/AccommodationOption.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/AccommodationOption.java index 49cd5f58..3f54a539 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/AccommodationOption.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/AccommodationOption.java @@ -1,5 +1,6 @@ package kr.co.fastcampus.yanabada.domain.accommodation.entity; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; @@ -25,4 +26,53 @@ public class AccommodationOption { @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "accommodation_id") private Accommodation accommodation; + + @Column(nullable = false) + private Boolean hasSauna; + + @Column(nullable = false) + private Boolean hasRooftop; + + @Column(nullable = false) + private Boolean hasPool; + + @Column(nullable = false) + private Boolean hasGym; + + @Column(nullable = false) + private Boolean hasLoungeBar; + + private AccommodationOption( + Accommodation accommodation, + Boolean hasSauna, + Boolean hasRooftop, + Boolean hasPool, + Boolean hasGym, + Boolean hasLoungeBar + ) { + this.accommodation = accommodation; + this.hasSauna = hasSauna; + this.hasRooftop = hasRooftop; + this.hasPool = hasPool; + this.hasGym = hasGym; + this.hasLoungeBar = hasLoungeBar; + } + + public static AccommodationOption create( + Accommodation accommodation, + Boolean hasSauna, + Boolean hasRooftop, + Boolean hasPool, + Boolean hasGym, + Boolean hasLoungeBar + ) { + return new AccommodationOption( + accommodation, + hasSauna, + hasRooftop, + hasPool, + hasGym, + hasLoungeBar + ); + } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/Room.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/Room.java index f9b06f02..7ec6d7b6 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/Room.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/Room.java @@ -58,6 +58,9 @@ public class Room extends BaseEntity { @Column(nullable = false) private Double rating; + @Column(nullable = false) + private String image; + @OneToOne( fetch = FetchType.LAZY, mappedBy = "room", cascade = CascadeType.ALL, orphanRemoval = true @@ -73,7 +76,8 @@ private Room( String description, Integer minHeadCount, Integer maxHeadCount, - Double rating + Double rating, + String image ) { this.accommodation = accommodation; this.name = name; @@ -84,6 +88,7 @@ private Room( this.minHeadCount = minHeadCount; this.maxHeadCount = maxHeadCount; this.rating = rating; + this.image = image; } public static Room create( @@ -95,7 +100,8 @@ public static Room create( String description, Integer minHeadCount, Integer maxHeadCount, - Double rating + Double rating, + String image ) { return new Room( accommodation, @@ -106,7 +112,8 @@ public static Room create( description, minHeadCount, maxHeadCount, - rating + rating, + image ); } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/RoomOption.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/RoomOption.java index cf01b2b5..8814b4ca 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/RoomOption.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/RoomOption.java @@ -1,5 +1,6 @@ package kr.co.fastcampus.yanabada.domain.accommodation.entity; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; @@ -25,4 +26,109 @@ public class RoomOption { @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "room_id") private Room room; + + @Column(nullable = false) + private Boolean canPark; + + @Column(nullable = false) + private Boolean isPartyRoom; + + @Column(nullable = false) + private Boolean canAccompanyPet; + + @Column(nullable = false) + private Boolean isKidsRoom; + + @Column(nullable = false) + private Boolean isCityView; + + @Column(nullable = false) + private Boolean isOceanView; + + @Column(nullable = false) + private Boolean hasPc; + + @Column(nullable = false) + private Boolean hasOtt; + + @Column(nullable = false) + private Boolean hasBathtub; + + @Column(nullable = false) + private Boolean hasAmenity; + + @Column(nullable = false) + private Boolean hasBreakfast; + + @Column(nullable = false) + private Boolean canCook; + + @Column(nullable = false) + private Boolean isNoKids; + + private RoomOption( + Room room, + Boolean canPark, + Boolean isPartyRoom, + Boolean canAccompanyPet, + Boolean isKidsRoom, + Boolean isCityView, + Boolean isOceanView, + Boolean hasPc, + Boolean hasOtt, + Boolean hasBathtub, + Boolean hasAmenity, + Boolean hasBreakfast, + Boolean canCook, + Boolean isNoKids + ) { + this.room = room; + this.canPark = canPark; + this.isPartyRoom = isPartyRoom; + this.canAccompanyPet = canAccompanyPet; + this.isKidsRoom = isKidsRoom; + this.isCityView = isCityView; + this.isOceanView = isOceanView; + this.hasPc = hasPc; + this.hasOtt = hasOtt; + this.hasBathtub = hasBathtub; + this.hasAmenity = hasAmenity; + this.hasBreakfast = hasBreakfast; + this.canCook = canCook; + this.isNoKids = isNoKids; + } + + public static RoomOption create( + Room room, + Boolean canPark, + Boolean isPartyRoom, + Boolean canAccompanyPet, + Boolean isKidsRoom, + Boolean isCityView, + Boolean isOceanView, + Boolean hasPc, + Boolean hasOtt, + Boolean hasBathtub, + Boolean hasAmenity, + Boolean hasBreakfast, + Boolean canCook, + Boolean isNoKids + ) { + return new RoomOption( + room, + canPark, + isPartyRoom, + canAccompanyPet, + isKidsRoom, + isCityView, + isOceanView, + hasPc, + hasOtt, + hasBathtub, + hasAmenity, + hasBreakfast, + canCook, + isNoKids + ); + } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/Category.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/Category.java index b0b36fbf..c83c4401 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/Category.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/Category.java @@ -1,5 +1,10 @@ package kr.co.fastcampus.yanabada.domain.accommodation.entity.enums; public enum Category { - HOTEL + HOTEL_RESORT, + MOTEL, + PENSION, + GUESTHOUSE, + POOL_VILLA + } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/Region.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/Region.java index 10de3507..feb74e6f 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/Region.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/entity/enums/Region.java @@ -1,5 +1,22 @@ package kr.co.fastcampus.yanabada.domain.accommodation.entity.enums; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor public enum Region { - SEOUL + SEOUL("서울"), + GYEONGGI("경기"), + INCHEON("인천"), + GANGWON("강원"), + CHUNGCHEONG("충청"), + DAEJEON("대전"), + JEOLLA("전라"), + GWANGJU("광주"), + GYEONGSANG("경상"), + DAEGU("대구"), + ULSAN("울산"), + BUSAN("부산"), + JEJU("제주"); + + private final String value; } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/AccommodationOptionRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/AccommodationOptionRepository.java new file mode 100644 index 00000000..4f011436 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/AccommodationOptionRepository.java @@ -0,0 +1,7 @@ +package kr.co.fastcampus.yanabada.domain.accommodation.repository; + +import kr.co.fastcampus.yanabada.domain.accommodation.entity.AccommodationOption; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AccommodationOptionRepository extends JpaRepository { +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/AccommodationRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/AccommodationRepository.java index 2c1be5f9..c4a7c883 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/AccommodationRepository.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/AccommodationRepository.java @@ -6,7 +6,7 @@ public interface AccommodationRepository extends JpaRepository { - default Accommodation getAccommodation(Long accommodationId) { - return findById(accommodationId).orElseThrow(AccommodationNotFoundException::new); + default Accommodation getAccommodation(Long id) { + return findById(id).orElseThrow(AccommodationNotFoundException::new); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/RoomOptionRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/RoomOptionRepository.java new file mode 100644 index 00000000..ff60db4b --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/RoomOptionRepository.java @@ -0,0 +1,7 @@ +package kr.co.fastcampus.yanabada.domain.accommodation.repository; + +import kr.co.fastcampus.yanabada.domain.accommodation.entity.RoomOption; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RoomOptionRepository extends JpaRepository { +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/RoomRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/RoomRepository.java index 28684ac2..cc64b074 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/RoomRepository.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/repository/RoomRepository.java @@ -6,7 +6,7 @@ public interface RoomRepository extends JpaRepository { - default Room getRoom(Long roomId) { - return findById(roomId).orElseThrow(RoomNotFoundException::new); + default Room getRoom(Long id) { + return findById(id).orElseThrow(RoomNotFoundException::new); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/service/AccommodationService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/service/AccommodationService.java index ac926529..8983a64c 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/service/AccommodationService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/accommodation/service/AccommodationService.java @@ -1,9 +1,12 @@ package kr.co.fastcampus.yanabada.domain.accommodation.service; import java.util.List; +import kr.co.fastcampus.yanabada.domain.accommodation.dto.request.AccommodationOptionSaveRequest; import kr.co.fastcampus.yanabada.domain.accommodation.dto.request.AccommodationSaveRequest; +import kr.co.fastcampus.yanabada.domain.accommodation.dto.request.RoomOptionSaveRequest; import kr.co.fastcampus.yanabada.domain.accommodation.dto.request.RoomSaveRequest; import kr.co.fastcampus.yanabada.domain.accommodation.entity.Accommodation; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.Room; import kr.co.fastcampus.yanabada.domain.accommodation.repository.AccommodationRepository; import kr.co.fastcampus.yanabada.domain.accommodation.repository.RoomRepository; import lombok.RequiredArgsConstructor; @@ -33,4 +36,21 @@ public void saveRooms(List requests) { accommodation.addRoom(request.toEntity(accommodation)); }); } + + @Transactional + public void saveAccommodationOptions(List requests) { + requests.forEach(request -> { + Accommodation accommodation = + accommodationRepository.getAccommodation(request.accommodationId()); + accommodation.registerAccommodationOption(request.toEntity(accommodation)); + }); + } + + @Transactional + public void saveRoomOptions(List requests) { + requests.forEach(request -> { + Room room = roomRepository.getRoom(request.roomId()); + room.registerRoomOption(request.toEntity(room)); + }); + } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/member/repository/MemberRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/member/repository/MemberRepository.java index 6c40ef32..b7543b2d 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/member/repository/MemberRepository.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/member/repository/MemberRepository.java @@ -6,7 +6,7 @@ public interface MemberRepository extends JpaRepository { - default Member getMember(Long memberId) { - return findById(memberId).orElseThrow(MemberNotFoundException::new); + default Member getMember(Long id) { + return findById(id).orElseThrow(MemberNotFoundException::new); } }