Skip to content

Commit

Permalink
Feat: 조회용 레포지토리 추가 hwicode/airbnb/#33
Browse files Browse the repository at this point in the history
- 각 조회용 레포지토리 추가
- Response add 메서드 및 리팩토링
  • Loading branch information
devjun10 committed May 30, 2022
1 parent aec170a commit 1ce5703
Show file tree
Hide file tree
Showing 11 changed files with 181 additions and 106 deletions.
Original file line number Diff line number Diff line change
@@ -1,25 +1,19 @@
package com.example.airbnb.business.core.repository.accommodation.querydsl;

import com.example.airbnb.business.core.domain.accommodation.Accommodation;
import com.example.airbnb.business.core.domain.accommodation.AccommodationType;
import com.example.airbnb.business.core.domain.accommodation.Address;
import com.example.airbnb.business.core.domain.accommodation.Image;
import com.example.airbnb.business.core.domain.accommodation.AccommodationOptionLine;
import com.example.airbnb.business.web.controller.accommodation.dto.AccommodationResponse;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import static com.example.airbnb.business.core.domain.accommodation.QAccommodation.accommodation;
import static com.example.airbnb.business.core.domain.accommodation.QImage.image;
import static com.example.airbnb.business.core.domain.accommodation.QAccommodationOptionLine.accommodationOptionLine;
import static com.example.airbnb.business.core.domain.member.QMember.member;

@Repository
Expand All @@ -30,7 +24,26 @@ public class AccommodationReadRepository {
private final EntityManager entityManager;
private final JPAQueryFactory queryFactory;

public Optional<Object> findAccommodationBy(Long id) {
return null;
public Optional<AccommodationResponse> findAccommodationById(Long id) {
AccommodationResponse accommodationDetail = queryFactory.select(
Projections.fields(AccommodationResponse.class,
accommodation.accommodationId, member.memberId.as("hostId"),
member.name.as("hostName"), member.profileImage.as("hostProfileImage"), accommodation.name,
accommodation.description, accommodation.price.as("oneDayPerPrice"),
accommodation.address.homeAddress.as("address"), accommodation.accommodationType,
accommodation.averageRating, accommodation.maxNumberOfPeople, accommodation.room.bedRooms,
accommodation.room.beds, accommodation.room.bathRooms))
.from(accommodation)
.leftJoin(accommodation.member, member)
.where(accommodation.accommodationId.eq(id))
.fetchOne();
return Optional.ofNullable(accommodationDetail);
}

public List<AccommodationOptionLine> findAccommodationOptionLineByAccommodation(Long id){
return queryFactory.selectFrom(accommodationOptionLine)
.join(accommodationOptionLine.accommodation, accommodation)
.on(accommodation.accommodationId.eq(id))
.fetch();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ public class AccommodationController {

@GetMapping("{id}")
public AccommodationResponse searchAccommodationDetail(@PathVariable("id") Long id) {
return new AccommodationDeatilResponse(accommodationReadService.findByAccommodationId(id));
return accommodationReadService.findByAccommodationId(id);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.airbnb.business.web.controller.accommodation.dto;

import com.example.airbnb.business.core.domain.accommodation.AccommodationOptionLine;
import lombok.Getter;

import java.math.BigDecimal;

@Getter
public class AccommodationOptionLineResponse {

private String name;
private BigDecimal price;

public AccommodationOptionLineResponse(AccommodationOptionLine accommodationOptionLine) {
this.name = accommodationOptionLine.getName();
this.price = accommodationOptionLine.getPrice();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.airbnb.business.web.controller.accommodation.dto;

import com.example.airbnb.business.core.domain.accommodation.AccommodationOptionLine;
import lombok.Getter;

import java.util.List;
import java.util.stream.Collectors;

@Getter
public class AccommodationOptionLines {
private List<AccommodationOptionLineResponse> accommodationOptionLineResponses;

public AccommodationOptionLines(List<AccommodationOptionLine> accommodationOptionLines) {
this.accommodationOptionLineResponses = createAccommodationOptionLine(accommodationOptionLines);
}

private List<AccommodationOptionLineResponse> createAccommodationOptionLine(List<AccommodationOptionLine> accommodationOptionLines) {
return accommodationOptionLines.stream()
.map(AccommodationOptionLineResponse::new)
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public class AccommodationResponse {
private List<String> images;
private Comments comments;
private AmenityCategories amenityCategories;
private AccommodationOptionLines accommodationOptionLines;
private int commentSize;
private int maxNumberOfPeople;
private int bedRooms;
Expand All @@ -32,27 +33,29 @@ public class AccommodationResponse {
public AccommodationResponse() {
}

public void addImages(List<Image> images) {
this.images = changeImages(images);
public void add(List<Image> images, List<AmenitySubCategory> amenitySubCategories, List<Comment> comments, List<AccommodationOptionLine> accommodationOptionLines) {
addImages(images);
addCategories(amenitySubCategories);
addComments(comments);
addAccommodationOptionLines(accommodationOptionLines);
}

private List<String> changeImages(List<Image> images) {
return images.stream()
public void addImages(List<Image> images) {
this.images = images.stream()
.map(Image::getImageUrl)
.collect(Collectors.toList());
}

public void addComments(List<Comment> comments) {
this.comments = createComments(comments);
this.commentSize = comments.size();
public void addCategories(List<AmenitySubCategory> subCategories) {
this.amenityCategories = new AmenityCategories(subCategories);
}

private Comments createComments(List<Comment> comments) {
return new Comments(comments);
public void addComments(List<Comment> comments) {
this.comments = new Comments(comments);
this.commentSize = comments.size();
}

public void addCategories(List<AmenitySubCategory> subCategories) {
this.amenityCategories = new AmenityCategories(subCategories);
private void addAccommodationOptionLines(List<AccommodationOptionLine> accommodationOptionLines) {
this.accommodationOptionLines = new AccommodationOptionLines(accommodationOptionLines);
}

}
Original file line number Diff line number Diff line change
@@ -1,24 +1,34 @@
package com.example.airbnb.business.web.service;

import com.example.airbnb.business.core.domain.accommodation.Accommodation;
import com.example.airbnb.business.core.domain.accommodation.AccommodationOptionLine;
import com.example.airbnb.business.core.domain.accommodation.AmenitySubCategory;
import com.example.airbnb.business.core.domain.accommodation.Comment;
import com.example.airbnb.business.core.domain.accommodation.Image;
import com.example.airbnb.business.core.repository.accommodation.AccommodationRepository;
import com.example.airbnb.business.core.repository.accommodation.querydsl.AccommodationReadRepository;
import com.example.airbnb.business.web.controller.accommodation.dto.AccommodationResponse;
import com.example.airbnb.common.BusinessException;
import com.example.airbnb.common.exception.accommodation.AccommodationTypeException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
public class AccommodationReadService {

private final AccommodationRepository accommodationRepository;
private final AccommodationReadRepository accommodationReadRepository;
private final ImageReadRepository imageReadRepository;
private final AmenityReadRepository amenityReadRepository;
private final CommentReadRepository commentReadRepository;

@Transactional(readOnly = true)
public Accommodation findByAccommodationId(Long id) {
return accommodationReadRepository.findAccommodationBy(id)
public AccommodationResponse findByAccommodationId(Long id) {
AccommodationResponse accommodationResponse = accommodationReadRepository.findAccommodationById(id)
.orElseThrow(() -> new BusinessException(AccommodationTypeException.ACCOMMODATION_NOT_FOUND));

return accommodationResponse;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.example.airbnb.business.web.service;

import com.example.airbnb.business.core.domain.accommodation.AmenitySubCategory;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

import static com.example.airbnb.business.core.domain.accommodation.QAccommodation.accommodation;
import static com.example.airbnb.business.core.domain.accommodation.QAmenityCategory.amenityCategory;
import static com.example.airbnb.business.core.domain.accommodation.QAmenitySubCategory.amenitySubCategory;

@Repository
@RequiredArgsConstructor
public class AmenityReadRepository {

private final JPAQueryFactory queryFactory;

public List<AmenitySubCategory> findAmenityCategoryByAccommodation(Long id) {
return queryFactory.selectFrom(amenitySubCategory)
.join(amenitySubCategory.amenityCategory, amenityCategory)
.fetchJoin()
.join(amenityCategory.accommodation, accommodation)
.fetchJoin()
.where(accommodation.accommodationId.eq(id))
.fetch();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.airbnb.business.web.service;

import com.example.airbnb.business.core.domain.accommodation.Comment;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

import static com.example.airbnb.business.core.domain.accommodation.QAccommodation.accommodation;
import static com.example.airbnb.business.core.domain.accommodation.QComment.comment;
import static com.example.airbnb.business.core.domain.member.QMember.member;

@Repository
@RequiredArgsConstructor
public class CommentReadRepository {

private final JPAQueryFactory queryFactory;

public List<Comment> findCommentByAccommodation(Long id) {
return queryFactory.selectFrom(comment)
.join(comment.member, member)
.fetchJoin()
.join(comment.accommodation, accommodation)
.where(accommodation.accommodationId.eq(id))
.fetch();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.example.airbnb.business.web.service;

import com.example.airbnb.business.core.domain.accommodation.Image;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

import static com.example.airbnb.business.core.domain.accommodation.QAccommodation.accommodation;
import static com.example.airbnb.business.core.domain.accommodation.QImage.image;

@Repository
@RequiredArgsConstructor
public class ImageReadRepository {

private final JPAQueryFactory queryFactory;

public List<Image> findImageByAccommodation(Long id) {
return queryFactory.selectFrom(image)
.join(image.accommodation, accommodation)
.on(accommodation.accommodationId.eq(id))
.fetch();
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.example.airbnb.common.configuration.place;

import com.example.airbnb.common.place.map.MapDataRegistration;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
Expand Down Expand Up @@ -43,8 +42,8 @@ public MapDataProperties(String key, String apiKey, String baseUrlKey, String ba
public MapDataProperties() {
}

@Bean
public MapDataRegistration mapRegistration() {
return new MapDataRegistration(this);
}
// @Bean
// public MapDataRegistration mapRegistration() {
// return new MapDataRegistration(this);
// }
}

0 comments on commit 1ce5703

Please sign in to comment.