diff --git a/src/main/java/project/flipnote/group/controller/GroupController.java b/src/main/java/project/flipnote/group/controller/GroupController.java index 403b5b39..64ef4b9b 100644 --- a/src/main/java/project/flipnote/group/controller/GroupController.java +++ b/src/main/java/project/flipnote/group/controller/GroupController.java @@ -94,4 +94,15 @@ public ResponseEntity> findGroup( return ResponseEntity.ok(res); } + + //내 그룹 전체 조회 + @GetMapping("/me") + public ResponseEntity> findMyGroup( + @AuthenticationPrincipal AuthPrinciple authPrinciple, + @Valid @ModelAttribute GroupListRequest req + ) { + CursorPagingResponse res = groupService.findMyGroup(authPrinciple, req); + + return ResponseEntity.ok(res); + } } diff --git a/src/main/java/project/flipnote/group/repository/GroupRepositoryCustom.java b/src/main/java/project/flipnote/group/repository/GroupRepositoryCustom.java index d410eb3b..22decba9 100644 --- a/src/main/java/project/flipnote/group/repository/GroupRepositoryCustom.java +++ b/src/main/java/project/flipnote/group/repository/GroupRepositoryCustom.java @@ -7,4 +7,6 @@ public interface GroupRepositoryCustom { List findAllByCursor(Long lastId, Category category, int pageSize); + + List findAllByCursorAndUserId(Long lastId, Category category, int pageSize, Long userId); } diff --git a/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java b/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java index 0865cf17..ddd162e0 100644 --- a/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java +++ b/src/main/java/project/flipnote/group/repository/GroupRepositoryImpl.java @@ -10,6 +10,7 @@ import lombok.RequiredArgsConstructor; import project.flipnote.group.entity.Category; import project.flipnote.group.entity.QGroup; +import project.flipnote.group.entity.QGroupMember; import project.flipnote.group.model.GroupInfo; @RequiredArgsConstructor @@ -18,6 +19,7 @@ public class GroupRepositoryImpl implements GroupRepositoryCustom { private final JPAQueryFactory queryFactory; QGroup group = QGroup.group; + QGroupMember groupMember = QGroupMember.groupMember; @Override public List findAllByCursor(Long lastId, Category category, int pageSize) { @@ -47,4 +49,34 @@ public List findAllByCursor(Long lastId, Category category, int pageS .fetch(); } + @Override + public List findAllByCursorAndUserId(Long lastId, Category category, int pageSize, Long userId) { + BooleanBuilder where = new BooleanBuilder() + .and(group.deletedAt.isNull()); + + if (lastId != null) { + where.and(group.id.lt(lastId)); + } + + if (category != null) { + where.and(group.category.eq(category)); + } + + return queryFactory.select(Projections.constructor( + GroupInfo.class, + group.id, + group.name, + group.description, + group.category, + group.imageUrl + )) + .from(groupMember) + .join(groupMember.group, group) + .on(groupMember.user.id.eq(userId)) + .where(where) + .orderBy(group.id.desc()) + .limit(pageSize+1) + .fetch(); + } + } diff --git a/src/main/java/project/flipnote/group/service/GroupService.java b/src/main/java/project/flipnote/group/service/GroupService.java index decc06be..49cb337f 100644 --- a/src/main/java/project/flipnote/group/service/GroupService.java +++ b/src/main/java/project/flipnote/group/service/GroupService.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import project.flipnote.common.exception.BizException; @@ -331,15 +332,7 @@ public CursorPagingResponse findGroup(AuthPrinciple authPrinciple, Gr List groups = groupRepository.findAllByCursor(req.getCursorId(), category, req.getSize()); - boolean hasNext = groups.size() > req.getSize(); - - if (hasNext) { - groups = groups.subList(0, req.getSize()); - } - - Long nextCursor = hasNext ? groups.get(groups.size() - 1).groupId() : null; - - return CursorPagingResponse.of(groups, hasNext, nextCursor); + return createGroupInfoCursorPagingResponse(req, groups); } private Category convertCategory(String rawCategory) { @@ -365,4 +358,38 @@ private Category convertCategory(String rawCategory) { public boolean existsMember(Long groupId, Long userId) { return groupMemberRepository.existsByGroup_IdAndUser_Id(groupId, userId); } + + /** + * 내가 가입한 그룹 전체 조회하기 + * + * @param authPrinciple 회원 accessToken + * @param req 필터링 + * @return + */ + public CursorPagingResponse findMyGroup(AuthPrinciple authPrinciple, GroupListRequest req) { + //1. 유저 가져오기 + UserProfile user = getUser(authPrinciple); + + //2. 카테고리 변환 + Category category = convertCategory(req.getCategory()); + + List groups = groupRepository.findAllByCursorAndUserId(req.getCursorId(), category, req.getSize(), + user.getId()); + + return createGroupInfoCursorPagingResponse(req, groups); + } + + //리스트 조회시 response 생성 + private CursorPagingResponse createGroupInfoCursorPagingResponse(GroupListRequest req, + List groups) { + boolean hasNext = groups.size() > req.getSize(); + + if (hasNext) { + groups = groups.subList(0, req.getSize()); + } + + Long nextCursor = hasNext ? groups.get(groups.size() - 1).groupId() : null; + + return CursorPagingResponse.of(groups, hasNext, nextCursor); + } }