Skip to content

Commit a3c1c04

Browse files
committed
feat: 내 초대장 목록 기능 추가
1 parent f69edcf commit a3c1c04

5 files changed

Lines changed: 74 additions & 1 deletion

File tree

src/main/java/doldol_server/doldol/invite/controller/InviteController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,18 @@ public ApiResponse<InviteResponse> createInvite(
3939
return ApiResponse.created(inviteService.createInvite(request, userDetails.getUserId()));
4040
}
4141

42+
@Operation(
43+
summary = "내 초대장 목록 조회",
44+
security = {@SecurityRequirement(name = "jwt")}
45+
)
46+
@GetMapping
47+
public ApiResponse<CursorPage<InviteResponse, Long>> getMyInvites(
48+
@ParameterObject @Valid CursorPageRequest request,
49+
@AuthenticationPrincipal CustomUserDetails userDetails
50+
) {
51+
return ApiResponse.ok(inviteService.getMyInvites(userDetails.getUserId(), request));
52+
}
53+
4254
@Operation(summary = "초대장 상세 조회")
4355
@GetMapping("/{inviteCode}")
4456
public ApiResponse<InviteResponse> getInvite(@PathVariable String inviteCode) {

src/main/java/doldol_server/doldol/invite/repository/InviteRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package doldol_server.doldol.invite.repository;
22

33
import doldol_server.doldol.invite.entity.Invite;
4+
import doldol_server.doldol.invite.repository.custom.InviteRepositoryCustom;
45
import org.springframework.data.jpa.repository.EntityGraph;
56
import org.springframework.data.jpa.repository.JpaRepository;
67

78
import java.util.Optional;
89

9-
public interface InviteRepository extends JpaRepository<Invite, Long> {
10+
public interface InviteRepository extends JpaRepository<Invite, Long>, InviteRepositoryCustom {
1011

1112
@EntityGraph(attributePaths = {"comments"})
1213
Optional<Invite> findWithCommentsByInviteCode(String inviteCode);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package doldol_server.doldol.invite.repository.custom;
2+
3+
import doldol_server.doldol.common.request.CursorPageRequest;
4+
import doldol_server.doldol.invite.dto.response.InviteResponse;
5+
6+
import java.util.List;
7+
8+
public interface InviteRepositoryCustom {
9+
10+
List<InviteResponse> findInvitesByUserId(Long userId, CursorPageRequest request);
11+
}
12+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package doldol_server.doldol.invite.repository.custom;
2+
3+
import com.querydsl.core.types.dsl.BooleanExpression;
4+
import com.querydsl.jpa.impl.JPAQueryFactory;
5+
import doldol_server.doldol.common.request.CursorPageRequest;
6+
import doldol_server.doldol.invite.dto.response.InviteResponse;
7+
import doldol_server.doldol.invite.entity.Invite;
8+
import doldol_server.doldol.invite.entity.QInvite;
9+
import lombok.RequiredArgsConstructor;
10+
11+
import java.util.List;
12+
13+
@RequiredArgsConstructor
14+
public class InviteRepositoryCustomImpl implements InviteRepositoryCustom {
15+
16+
private final JPAQueryFactory queryFactory;
17+
18+
@Override
19+
public List<InviteResponse> findInvitesByUserId(Long userId, CursorPageRequest request) {
20+
QInvite invite = QInvite.invite;
21+
22+
BooleanExpression cursorCondition = null;
23+
if (request.cursorId() != null) {
24+
cursorCondition = invite.inviteId.lt(request.cursorId());
25+
}
26+
27+
List<Invite> invites = queryFactory
28+
.selectFrom(invite)
29+
.where(
30+
invite.user.id.eq(userId),
31+
cursorCondition
32+
)
33+
.orderBy(invite.inviteId.desc())
34+
.limit(request.size() + 1L)
35+
.fetch();
36+
37+
return invites.stream()
38+
.map(InviteResponse::from)
39+
.toList();
40+
}
41+
}
42+

src/main/java/doldol_server/doldol/invite/service/InviteService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,5 +117,11 @@ public void deleteInvite(String inviteCode, Long userId) {
117117

118118
inviteRepository.delete(invite);
119119
}
120+
121+
@Transactional(readOnly = true)
122+
public CursorPage<InviteResponse, Long> getMyInvites(Long userId, CursorPageRequest request) {
123+
List<InviteResponse> invites = inviteRepository.findInvitesByUserId(userId, request);
124+
return CursorPage.of(invites, request.size(), InviteResponse::getInviteId);
125+
}
120126
}
121127

0 commit comments

Comments
 (0)