From 8bbbdfa7ee27fcd9eb6be97c3b6955a21fc330e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=8A=B9=EB=AF=BC?= <101695929+min429@users.noreply.github.com> Date: Sat, 31 Aug 2024 19:41:35 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=82=B4=EA=B0=80=20=EC=93=B4=20?= =?UTF-8?q?=EB=8F=99=ED=96=89=EA=B8=80=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20api=EB=A5=BC=20=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= =?UTF-8?q?.=20(#45)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 메소드 이름을 변경한다. * feat: 내가 쓴 동행글 목록 조회 api를 구현한다. * refactor: 누락된 import를 추가한다. --- .../api/AccompanyBoardController.java | 8 ++++ .../AccompanyBoardRepositoryImpl.java | 39 ++++++++++++++++++- .../AccompanyBoardRepositoryCustom.java | 10 +++-- .../service/AccompanyBoardService.java | 14 +++++-- 4 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/dnd/accompany/domain/accompany/api/AccompanyBoardController.java b/src/main/java/com/dnd/accompany/domain/accompany/api/AccompanyBoardController.java index a265c1a..ba62661 100644 --- a/src/main/java/com/dnd/accompany/domain/accompany/api/AccompanyBoardController.java +++ b/src/main/java/com/dnd/accompany/domain/accompany/api/AccompanyBoardController.java @@ -66,6 +66,14 @@ public ResponseEntity> readAll( return ResponseEntity.ok(accompanyBoardService.getAllBoards(request, region)); } + @Operation(summary = "내가 쓴 동행글 목록 조회") + @PostMapping("/mine") + public ResponseEntity> readMine( + @RequestBody @Valid PageRequest request, + @AuthenticationPrincipal JwtAuthentication user) { + return ResponseEntity.ok(accompanyBoardService.getMyBoards(request, user.getId())); + } + @Operation(summary = "동행글 상세 조회") @GetMapping("/{id}") public ResponseEntity read(@PathVariable Long id) { diff --git a/src/main/java/com/dnd/accompany/domain/accompany/infrastructure/querydsl/AccompanyBoardRepositoryImpl.java b/src/main/java/com/dnd/accompany/domain/accompany/infrastructure/querydsl/AccompanyBoardRepositoryImpl.java index 3bbb0f3..c8f48a0 100644 --- a/src/main/java/com/dnd/accompany/domain/accompany/infrastructure/querydsl/AccompanyBoardRepositoryImpl.java +++ b/src/main/java/com/dnd/accompany/domain/accompany/infrastructure/querydsl/AccompanyBoardRepositoryImpl.java @@ -4,6 +4,7 @@ import static com.dnd.accompany.domain.accompany.api.dto.PageRequest.*; import static com.dnd.accompany.domain.accompany.entity.QAccompanyBoard.*; 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.QAccompanyTag.*; import static com.dnd.accompany.domain.accompany.entity.QAccompanyUser.*; import static com.dnd.accompany.domain.accompany.entity.enums.Region.*; @@ -12,12 +13,14 @@ import java.util.List; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.domain.SliceImpl; import org.springframework.stereotype.Repository; import com.dnd.accompany.domain.accompany.api.dto.FindBoardThumbnailsResult; +import com.dnd.accompany.domain.accompany.api.dto.FindSlicesResult; import com.dnd.accompany.domain.accompany.entity.enums.Region; import com.dnd.accompany.domain.accompany.infrastructure.querydsl.interfaces.AccompanyBoardRepositoryCustom; import com.querydsl.core.BooleanBuilder; @@ -102,7 +105,7 @@ public Slice findBoardThumbnails(String cursor, int s } @Override - public Slice findBoardThumbnailsByUserId(String cursor, int size, Long userId) { + public Slice findRecordsByUserId(String cursor, int size, Long userId) { List content = queryFactory .select(Projections.constructor(FindBoardThumbnailsResult.class, accompanyBoard.id, @@ -134,6 +137,40 @@ public Slice findBoardThumbnailsByUserId(String curso return createSlice(size, content); } + @Override + public Slice findBoardThumbnailsByHostId(String cursor, int size, Long hostId) { + List 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(accompanyUser.user.id.eq(hostId)) + .where(isHost()) + .where(cursorCondition(cursor, accompanyBoard.updatedAt, accompanyBoard.id)) + .groupBy(accompanyBoard.id, accompanyBoard.title, accompanyBoard.region, + accompanyBoard.startDate, accompanyBoard.endDate, user.nickname, + accompanyUser.id) + .orderBy(accompanyBoard.updatedAt.desc(), accompanyBoard.id.desc()) + .limit(size + 1) + .fetch(); + + return createSlice(size, content); + } + @Override public boolean isHostOfBoard(Long userId, Long boardId) { Integer fetchCount = queryFactory.selectOne() diff --git a/src/main/java/com/dnd/accompany/domain/accompany/infrastructure/querydsl/interfaces/AccompanyBoardRepositoryCustom.java b/src/main/java/com/dnd/accompany/domain/accompany/infrastructure/querydsl/interfaces/AccompanyBoardRepositoryCustom.java index 310ec18..cd547be 100644 --- a/src/main/java/com/dnd/accompany/domain/accompany/infrastructure/querydsl/interfaces/AccompanyBoardRepositoryCustom.java +++ b/src/main/java/com/dnd/accompany/domain/accompany/infrastructure/querydsl/interfaces/AccompanyBoardRepositoryCustom.java @@ -1,17 +1,19 @@ package com.dnd.accompany.domain.accompany.infrastructure.querydsl.interfaces; -import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import com.dnd.accompany.domain.accompany.api.dto.FindBoardThumbnailsResult; import com.dnd.accompany.domain.accompany.entity.enums.Region; public interface AccompanyBoardRepositoryCustom { - Slice findBoardThumbnailsByKeyword(String cursor, int size, String keyword); - + Slice findBoardThumbnails(String cursor, int size, Region region); - Slice findBoardThumbnailsByUserId(String cursor, int size, Long userId); + Slice findRecordsByUserId(String cursor, int size, Long userId); + + Slice findBoardThumbnailsByHostId(String cursor, int size, Long userId); + + Slice findBoardThumbnailsByKeyword(String cursor, int size, String keyword); boolean isHostOfBoard(Long userId, Long boardId); } diff --git a/src/main/java/com/dnd/accompany/domain/accompany/service/AccompanyBoardService.java b/src/main/java/com/dnd/accompany/domain/accompany/service/AccompanyBoardService.java index 16020ba..ffb1701 100644 --- a/src/main/java/com/dnd/accompany/domain/accompany/service/AccompanyBoardService.java +++ b/src/main/java/com/dnd/accompany/domain/accompany/service/AccompanyBoardService.java @@ -5,7 +5,6 @@ import java.util.List; -import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -50,7 +49,15 @@ public AccompanyBoard save(CreateAccompanyBoardRequest request) { } @Transactional(readOnly = true) - public PageResponse getMatchedBoards(PageRequest request, String keyword) { + public PageResponse getMyBoards(PageRequest request, Long userId) { + Slice sliceResult = accompanyBoardRepository.findBoardThumbnailsByHostId(request.cursor(), request.size(), userId); + + List thumbnails = getBoardThumbnails(sliceResult.getContent()); + + return new PageResponse<>(sliceResult.hasNext(), thumbnails, getLastCursor(sliceResult.getContent())); + } + + public PageResponse getMatchedBoards(PageRequest request, String keyword) { Slice sliceResult = accompanyBoardRepository.findBoardThumbnailsByKeyword(request.cursor(), request.size(), keyword); List thumbnails = getBoardThumbnails(sliceResult.getContent()); @@ -58,6 +65,7 @@ public PageResponse getMatchedBoards(PageRequest reques return new PageResponse<>(sliceResult.hasNext(), thumbnails, getLastCursor(sliceResult.getContent())); } + @Transactional(readOnly = true) public PageResponse getAllBoards(PageRequest request, Region region) { Slice sliceResult = accompanyBoardRepository.findBoardThumbnails(request.cursor(), request.size(), region); @@ -68,7 +76,7 @@ public PageResponse getAllBoards(PageRequest request, R @Transactional(readOnly = true) public PageResponse getAllRecords(PageRequest request, Long userId) { - Slice sliceResult = accompanyBoardRepository.findBoardThumbnailsByUserId(request.cursor(), request.size(), userId); + Slice sliceResult = accompanyBoardRepository.findRecordsByUserId(request.cursor(), request.size(), userId); List thumbnails = getBoardThumbnails(sliceResult.getContent());