Skip to content

Commit

Permalink
Merge branch 'main' into ISSUE-210
Browse files Browse the repository at this point in the history
  • Loading branch information
min429 authored Aug 31, 2024
2 parents b4db843 + e766fb6 commit 2a41150
Show file tree
Hide file tree
Showing 13 changed files with 257 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,14 @@ public ResponseEntity<CreateAccompanyBoardResponse> create(
return ResponseEntity.ok(accompanyServiceFacade.createBoard(user.getId(), request));
}

@Operation(summary = "동행글 검색")
@PostMapping("/search")
public ResponseEntity<PageResponse<AccompanyBoardThumbnail>> search(
@RequestBody @Valid PageRequest request,
@RequestParam(value = "keyword") String keyword) {
return ResponseEntity.ok(accompanyBoardService.getMatchedBoards(request, keyword));
}

@Operation(summary = "동행글 목록 조회")
@PostMapping("/all")
public ResponseEntity<PageResponse<AccompanyBoardThumbnail>> readAll(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,17 @@ public enum Region {
Region(String description) {
this.description = description;
}

public String description() {
return description;
}

public static Region from(String keyword) {
for (Region region : Region.values()) {
if (region.description().contains(keyword)) {
return region;
}
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import static com.dnd.accompany.domain.accompany.entity.QAccompanyImage.*;
import static com.dnd.accompany.domain.accompany.entity.QAccompanyRequest.*;
import static com.dnd.accompany.domain.accompany.entity.QAccompanyUser.*;
import static com.dnd.accompany.domain.accompany.entity.enums.Region.*;
import static com.dnd.accompany.domain.accompany.entity.enums.Role.*;
import static com.dnd.accompany.domain.user.entity.QUser.*;

Expand All @@ -25,6 +26,7 @@
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;

import lombok.RequiredArgsConstructor;
Expand All @@ -35,6 +37,39 @@ public class AccompanyBoardRepositoryImpl implements AccompanyBoardRepositoryCus

private final JPAQueryFactory queryFactory;

@Override
public Slice<FindBoardThumbnailsResult> findBoardThumbnailsByKeyword(String cursor, int size, String keyword) {
List<FindBoardThumbnailsResult> content = queryFactory
.select(Projections.constructor(FindBoardThumbnailsResult.class,
accompanyBoard.id,
accompanyBoard.title,
accompanyBoard.region,
accompanyBoard.startDate,
accompanyBoard.endDate,
user.nickname,
Expressions.stringTemplate("GROUP_CONCAT(DISTINCT {0})", accompanyImage.imageUrl),
Expressions.stringTemplate(
"CONCAT(DATE_FORMAT({0}, '%Y%m%d%H%i%S'), LPAD(CAST({1} AS STRING), 6, '0'))",
accompanyBoard.updatedAt,
accompanyBoard.id
))
)
.from(accompanyUser)
.join(accompanyUser.accompanyBoard, accompanyBoard)
.join(accompanyUser.user, user)
.leftJoin(accompanyImage).on(accompanyImage.accompanyBoard.id.eq(accompanyBoard.id))
.where(isHost())
.where(isContains(keyword))
.where(cursorCondition(cursor, accompanyBoard.updatedAt, accompanyBoard.id))
.groupBy(accompanyBoard.id, accompanyBoard.title, accompanyBoard.region,
accompanyBoard.startDate, accompanyBoard.endDate, user.nickname)
.orderBy(accompanyBoard.updatedAt.desc(), accompanyBoard.id.desc())
.limit(size + 1)
.fetch();

return createSlice(size, content);
}

@Override
public Slice<FindBoardThumbnailsResult> findBoardThumbnails(String cursor, int size, Region region) {
List<FindBoardThumbnailsResult> content = queryFactory
Expand Down Expand Up @@ -161,4 +196,26 @@ private BooleanBuilder isRegion(Region region) {

return clause;
}

public BooleanExpression isRegionKeyword(String keyword) {
if(from(keyword) == null)
return accompanyBoard.region.isNull();

return accompanyBoard.region.eq(from(keyword));
}

private BooleanBuilder isContains(String keyword) {
BooleanBuilder booleanBuilder = new BooleanBuilder();
booleanBuilder.or(isRegionKeyword(keyword));
booleanBuilder.or(accompanyBoard.title.contains(keyword));
booleanBuilder.or(
JPAExpressions.selectOne()
.from(accompanyTag)
.where(accompanyTag.accompanyBoard.id.eq(accompanyBoard.id)
.and(accompanyTag.name.contains(keyword)))
.exists()
);

return booleanBuilder;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@
import com.dnd.accompany.domain.accompany.entity.enums.Region;

public interface AccompanyBoardRepositoryCustom {

Slice<FindBoardThumbnailsResult> findBoardThumbnails(String cursor, int size, Region region);

Slice<FindBoardThumbnailsResult> findRecordsByUserId(String cursor, int size, Long userId);

Slice<FindBoardThumbnailsResult> findBoardThumbnailsByHostId(String cursor, int size, Long userId);

Slice<FindBoardThumbnailsResult> findBoardThumbnailsByKeyword(String cursor, int size, String keyword);

boolean isHostOfBoard(Long userId, Long boardId);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.dnd.accompany.domain.accompany.service;

import static com.dnd.accompany.domain.accompany.api.dto.FindBoardThumbnailsResult.*;
import static com.dnd.accompany.domain.accompany.entity.AccompanyBoard.*;

import java.util.List;

Expand Down Expand Up @@ -56,6 +57,14 @@ public PageResponse<AccompanyBoardThumbnail> getMyBoards(PageRequest request, Lo
return new PageResponse<>(sliceResult.hasNext(), thumbnails, getLastCursor(sliceResult.getContent()));
}

public PageResponse<AccompanyBoardThumbnail> getMatchedBoards(PageRequest request, String keyword) {
Slice<FindBoardThumbnailsResult> sliceResult = accompanyBoardRepository.findBoardThumbnailsByKeyword(request.cursor(), request.size(), keyword);

List<AccompanyBoardThumbnail> thumbnails = getBoardThumbnails(sliceResult.getContent());

return new PageResponse<>(sliceResult.hasNext(), thumbnails, getLastCursor(sliceResult.getContent()));
}

@Transactional(readOnly = true)
public PageResponse<AccompanyBoardThumbnail> getAllBoards(PageRequest request, Region region) {
Slice<FindBoardThumbnailsResult> sliceResult = accompanyBoardRepository.findBoardThumbnails(request.cursor(), request.size(), region);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.dnd.accompany.domain.review.api;

import com.dnd.accompany.domain.auth.dto.jwt.JwtAuthentication;
import com.dnd.accompany.domain.review.api.dto.AllEvaluationResponses;
import com.dnd.accompany.domain.review.api.dto.CreateReviewRequest;
import com.dnd.accompany.domain.review.api.dto.ReviewDetailsResponse;
import com.dnd.accompany.domain.review.api.dto.ReviewDetailsResult;
Expand Down Expand Up @@ -63,9 +64,18 @@ public ResponseEntity<SimpleReviewResponses> getReviewList(
@Operation(summary = "받은 동행 평가 조회")
@GetMapping("/evaluations")
public ResponseEntity<SimpleEvaluationResponse> getEvaluation(
@AuthenticationPrincipal JwtAuthentication user
// @AuthenticationPrincipal JwtAuthentication user
) {
SimpleEvaluationResponse response = reviewService.getSimpleEvaluation(3L);
return ResponseEntity.ok(response);
}

@Operation(summary = "받은 모든 동행 평가 조회")
@GetMapping("/evaluations/all")
public ResponseEntity<AllEvaluationResponses> getEvaluations(
// @AuthenticationPrincipal JwtAuthentication user
) {
SimpleEvaluationResponse response = reviewService.getEvaluation(user.getId());
AllEvaluationResponses response = reviewService.getEvaluation(3L);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.dnd.accompany.domain.review.api.dto;

import lombok.Builder;

import java.util.List;

@Builder
public record AllEvaluationResponses (
List<EvaluationResponse> evaluationResponse,
int evaluationCount
){
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.dnd.accompany.domain.review.api.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;

@AllArgsConstructor
@Builder
public class EvaluationResponse {
@JsonProperty("type")
private String type;

@JsonProperty("count")
private long count;

public static EvaluationResponse create(TypeCountResult topResult) {
if (topResult != null) {
return EvaluationResponse.builder()
.type(topResult.getType() != null ? topResult.getType() : null)
.count(topResult.getCount())
.build();
} else {
return EvaluationResponse.builder()
.type(null)
.count(0)
.build();
}
}
}


Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package com.dnd.accompany.domain.review.api.dto;

import com.dnd.accompany.domain.review.entity.enums.PersonalityType;
import com.dnd.accompany.domain.review.entity.enums.TravelPreferenceType;
import com.dnd.accompany.domain.review.entity.enums.TravelStyleType;
import lombok.Builder;

import java.util.List;

@Builder
public record SimpleEvaluationResponse(
TravelStyleType travelStyle,
TravelPreferenceType travelPreference,
PersonalityType personalityType,
List<EvaluationResponse> evaluationResponse,
int evaluationCount
) {
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
package com.dnd.accompany.domain.review.api.dto;

import com.dnd.accompany.domain.review.entity.enums.PersonalityType;
import com.dnd.accompany.domain.review.entity.enums.TravelPreferenceType;
import com.dnd.accompany.domain.review.entity.enums.TravelStyleType;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class SimpleEvaluationResult {
private TravelStyleType travelStyle;
private TravelPreferenceType travelPreference;
private PersonalityType personalityType;
}
private List<TypeCountResult> travelStyles;
private List<TypeCountResult> travelPreferences;
private List<TypeCountResult> personalityTypes;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.dnd.accompany.domain.review.api.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class TypeCountResult {
private String type;
private long count;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import com.dnd.accompany.domain.review.api.dto.SimpleEvaluationResult;
import com.dnd.accompany.domain.review.api.dto.SimpleReviewResult;
import com.dnd.accompany.domain.review.api.dto.TypeCountResult;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
Expand All @@ -17,7 +17,6 @@
import static com.dnd.accompany.domain.review.entity.QTravelPreference.travelPreference;
import static com.dnd.accompany.domain.review.entity.QTravelStyle.travelStyle;
import static com.dnd.accompany.domain.user.entity.QUser.user;
import static com.querydsl.jpa.JPAExpressions.*;

@Repository
@RequiredArgsConstructor
Expand Down Expand Up @@ -47,36 +46,40 @@ public List<SimpleReviewResult> findAllByReceiverId(Long receiverId) {

@Override
public SimpleEvaluationResult findEvaluationsByReceiverId(Long userId) {
return jpaQueryFactory
.select(
Projections.constructor(SimpleEvaluationResult.class,
select(travelStyle.type)
.from(review)
.join(review.travelStyle, travelStyle)
.where(eqReceiver(userId))
.groupBy(travelStyle.type)
.orderBy(travelStyle.type.count().desc())
.limit(1),
List<TypeCountResult> travelStyleCounts = jpaQueryFactory
.select(Projections.constructor(TypeCountResult.class,
travelStyle.type.stringValue(),
travelStyle.type.count()
))
.from(travelStyle)
.join(travelStyle.review, review)
.where(eqReceiver(userId))
.groupBy(travelStyle.type)
.fetch();

select(travelPreference.type)
.from(review)
.join(review.travelPreference, travelPreference)
.where(eqReceiver(userId))
.groupBy(travelPreference.type)
.orderBy(travelPreference.type.count().desc())
.limit(1),
List<TypeCountResult> travelPreferenceCounts = jpaQueryFactory
.select(Projections.constructor(TypeCountResult.class,
travelPreference.type.stringValue(),
travelPreference.type.count()
))
.from(travelPreference)
.join(travelPreference.review, review)
.where(eqReceiver(userId))
.groupBy(travelPreference.type)
.fetch();

select(personality.type)
.from(review)
.join(review.personalityType, personality)
.where(eqReceiver(userId))
.groupBy(personality.type)
.orderBy(personality.type.count().desc())
.limit(1)
)
)
.from(review)
.fetchFirst();
List<TypeCountResult> personalityCounts = jpaQueryFactory
.select(Projections.constructor(TypeCountResult.class,
personality.type.stringValue(),
personality.type.count()
))
.from(personality)
.join(personality.review, review)
.where(eqReceiver(userId))
.groupBy(personality.type)
.fetch();

return new SimpleEvaluationResult(travelStyleCounts, travelPreferenceCounts, personalityCounts);
}

private BooleanExpression eqReceiver(Long receiverId) {
Expand Down
Loading

0 comments on commit 2a41150

Please sign in to comment.