Skip to content

Commit

Permalink
[ARV-128] 메인 API 구현 (#111)
Browse files Browse the repository at this point in the history
* [ARV-128] feat: survey main list 구조

* [ARV-128] feat: rent main list 구조

* [ARV-128] feat: concert main list 구조

* [ARV-128] feat: 지난 공연 수요조사 차대절 검색 필터링 추가

* [ARV-128] feat: 지난 공연 수요조사 차대절 검색 필터링 추가

* [ARV-128] refactor: 코드 리뷰 반영
  • Loading branch information
kimdw0823 authored Dec 6, 2024
1 parent 5ee4a0e commit 8a6e26d
Show file tree
Hide file tree
Showing 17 changed files with 221 additions and 68 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.backend.allreva.concert.command.domain;

import com.backend.allreva.concert.query.application.dto.ConcertDetailResponse;
import com.backend.allreva.concert.query.application.dto.ConcertThumbnail;

import java.util.List;

public interface ConcertRepository {
Concert save(Concert concert);
Expand All @@ -16,4 +19,7 @@ public interface ConcertRepository {
Concert findByConcertCode(String concertCode);

boolean existsById(Long concertId);

List<ConcertThumbnail> getConcertMainThumbnails();

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@


import com.backend.allreva.concert.query.application.dto.ConcertDetailResponse;
import com.backend.allreva.concert.query.application.dto.ConcertThumbnail;

import java.util.List;

public interface ConcertDslRepository {
ConcertDetailResponse findDetailById(Long concertId);

List<ConcertThumbnail> getConcertMainThumbnails();

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.backend.allreva.concert.infra.repository;

import com.backend.allreva.concert.query.application.dto.ConcertDetailResponse;
import com.backend.allreva.concert.query.application.dto.ConcertThumbnail;
import com.querydsl.core.group.GroupBy;
import com.querydsl.core.types.ConstructorExpression;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.time.LocalDate;
import java.util.List;

import static com.backend.allreva.common.model.QImage.image;
import static com.backend.allreva.concert.command.domain.QConcert.concert;
import static com.backend.allreva.concert.command.domain.value.QSeller.seller;
Expand Down Expand Up @@ -38,6 +42,25 @@ public ConcertDetailResponse findDetailById(final Long concertId) {
return response;
}

@Override
public List<ConcertThumbnail> getConcertMainThumbnails() {
return queryFactory
.select(Projections.constructor(ConcertThumbnail.class,
concert.poster.url,
concert.concertInfo.title,
concertHall.name,
concert.concertInfo.dateInfo.startDate,
concert.concertInfo.dateInfo.endDate,
concert.id
))
.from(concert)
.leftJoin(concertHall).on(concert.code.hallCode.eq(concertHall.id))
.where(concert.concertInfo.dateInfo.endDate.goe(LocalDate.now()))
.orderBy(concert.concertInfo.dateInfo.startDate.asc())
.limit(5)
.fetch();
}

private ConstructorExpression<ConcertDetailResponse> concertDetailProjection() {
return Projections.constructor(ConcertDetailResponse.class,
concert.poster,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import com.backend.allreva.concert.command.domain.Concert;
import com.backend.allreva.concert.command.domain.ConcertRepository;
import com.backend.allreva.concert.query.application.dto.ConcertDetailResponse;
import com.backend.allreva.concert.query.application.dto.ConcertThumbnail;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

Expand Down Expand Up @@ -78,4 +80,10 @@ public void addViewCounts() {
);
viewCountCache.clear();
}

@Override
public List<ConcertThumbnail> getConcertMainThumbnails(){
return concertJpaRepository.getConcertMainThumbnails();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import co.elastic.clients.elasticsearch._types.SortOptions;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import co.elastic.clients.json.JsonData;
import com.backend.allreva.concert.exception.search.ElasticSearchException;
import com.backend.allreva.concert.query.application.domain.ConcertDocument;
import com.backend.allreva.concert.query.application.domain.value.SearchField;
Expand Down Expand Up @@ -68,18 +69,44 @@ private NativeQuery getNativeQuery(
}

private Query buildSearchQuery(final SearchField searchField, final String searchTerm) {
if (!StringUtils.hasText(searchTerm)) {
return Query.of(q -> q
.bool(b -> b
.filter(f -> f
.range(r -> r
.field("eddate")
.gte(JsonData.of("now"))
)
)
)
);
}

// 검색어가 있는 경우의 퍼지 매칭 쿼리
if (StringUtils.hasText(searchTerm)) {
return Query.of(q -> q
.match(m -> m
.field(searchField.getFieldName())
.query(searchTerm)
.fuzziness("AUTO")
.bool(b -> b
.must(m -> m
.match(mt -> mt
.field(searchField.getFieldName())
.query(searchTerm)
.fuzziness("AUTO")
)
)
.filter(f -> f
.range(r -> r
.field("eddate")
.gte(JsonData.of("now"))
)
)
)
);
}

return Query.of(q -> q.matchAll(m -> m));
}


private SortOptions buildPrimarySort(final SortDirection sortDirection) {
return SortOptions.of(s -> s
.field(f -> f
Expand Down Expand Up @@ -107,7 +134,6 @@ private String getSortField(final SortDirection sortDirection) {
}

private SortOrder getSortOrder(final SortDirection sortDirection) {
return sortDirection == SortDirection.DATE ? SortOrder.Desc : SortOrder.Asc;
return sortDirection == SortDirection.DATE ? SortOrder.Asc : SortOrder.Desc;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,8 @@ public ConcertMainResponse getConcertMain(

}

public List<ConcertThumbnail> getConcertMainList() {
return concertRepository.getConcertMainThumbnails();
}

}
29 changes: 16 additions & 13 deletions src/main/java/com/backend/allreva/concert/ui/ConcertController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.backend.allreva.concert.query.application.ConcertQueryService;
import com.backend.allreva.concert.query.application.dto.ConcertMainResponse;
import com.backend.allreva.concert.query.application.dto.ConcertDetailResponse;
import com.backend.allreva.concert.query.application.dto.ConcertThumbnail;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
Expand Down Expand Up @@ -48,25 +49,27 @@ public Response<ConcertDetailResponse> findConcertDetail(
"이전 SearchAfter에 있는 값들을 순서대로 넣어주어야 합니다."
)
@GetMapping("/list")
public Response<ConcertMainResponse> getConcertMain(
@RequestParam(defaultValue = "")
final String region,
@RequestParam(defaultValue = "DATE")
final SortDirection sortDirection,
@RequestParam(defaultValue = "7")
final int PageSize,
@RequestParam(required = false)
final String searchAfter1,
@RequestParam(required = false)
final String searchAfter2
public Response<ConcertMainResponse> getConcertList(
@RequestParam(defaultValue = "") final String region,
@RequestParam(defaultValue = "DATE") final SortDirection sortDirection,
@RequestParam(defaultValue = "7") final int PageSize,
@RequestParam(required = false) final String searchAfter1,
@RequestParam(required = false) final String searchAfter2

){
) {
List<Object> searchAfter = Stream.of(searchAfter1, searchAfter2)
.filter(Objects::nonNull)
.collect(Collectors.toList());
ConcertMainResponse concertMain = concertQueryService.getConcertMain(region, searchAfter, PageSize, sortDirection);
return Response.onSuccess(concertMain);
}


@GetMapping("/main")
@Operation(
summary = "첫 화면 콘서트 API 입니다.",
description = "첫 화면 콘서트 API 입니다. 현재 날짜에서 가장 가까운 콘서트 순으로 5개 정렬"
)
public Response<List<ConcertThumbnail>> getConcertMainList(){
return Response.onSuccess(concertQueryService.getConcertMainList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import co.elastic.clients.elasticsearch._types.ElasticsearchException;
import co.elastic.clients.elasticsearch._types.SortOptions;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import co.elastic.clients.json.JsonData;
import com.backend.allreva.concert.exception.search.ElasticSearchException;
import com.backend.allreva.rent.query.application.domain.RentDocument;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -52,16 +54,32 @@ private NativeQuery getNativeQuery(
}

private Query buildSearchQuery(final String searchTerm) {
BoolQuery.Builder boolQuery = new BoolQuery.Builder();

// 날짜 필터 추가 (현재 시점 이후 데이터만)
boolQuery.filter(f -> f
.range(r -> r
.field("eddate")
.gte(JsonData.of("now"))
)
);

// 검색어가 있는 경우
if (StringUtils.hasText(searchTerm)) {
return Query.of(q -> q
.match(m -> m
boolQuery.must(m -> m
.match(mt -> mt
.field("title.mixed")
.query(searchTerm)
.fuzziness("AUTO")
)
);
} else {
boolQuery.must(m -> m
.matchAll(ma -> ma)
);
}
return Query.of(q -> q.matchAll(m -> m));

return Query.of(q -> q.bool(boolQuery.build()));
}


Expand Down
Original file line number Diff line number Diff line change
@@ -1,39 +1,30 @@
package com.backend.allreva.rent.infra;

import static com.backend.allreva.concert.command.domain.QConcert.concert;
import static com.backend.allreva.hall.command.domain.QConcertHall.concertHall;
import static com.backend.allreva.rent.command.domain.QRent.rent;
import static com.backend.allreva.rent.command.domain.QRentBoardingDate.rentBoardingDate;
import static com.backend.allreva.rent.command.domain.QRentJoin.rentJoin;
import static com.querydsl.core.types.Projections.list;

import com.backend.allreva.common.util.DateHolder;
import com.backend.allreva.rent.command.domain.value.BoardingType;
import com.backend.allreva.rent.command.domain.value.RefundType;
import com.backend.allreva.rent.command.domain.value.Region;
import com.backend.allreva.rent.query.application.RentQueryRepository;
import com.backend.allreva.rent.query.application.dto.DepositAccountResponse;
import com.backend.allreva.rent.query.application.dto.RentAdminDetailResponse;
import com.backend.allreva.rent.query.application.dto.RentAdminSummaryResponse;
import com.backend.allreva.rent.query.application.dto.RentDetailResponse;
import com.backend.allreva.rent.query.application.dto.RentAdminJoinDetailResponse;
import com.backend.allreva.rent.query.application.dto.RentJoinSummaryResponse;
import com.backend.allreva.rent.query.application.dto.RentSummaryResponse;
import com.backend.allreva.rent.query.application.dto.*;
import com.backend.allreva.survey.query.application.dto.SortType;
import com.querydsl.core.types.ConstructorExpression;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.ExpressionUtils;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.*;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.NumberExpression;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import static com.backend.allreva.concert.command.domain.QConcert.concert;
import static com.backend.allreva.hall.command.domain.QConcertHall.concertHall;
import static com.backend.allreva.rent.command.domain.QRent.rent;
import static com.backend.allreva.rent.command.domain.QRentBoardingDate.rentBoardingDate;
import static com.backend.allreva.rent.command.domain.QRentJoin.rentJoin;
import static com.querydsl.core.types.Projections.list;

@Repository
@RequiredArgsConstructor
Expand Down Expand Up @@ -86,6 +77,26 @@ public List<RentSummaryResponse> findRentSummaries(
.limit(pageSize)
.fetch();
}
@Override
public List<RentSummaryResponse> findRentMainSummaries(){
return queryFactory
.select(Projections.constructor(RentSummaryResponse.class,
rent.id,
rent.detailInfo.title,
rent.operationInfo.boardingArea,
rent.additionalInfo.endDate,
rent.detailInfo.image.url
))
.from(rent)
.where(
rent.additionalInfo.endDate.goe(dateHolder.getDate()),
rent.isClosed.eq(false)
)
.groupBy(rent.id)
.orderBy(rent.additionalInfo.endDate.asc())
.limit(3)
.fetch();
}

private BooleanExpression getRegionCondition(final Region region) {
return region == null ? null : rent.detailInfo.region.eq(region);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,6 @@ public interface RentQueryRepository {
List<RentAdminJoinDetailResponse> findRentAdminJoinDetails(Long memberId, Long rentId, LocalDate boardingDate);

List<RentJoinSummaryResponse> findRentJoinSummariesByMemberId(Long memberId);

List<RentSummaryResponse> findRentMainSummaries();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,14 @@

import com.backend.allreva.rent.command.domain.value.Region;
import com.backend.allreva.rent.exception.RentNotFoundException;
import com.backend.allreva.rent.query.application.dto.DepositAccountResponse;
import com.backend.allreva.rent.query.application.dto.RentAdminDetailResponse;
import com.backend.allreva.rent.query.application.dto.RentAdminJoinDetailResponse;
import com.backend.allreva.rent.query.application.dto.RentAdminSummaryResponse;
import com.backend.allreva.rent.query.application.dto.RentDetailResponse;
import com.backend.allreva.rent.query.application.dto.RentJoinSummaryResponse;
import com.backend.allreva.rent.query.application.dto.RentSummaryResponse;
import com.backend.allreva.rent.query.application.dto.*;
import com.backend.allreva.survey.query.application.dto.SortType;
import java.time.LocalDate;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.List;

@Service
@RequiredArgsConstructor
public class RentQueryService {
Expand All @@ -31,6 +26,10 @@ public List<RentSummaryResponse> getRentSummaries(
return rentQueryRepository.findRentSummaries(region, sortType, lastEndDate, lastId, pageSize);
}

public List<RentSummaryResponse> getRentMainSummaries(){
return rentQueryRepository.findRentMainSummaries();
}

public RentDetailResponse getRentDetailById(final Long id) {
return rentQueryRepository.findRentDetailById(id)
.orElseThrow(RentNotFoundException::new);
Expand Down
Loading

0 comments on commit 8a6e26d

Please sign in to comment.