Skip to content

Commit

Permalink
Feat. 기간 중 예약 가능한 상품
Browse files Browse the repository at this point in the history
패키지 수정
  • Loading branch information
Miensoap authored and soyesenna committed Jun 5, 2024
1 parent f852ba9 commit 3bf3d6d
Show file tree
Hide file tree
Showing 22 changed files with 219 additions and 78 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package team07.airbnb.domain.accommodation;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import team07.airbnb.domain.accommodation.dto.AccomodationCreateRequest;
import team07.airbnb.domain.accommodation.dto.AccomodationListResponse;
import team07.airbnb.domain.accommodation.entity.AccomodationEntity;

import java.util.List;

@RequestMapping("/accomodation")
@RestController
@RequiredArgsConstructor
public class AccomodationController {
private final AccomodationService accomodationService;


@GetMapping
public List<AccomodationEntity> findAll() {
return accomodationService.findAllAccomodations();
}

@GetMapping("/location")
public List<AccomodationListResponse> findNeighbor(
@RequestParam double longitude,
@RequestParam double latitude,
@RequestParam double distance) {

return accomodationService.findNearbyAccomodations(longitude, latitude, distance);
}

@PostMapping
public void createAccomodation(@RequestBody AccomodationCreateRequest createRequest){

}

/**
* 호스팅할 숙소 유형을 선택하세요. v
* 숙소 건물 유형을 자세히 설명하세요. ?
* 게스트가 숙소 공간을 단독으로 사용하는지 명확히 알려주세요. v
* 숙소 위치를 입력해 주세요. v
* 숙박 가능한 인원수를 결정하세요. v
* 숙소 편의시설을 등록하세요.
* 사진을 추가하고 정리하세요. v
* 숙소 이름을 정하세요. v
* 숙소 설명을 작성하세요. v
* 1박당 요금을 설정하세요.
*/
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package team07.airbnb.domain.accomodation;
package team07.airbnb.domain.accommodation;

import org.locationtech.jts.geom.Point;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import team07.airbnb.domain.accommodation.entity.AccomodationEntity;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package team07.airbnb.domain.accomodation;
package team07.airbnb.domain.accommodation;

import lombok.RequiredArgsConstructor;
import org.locationtech.jts.geom.Point;
import org.springframework.stereotype.Service;
import team07.airbnb.domain.accomodation.dto.AccomodationListResponse;
import team07.airbnb.domain.accommodation.dto.AccomodationListResponse;
import team07.airbnb.domain.accommodation.entity.AccomodationEntity;
import team07.airbnb.util.GeometryHelper;

import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package team07.airbnb.domain.accommodation.dto;

import team07.airbnb.domain.accommodation.property.RoomInformation;
import team07.airbnb.domain.accommodation.property.AccommodationLocation;
import team07.airbnb.domain.accommodation.property.AccomodationType;

import java.util.List;

public record AccomodationCreateRequest(
AccomodationType type,
RoomInformation roomInformation,
AccommodationLocation address,
String name,
String description,
List<String> images,
int basePricePerDay
) {
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package team07.airbnb.domain.accomodation.dto;
package team07.airbnb.domain.accommodation.dto;

import team07.airbnb.domain.accomodation.AccomodationEntity;
import team07.airbnb.domain.accomodation.property.AccommodationLocation;
import team07.airbnb.domain.accomodation.property.AccomodationType;
import team07.airbnb.domain.accommodation.entity.AccomodationEntity;
import team07.airbnb.domain.accommodation.property.AccommodationLocation;
import team07.airbnb.domain.accommodation.property.AccomodationType;

public record AccomodationListResponse (
long id,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team07.airbnb.domain.accomodation;
package team07.airbnb.domain.accommodation.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.Embedded;
Expand All @@ -12,9 +12,11 @@
import jakarta.persistence.Table;
import lombok.Getter;
import team07.airbnb.domain.BaseEntity;
import team07.airbnb.domain.accomodation.property.AccommodationLocation;
import team07.airbnb.domain.accomodation.property.AccomodationType;
import team07.airbnb.domain.user.entity.UserEntity;
import team07.airbnb.domain.accommodation.entity.Pictures;
import team07.airbnb.domain.accommodation.property.AccommodationLocation;
import team07.airbnb.domain.accommodation.property.AccomodationType;
import team07.airbnb.domain.accommodation.property.RoomInformation;
import team07.airbnb.domain.user.UserEntity;

import java.util.List;

Expand All @@ -25,14 +27,22 @@ public class AccomodationEntity extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@ManyToOne
private UserEntity host;
private AccomodationType type;

@Embedded
private RoomInformation roomInformation;

@Embedded
private AccommodationLocation address;
private AccomodationType type;

// Description
private String name;
private String description;
@JsonIgnore
@OneToMany(mappedBy = "accomodation", fetch = FetchType.LAZY)
private List<Pictures> images;

private int basePricePerDay;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team07.airbnb.domain.accomodation;
package team07.airbnb.domain.accommodation.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team07.airbnb.domain.accomodation.property;
package team07.airbnb.domain.accommodation.property;

import jakarta.persistence.Embeddable;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package team07.airbnb.domain.accommodation.property;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.Getter;

@Getter
@Entity
public class AccomodationAmenity {
@Id
private String name;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team07.airbnb.domain.accomodation.property;
package team07.airbnb.domain.accommodation.property;

public enum AccomodationType {
APARTMENT, HOTEL, MOTEL, HOSTEL, GUEST_HOUSE, RESORT, BED_AND_BREAKFAST, VACATION_RENTAL, COTTAGE, CABIN, CAMPGROUND
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package team07.airbnb.domain.accommodation.property;

import jakarta.persistence.Embeddable;
import lombok.Getter;

@Getter
@Embeddable
public class RoomInformation {
private int bedCount;
private int bedroomCount;
private int bathroomCount;
private boolean isPrivate;
private int maxOccupancy;
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import lombok.Getter;
import team07.airbnb.domain.BaseEntity;
import team07.airbnb.domain.user.entity.UserEntity;
import team07.airbnb.domain.product.ProductEntity;
import team07.airbnb.domain.product.entity.ProductEntity;

import java.time.LocalDate;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team07.airbnb.domain.product;
package team07.airbnb.domain.booking;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team07.airbnb.domain.product;

public enum ProductStatus {
public class ProductController {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package team07.airbnb.domain.product;

import org.springframework.data.jpa.repository.JpaRepository;
import team07.airbnb.domain.product.entity.ProductEntity;
import team07.airbnb.domain.product.entity.ProductStatus;

import java.util.List;

public interface ProductRepository extends JpaRepository<ProductEntity, Long> {

List<ProductEntity> findAllByAccomodationIdInAndStatus(List<Long> accomodationIds, ProductStatus status);
}
60 changes: 60 additions & 0 deletions BE/src/main/java/team07/airbnb/domain/product/ProductService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package team07.airbnb.domain.product;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import team07.airbnb.domain.accommodation.dto.AccomodationListResponse;
import team07.airbnb.domain.accommodation.entity.AccomodationEntity;
import team07.airbnb.domain.product.dto.ProductListResponse;
import team07.airbnb.domain.product.entity.ProductEntity;

import java.time.LocalDate;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import static team07.airbnb.domain.product.entity.ProductStatus.OPEN;

@Service
@RequiredArgsConstructor
public class ProductService {
private final ProductRepository productRepository;

public List<ProductListResponse> findAvailableInDateRange(
List<AccomodationEntity> accommodations, LocalDate checkIn, LocalDate checkOut) {

List<Long> accomodationIds = accommodations.stream().map(AccomodationEntity::getId).toList();

Map<Long, List<ProductEntity>> products = productRepository.findAllByAccomodationIdInAndStatus(accomodationIds, OPEN)
.stream()
.collect(Collectors.groupingBy(p -> p.getAccomodation().getId()));


Map<Long, List<ProductEntity>> availableProducts = products.entrySet().stream()
.filter(entry -> isAvailableInDateRange(entry.getValue(), checkIn, checkOut))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

return availableProducts.keySet().stream().map(key -> {
List<ProductEntity> productEntities = availableProducts.get(key);
return new ProductListResponse(
AccomodationListResponse.of(productEntities.get(0).getAccomodation()),
(int) productEntities.stream().mapToInt(ProductEntity::getPrice).average().getAsDouble()
);
}
).toList();
}

private boolean isAvailableInDateRange(List<ProductEntity> products, LocalDate checkIn, LocalDate checkOut) {
Set<LocalDate> dateSet = new HashSet<>();
for (LocalDate date = checkIn; !date.isAfter(checkOut); date = date.plusDays(1)) {
dateSet.add(date);
}

for (ProductEntity product : products) {
dateSet.remove(product.getDate());
}

return dateSet.isEmpty();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package team07.airbnb.domain.product.dto;

import team07.airbnb.domain.accommodation.dto.AccomodationListResponse;

public record ProductListResponse (
AccomodationListResponse accomodation,
int price
){
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team07.airbnb.domain.product;
package team07.airbnb.domain.product.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
Expand All @@ -8,7 +8,8 @@
import jakarta.persistence.Table;
import lombok.Getter;
import team07.airbnb.domain.BaseEntity;
import team07.airbnb.domain.accomodation.AccomodationEntity;
import team07.airbnb.domain.accommodation.entity.AccomodationEntity;
import team07.airbnb.domain.booking.DiscountPolicy;

import java.time.LocalDate;

Expand All @@ -23,9 +24,6 @@ public class ProductEntity extends BaseEntity {
@ManyToOne
private AccomodationEntity accomodation;
private LocalDate date;
private int maxHeadcount;
private int price;
@ManyToOne
private DiscountPolicy discountPolicy;
private ProductStatus status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package team07.airbnb.domain.product.entity;

public enum ProductStatus {
OPEN
}
Loading

0 comments on commit 3bf3d6d

Please sign in to comment.