Skip to content

Commit 24ff8d5

Browse files
Feat: [FN-308] 특정 그룹 조회 API 구현
Feat: [FN-308] 특정 그룹 조회 API 구현
2 parents b0532df + a05f205 commit 24ff8d5

16 files changed

Lines changed: 438 additions & 12 deletions

src/main/java/flipnote/group/adapter/in/web/GroupController.java

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.springframework.http.ResponseEntity;
44
import org.springframework.web.bind.annotation.DeleteMapping;
55
import org.springframework.web.bind.annotation.GetMapping;
6+
import org.springframework.web.bind.annotation.ModelAttribute;
67
import org.springframework.web.bind.annotation.PathVariable;
78
import org.springframework.web.bind.annotation.PostMapping;
89
import org.springframework.web.bind.annotation.PutMapping;
@@ -13,9 +14,10 @@
1314

1415
import flipnote.group.api.dto.request.ChangeGroupRequestDto;
1516
import flipnote.group.api.dto.request.CreateGroupRequestDto;
17+
import flipnote.group.api.dto.request.GroupListRequestDto;
1618
import flipnote.group.api.dto.response.ChangeGroupResponseDto;
1719
import flipnote.group.api.dto.response.CreateGroupResponseDto;
18-
import flipnote.group.api.dto.response.FindGroupMemberResponseDto;
20+
import flipnote.group.api.dto.response.CursorPagingResponseDto;
1921
import flipnote.group.api.dto.response.FindGroupResponseDto;
2022
import flipnote.group.application.port.in.ChangeGroupUseCase;
2123
import flipnote.group.application.port.in.CreateGroupUseCase;
@@ -25,7 +27,7 @@
2527
import flipnote.group.application.port.in.command.CreateGroupCommand;
2628
import flipnote.group.application.port.in.command.DeleteGroupCommand;
2729
import flipnote.group.application.port.in.command.FindGroupCommand;
28-
import flipnote.group.application.port.in.command.FindGroupMemberCommand;
30+
import flipnote.group.domain.model.group.GroupInfo;
2931
import jakarta.validation.Valid;
3032
import lombok.RequiredArgsConstructor;
3133

@@ -119,7 +121,6 @@ public ResponseEntity<FindGroupResponseDto> findGroup(
119121

120122
/**
121123
* 그룹 삭제
122-
* todo 추후 권한 체크 후 권한 확인 후 삭제
123124
* @param userId
124125
* @param groupId
125126
* @return
@@ -136,11 +137,52 @@ public ResponseEntity<Void> deleteGroup(
136137
return ResponseEntity.noContent().build();
137138
}
138139

139-
//todo 그룹 전체 조회
140+
/**
141+
* 그룹 전체 조회
142+
* @param userId
143+
* @param req
144+
* @return
145+
*/
146+
@GetMapping
147+
public ResponseEntity<CursorPagingResponseDto<GroupInfo>> findGroup(
148+
@RequestHeader("X-USER-ID") Long userId,
149+
@Valid @ModelAttribute GroupListRequestDto req
150+
) {
151+
CursorPagingResponseDto<GroupInfo> res = findGroupUseCase.findAllGroup(userId, req);
152+
153+
return ResponseEntity.ok(res);
154+
}
155+
156+
/**
157+
* 내가 가입한 그룹 전체 조회
158+
* @param userId
159+
* @param req
160+
* @return
161+
*/
162+
@GetMapping("/me")
163+
public ResponseEntity<CursorPagingResponseDto<GroupInfo>> findMyGroup(
164+
@RequestHeader("X-USER-ID") Long userId,
165+
@Valid @ModelAttribute GroupListRequestDto req
166+
) {
167+
CursorPagingResponseDto<GroupInfo> res = findGroupUseCase.findMyGroup(userId, req);
140168

141-
//todo 내 그룹 전체 조회
169+
return ResponseEntity.ok(res);
170+
}
142171

143-
//todo 내가 생성한 그룹 전체 조회
172+
/**
173+
* 내가 생성한 그룹 전체 조회
174+
* @param userId
175+
* @param req
176+
* @return
177+
*/
178+
@GetMapping("/created")
179+
public ResponseEntity<CursorPagingResponseDto<GroupInfo>> findCreatedGroup(
180+
@RequestHeader("X-USER-ID") Long userId,
181+
@Valid @ModelAttribute GroupListRequestDto req
182+
) {
183+
CursorPagingResponseDto<GroupInfo> res = findGroupUseCase.findCreatedGroup(userId, req);
144184

185+
return ResponseEntity.ok(res);
186+
}
145187

146188
}

src/main/java/flipnote/group/adapter/out/persistence/GroupMemberRepositoryAdapter.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ public void save(GroupMemberEntity groupMember) {
3030
* 유저가 그룹 내에 있는지 체크
3131
* @param groupId
3232
* @param userId
33-
* @return
3433
*/
3534
@Override
3635
public void existsUserInGroup(Long groupId, Long userId) {

src/main/java/flipnote/group/adapter/out/persistence/GroupRepositoryAdapter.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package flipnote.group.adapter.out.persistence;
22

3+
import java.util.List;
34

45
import org.springframework.stereotype.Repository;
56

67
import flipnote.group.adapter.out.entity.GroupEntity;
78
import flipnote.group.application.port.out.GroupRepositoryPort;
8-
import flipnote.group.infrastructure.persistence.jpa.GroupRepository;
9+
import flipnote.group.domain.model.group.Category;
10+
import flipnote.group.domain.model.group.GroupInfo;
11+
import flipnote.group.infrastructure.persistence.querydsl.GroupRepository;
912
import lombok.RequiredArgsConstructor;
1013

1114
@Repository
@@ -39,4 +42,19 @@ public void delete(Long groupId) {
3942
}
4043
groupRepository.deleteById(groupId);
4144
}
45+
46+
@Override
47+
public List<GroupInfo> findAllByCursor(Long cursorId, Category category, int size) {
48+
return groupRepository.findAllByCursor(cursorId, category, size);
49+
}
50+
51+
@Override
52+
public List<GroupInfo> findAllByCursorAndUserId(Long cursorId, Category category, int size, Long userId) {
53+
return groupRepository.findAllByCursorAndUserId(cursorId, category, size, userId);
54+
}
55+
56+
@Override
57+
public List<GroupInfo> findAllByCursorAndCreatedUserId(Long cursorId, Category category, int size, Long userId) {
58+
return findAllByCursorAndCreatedUserId(cursorId, category, size, userId);
59+
}
4260
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package flipnote.group.api.dto.request;
2+
3+
import org.springframework.data.domain.PageRequest;
4+
import org.springframework.data.domain.Sort;
5+
import org.springframework.util.StringUtils;
6+
7+
import jakarta.validation.constraints.Max;
8+
import jakarta.validation.constraints.Min;
9+
import lombok.Getter;
10+
import lombok.Setter;
11+
12+
@Getter
13+
@Setter
14+
public class CursorPagingRequest {
15+
16+
private String cursor;
17+
18+
@Min(1)
19+
@Max(30)
20+
private Integer size = 10;
21+
22+
private String sortBy;
23+
24+
private String order = "desc";
25+
26+
public Long getCursorId() {
27+
if (!StringUtils.hasText(cursor)) {
28+
return null;
29+
}
30+
31+
final String normalized = cursor.trim();
32+
if (normalized.isEmpty()) {
33+
return null;
34+
}
35+
36+
try {
37+
return Long.valueOf(normalized);
38+
} catch (NumberFormatException ex) {
39+
return null;
40+
}
41+
}
42+
43+
public PageRequest getPageRequest() {
44+
if (sortBy == null || sortBy.isEmpty()) {
45+
return PageRequest.of(0, size);
46+
} else {
47+
Sort.Direction direction;
48+
try {
49+
direction = Sort.Direction.fromString(order);
50+
} catch (IllegalArgumentException e) {
51+
direction = Sort.Direction.DESC;
52+
}
53+
54+
return PageRequest.of(0, size, Sort.by(direction, sortBy));
55+
}
56+
}
57+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package flipnote.group.api.dto.request;
2+
3+
import org.springframework.data.domain.PageRequest;
4+
import org.springframework.data.domain.Sort;
5+
6+
import flipnote.group.domain.model.group.Category;
7+
import lombok.Getter;
8+
import lombok.Setter;
9+
10+
@Setter
11+
@Getter
12+
public class GroupListRequestDto extends CursorPagingRequest {
13+
14+
private Category category;
15+
16+
@Override
17+
public PageRequest getPageRequest() {
18+
return PageRequest.of(0, getSize(), Sort.by(Sort.Direction.DESC, "id"));
19+
}
20+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package flipnote.group.api.dto.response;
2+
3+
import java.util.List;
4+
import java.util.Objects;
5+
6+
public record CursorPagingResponseDto<T>(
7+
List<T> content,
8+
boolean hasNext,
9+
String nextCursor,
10+
int size
11+
) {
12+
13+
public static <T> CursorPagingResponseDto<T> of(List<T> content, boolean hasNext, String nextCursor) {
14+
return new CursorPagingResponseDto<>(content, hasNext, hasNext ? nextCursor : null, content.size());
15+
}
16+
17+
public static <T> CursorPagingResponseDto<T> of(List<T> content, boolean hasNext, Long nextCursorId) {
18+
String nextCursor = Objects.toString(nextCursorId, null);
19+
return of(content, hasNext, nextCursor);
20+
}
21+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
package flipnote.group.application.port.in;
22

3+
import flipnote.group.api.dto.request.GroupListRequestDto;
4+
import flipnote.group.api.dto.response.CursorPagingResponseDto;
35
import flipnote.group.application.port.in.command.FindGroupCommand;
46
import flipnote.group.application.port.in.result.FindGroupResult;
7+
import flipnote.group.domain.model.group.GroupInfo;
58

69
public interface FindGroupUseCase {
710
FindGroupResult findGroup(FindGroupCommand cmd);
11+
12+
CursorPagingResponseDto<GroupInfo> findAllGroup(Long userId, GroupListRequestDto req);
13+
14+
CursorPagingResponseDto<GroupInfo> findMyGroup(Long userId, GroupListRequestDto req);
15+
16+
CursorPagingResponseDto<GroupInfo> findCreatedGroup(Long userId, GroupListRequestDto req);
17+
818
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package flipnote.group.application.port.in.result;
2+
3+
import java.util.List;
4+
5+
import flipnote.group.domain.model.group.GroupInfo;
6+
7+
public record FindAllGroupResult(List<GroupInfo> groups) {
8+
}

src/main/java/flipnote/group/application/port/out/GroupRepositoryPort.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package flipnote.group.application.port.out;
22

3+
4+
import java.util.List;
5+
6+
import flipnote.group.domain.model.group.Category;
7+
import flipnote.group.domain.model.group.GroupInfo;
38
import flipnote.group.adapter.out.entity.GroupEntity;
49

510
public interface GroupRepositoryPort {
@@ -8,4 +13,10 @@ public interface GroupRepositoryPort {
813
GroupEntity findById(Long id);
914

1015
void delete(Long id);
16+
17+
List<GroupInfo> findAllByCursor(Long cursorId, Category category, int size);
18+
19+
List<GroupInfo> findAllByCursorAndUserId(Long cursorId, Category category, int size, Long userId);
20+
21+
List<GroupInfo> findAllByCursorAndCreatedUserId(Long cursorId, Category category, int size, Long userId);
1122
}

src/main/java/flipnote/group/application/service/ChangeGroupService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import flipnote.group.application.port.in.command.ChangeGroupCommand;
1010
import flipnote.group.application.port.in.result.ChangeGroupResult;
1111
import flipnote.group.domain.model.member.GroupMemberRole;
12-
import flipnote.group.infrastructure.persistence.jpa.GroupRepository;
12+
import flipnote.group.infrastructure.persistence.querydsl.GroupRepository;
1313
import flipnote.image.grpc.v1.GetUrlByReferenceRequest;
1414
import flipnote.image.grpc.v1.GetUrlByReferenceResponse;
1515
import flipnote.image.grpc.v1.ImageCommandServiceGrpc;

0 commit comments

Comments
 (0)