Skip to content

Commit 201a29b

Browse files
authored
Merge branch 'develop' into hotfix/2196-express-bus-timetable
2 parents 2191624 + 56d449b commit 201a29b

4 files changed

Lines changed: 42 additions & 7 deletions

File tree

src/main/java/in/koreatech/koin/domain/callvan/controller/CallvanApi.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ ResponseEntity<CallvanPostCreateResponse> createCallvanPost(
9595
- `arrival_keyword`: 도착지 직접 입력 검색어.
9696
- `title`: 게시글 제목 검색어.
9797
- `sort`: 정렬 기준 (`DEPARTURE_ASC`(출발일 오름차순), `DEPARTURE_DESC`(출발일 내림차순), `LATEST_ASC`(게시글 등록순 오름차순), `LATEST_DESC`(게시글 등록순 내림차순)). 기본값은 `LATEST_DESC`입니다.
98+
- `joined`: `true`일 경우 로그인 사용자가 참여한 게시글만 조회합니다. 비로그인 사용자는 자동으로 `false` 처리됩니다.
9899
- `page`: 페이지 번호 (1부터 시작, 기본값 1)
99100
- `limit`: 한 페이지당 게시글 수 (최대 50, 기본값 10)
100101
@@ -104,7 +105,8 @@ ResponseEntity<CallvanPostCreateResponse> createCallvanPost(
104105
3. `statuses`가 전달되면 해당 상태들만 조회하고, 미전달 시 상태 조건 없이 전체를 조회합니다.
105106
4. `DEPARTURE_ASC`는 출발 날짜+시간 기준 오름차순, `DEPARTURE_DESC`는 출발 날짜+시간 기준 내림차순으로 정렬됩니다.
106107
5. `LATEST_ASC`는 게시글 등록순 오름차순, `LATEST_DESC`는 게시글 등록순 내림차순으로 정렬됩니다.
107-
6. 로그인된 사용자의 경우, 해당 콜벤 게시글에 합류한 상태면 `isJoined` 필드가 true로 표시됩니다.
108+
6. `joined=true`이면 로그인 사용자가 참여한 게시글만 반환합니다. 비로그인 사용자는 자동으로 `false` 처리됩니다. `false`는 모든 게시글이 반환됩니다.
109+
7. 로그인된 사용자의 경우, 해당 콜벤 게시글에 합류한 상태면 `isJoined` 필드가 true로 표시됩니다.
108110
""")
109111
@GetMapping
110112
ResponseEntity<CallvanPostSearchResponse> getCallvanPosts(
@@ -116,6 +118,7 @@ ResponseEntity<CallvanPostSearchResponse> getCallvanPosts(
116118
@RequestParam(required = false, name = "statuses") List<CallvanPostStatusFilter> statuses,
117119
@RequestParam(required = false) String title,
118120
@RequestParam(required = false, defaultValue = "LATEST_DESC") CallvanPostSortCriteria sort,
121+
@RequestParam(required = false, name = "joined", defaultValue = "false") Boolean isJoined,
119122
@RequestParam(required = false) Integer page,
120123
@RequestParam(required = false) Integer limit,
121124
@UserId Integer userId

src/main/java/in/koreatech/koin/domain/callvan/controller/CallvanController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,13 @@ public ResponseEntity<CallvanPostSearchResponse> getCallvanPosts(
7373
List<CallvanPostStatusFilter> statuses,
7474
String title,
7575
CallvanPostSortCriteria sort,
76+
Boolean isJoined,
7677
Integer page,
7778
Integer limit,
7879
@UserId Integer userId
7980
) {
8081
CallvanPostSearchResponse response = callvanPostQueryService.getCallvanPosts(
81-
author, departures, departureKeyword, arrivals, arrivalKeyword, statuses, title, sort, page, limit,
82+
author, departures, departureKeyword, arrivals, arrivalKeyword, statuses, title, sort, isJoined, page, limit,
8283
userId);
8384
return ResponseEntity.ok().body(response);
8485
}

src/main/java/in/koreatech/koin/domain/callvan/repository/CallvanPostQueryRepository.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package in.koreatech.koin.domain.callvan.repository;
22

3+
import static in.koreatech.koin.domain.callvan.model.QCallvanParticipant.callvanParticipant;
34
import static in.koreatech.koin.domain.callvan.model.QCallvanPost.callvanPost;
45

56
import java.util.List;
@@ -9,6 +10,7 @@
910

1011
import com.querydsl.core.types.OrderSpecifier;
1112
import com.querydsl.core.types.dsl.BooleanExpression;
13+
import com.querydsl.jpa.JPAExpressions;
1214
import com.querydsl.jpa.impl.JPAQueryFactory;
1315

1416
import in.koreatech.koin.common.model.Criteria;
@@ -32,6 +34,7 @@ public List<CallvanPost> findCallvanPosts(
3234
String arrivalKeyword,
3335
List<CallvanStatus> statuses,
3436
String title,
37+
Integer joinedMemberId,
3538
CallvanPostSortCriteria sort,
3639
Criteria criteria
3740
) {
@@ -42,7 +45,8 @@ public List<CallvanPost> findCallvanPosts(
4245
departureFilter(departures, departureKeyword),
4346
arrivalFilter(arrivals, arrivalKeyword),
4447
statusIn(statuses),
45-
titleContains(title))
48+
titleContains(title),
49+
joinedByMemberId(joinedMemberId))
4650
.orderBy(getOrderSpecifiers(sort))
4751
.offset((long)criteria.getPage() * criteria.getLimit())
4852
.limit(criteria.getLimit())
@@ -56,7 +60,8 @@ public Long countCallvanPosts(
5660
List<CallvanLocation> arrivals,
5761
String arrivalKeyword,
5862
List<CallvanStatus> statuses,
59-
String title
63+
String title,
64+
Integer joinedMemberId
6065
) {
6166
return queryFactory
6267
.select(callvanPost.count())
@@ -66,7 +71,8 @@ public Long countCallvanPosts(
6671
departureFilter(departures, departureKeyword),
6772
arrivalFilter(arrivals, arrivalKeyword),
6873
statusIn(statuses),
69-
titleContains(title))
74+
titleContains(title),
75+
joinedByMemberId(joinedMemberId))
7076
.fetchOne();
7177
}
7278

@@ -132,6 +138,22 @@ private BooleanExpression titleContains(String title) {
132138
return (title != null && !title.isBlank()) ? callvanPost.title.contains(title) : null;
133139
}
134140

141+
private BooleanExpression joinedByMemberId(Integer joinedMemberId) {
142+
if (joinedMemberId == null) {
143+
return null;
144+
}
145+
146+
return JPAExpressions
147+
.selectOne()
148+
.from(callvanParticipant)
149+
.where(
150+
callvanParticipant.post.id.eq(callvanPost.id),
151+
callvanParticipant.member.id.eq(joinedMemberId),
152+
callvanParticipant.isDeleted.isFalse()
153+
)
154+
.exists();
155+
}
156+
135157
private OrderSpecifier<?>[] getOrderSpecifiers(CallvanPostSortCriteria sort) {
136158
if (sort == null) {
137159
return new OrderSpecifier[] {

src/main/java/in/koreatech/koin/domain/callvan/service/CallvanPostQueryService.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,22 @@ public CallvanPostSearchResponse getCallvanPosts(
5353
List<CallvanPostStatusFilter> statusFilters,
5454
String title,
5555
CallvanPostSortCriteria sort,
56+
Boolean isJoined,
5657
Integer page,
5758
Integer limit,
5859
Integer userId
5960
) {
6061
Integer authorId = authorFilter.getRequiredAuthorId(userId);
62+
Integer joinedMemberId = getJoinedMemberId(isJoined, userId);
6163
List<CallvanStatus> statuses = CallvanPostStatusFilter.toStatuses(statusFilters);
6264

6365
Long totalCount = callvanPostQueryRepository.countCallvanPosts(
64-
authorId, departures, departureKeyword, arrivals, arrivalKeyword, statuses, title);
66+
authorId, departures, departureKeyword, arrivals, arrivalKeyword, statuses, title, joinedMemberId);
6567

6668
Criteria criteria = Criteria.of(page, limit, totalCount.intValue());
6769

6870
List<CallvanPost> posts = callvanPostQueryRepository.findCallvanPosts(
69-
authorId, departures, departureKeyword, arrivals, arrivalKeyword, statuses, title, sort,
71+
authorId, departures, departureKeyword, arrivals, arrivalKeyword, statuses, title, joinedMemberId, sort,
7072
criteria);
7173

7274
int totalPage = (int)Math.ceil((double)totalCount / criteria.getLimit());
@@ -94,6 +96,13 @@ public CallvanPostSearchResponse getCallvanPosts(
9496
userId);
9597
}
9698

99+
private Integer getJoinedMemberId(Boolean isJoined, Integer userId) {
100+
if (Boolean.TRUE.equals(isJoined) && userId != null) {
101+
return userId;
102+
}
103+
return null;
104+
}
105+
97106
public CallvanPostDetailResponse getCallvanPostDetail(Integer postId, Integer userId) {
98107
if (!callvanParticipantRepository.existsByPostIdAndMemberIdAndIsDeletedFalse(postId, userId)) {
99108
throw CustomException.of(ApiResponseCode.FORBIDDEN_PARTICIPANT);

0 commit comments

Comments
 (0)