Skip to content

Commit 73c6b4d

Browse files
authored
bug: 위치 기반 조회시 모집중이 아닌 데이터도 조회되는 문제 해결 (#181)
* refactor(recruit-board): 위치 기반 조회시 status 조건 검색 추가 - 기본값 모집중 * refactor(recruit-board): 모집글 생성 및 수정시 봉사 시작 종료 일시 제약 조건 추가 및 예제 변경 * refactor(recruit-board): 모집글 생성 및 수정시 봉사 시작 종료 일시 제약 조건에 따른 LocalDateTimeFixture 수정
1 parent 00496e1 commit 73c6b4d

File tree

6 files changed

+83
-70
lines changed

6 files changed

+83
-70
lines changed

src/main/java/com/somemore/recruitboard/controller/RecruitBoardQueryApiController.java

Lines changed: 60 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -36,106 +36,108 @@ public class RecruitBoardQueryApiController {
3636
@GetMapping("/recruit-board/{id}")
3737
@Operation(summary = "봉사 모집글 상세 조회", description = "특정 모집글의 상세 정보를 조회합니다.")
3838
public ApiResponse<RecruitBoardWithLocationResponseDto> getById(
39-
@PathVariable Long id
39+
@PathVariable Long id
4040
) {
4141
return ApiResponse.ok(
42-
200,
43-
recruitBoardQueryUseCase.getWithLocationById(id),
44-
"봉사 활동 모집 상세 조회 성공"
42+
200,
43+
recruitBoardQueryUseCase.getWithLocationById(id),
44+
"봉사 활동 모집 상세 조회 성공"
4545
);
4646
}
4747

4848
@GetMapping("/recruit-boards")
4949
@Operation(summary = "전체 모집글 조회", description = "모든 봉사 모집글 목록을 조회합니다.")
5050
public ApiResponse<Page<RecruitBoardWithCenterResponseDto>> getAll(
51-
@PageableDefault(sort = "created_at", direction = DESC)
52-
Pageable pageable
51+
@PageableDefault(sort = "created_at", direction = DESC)
52+
Pageable pageable
5353
) {
5454
RecruitBoardSearchCondition condition = RecruitBoardSearchCondition.builder()
55-
.pageable(pageable)
56-
.build();
55+
.pageable(pageable)
56+
.build();
5757

5858
return ApiResponse.ok(
59-
200,
60-
recruitBoardQueryUseCase.getAllWithCenter(condition),
61-
"봉사 활동 모집글 리스트 조회 성공"
59+
200,
60+
recruitBoardQueryUseCase.getAllWithCenter(condition),
61+
"봉사 활동 모집글 리스트 조회 성공"
6262
);
6363
}
6464

6565
@GetMapping("/recruit-boards/search")
6666
@Operation(summary = "모집글 검색 조회", description = "검색 조건을 기반으로 모집글을 조회합니다.")
6767
public ApiResponse<Page<RecruitBoardWithCenterResponseDto>> getAllBySearch(
68-
@PageableDefault(sort = "created_at", direction = DESC) Pageable pageable,
69-
@RequestParam(required = false) String keyword,
70-
@RequestParam(required = false) VolunteerCategory category,
71-
@RequestParam(required = false) String region,
72-
@RequestParam(required = false) Boolean admitted,
73-
@RequestParam(required = false) RecruitStatus status
68+
@PageableDefault(sort = "created_at", direction = DESC) Pageable pageable,
69+
@RequestParam(required = false) String keyword,
70+
@RequestParam(required = false) VolunteerCategory category,
71+
@RequestParam(required = false) String region,
72+
@RequestParam(required = false) Boolean admitted,
73+
@RequestParam(required = false) RecruitStatus status
7474
) {
7575
RecruitBoardSearchCondition condition = RecruitBoardSearchCondition.builder()
76-
.keyword(keyword)
77-
.category(category)
78-
.region(region)
79-
.admitted(admitted)
80-
.status(status)
81-
.pageable(pageable)
82-
.build();
76+
.keyword(keyword)
77+
.category(category)
78+
.region(region)
79+
.admitted(admitted)
80+
.status(status)
81+
.pageable(pageable)
82+
.build();
8383

8484
return ApiResponse.ok(
85-
200,
86-
recruitBoardQueryUseCase.getAllWithCenter(condition),
87-
"봉사 활동 모집글 검색 조회 성공"
85+
200,
86+
recruitBoardQueryUseCase.getAllWithCenter(condition),
87+
"봉사 활동 모집글 검색 조회 성공"
8888
);
8989
}
9090

9191
@GetMapping("/recruit-boards/nearby")
9292
@Operation(summary = "근처 모집글 조회", description = "주변 반경 내의 봉사 모집글을 조회합니다.")
9393
public ApiResponse<Page<RecruitBoardDetailResponseDto>> getNearby(
94-
@RequestParam double latitude,
95-
@RequestParam double longitude,
96-
@RequestParam(required = false, defaultValue = "5") double radius,
97-
@RequestParam(required = false) String keyword,
98-
@PageableDefault(sort = "created_at", direction = DESC) Pageable pageable
94+
@RequestParam double latitude,
95+
@RequestParam double longitude,
96+
@RequestParam(required = false, defaultValue = "5") double radius,
97+
@RequestParam(required = false) String keyword,
98+
@RequestParam(required = false, defaultValue = "RECRUITING") RecruitStatus status,
99+
@PageableDefault(sort = "created_at", direction = DESC) Pageable pageable
99100
) {
100101
RecruitBoardNearByCondition condition = RecruitBoardNearByCondition.builder()
101-
.latitude(latitude)
102-
.longitude(longitude)
103-
.radius(radius)
104-
.keyword(keyword)
105-
.pageable(pageable)
106-
.build();
102+
.latitude(latitude)
103+
.longitude(longitude)
104+
.radius(radius)
105+
.keyword(keyword)
106+
.status(status)
107+
.pageable(pageable)
108+
.build();
107109

108110
return ApiResponse.ok(
109-
200,
110-
recruitBoardQueryUseCase.getRecruitBoardsNearby(condition),
111-
"근처 봉사 활동 모집글 조회 성공"
111+
200,
112+
recruitBoardQueryUseCase.getRecruitBoardsNearby(condition),
113+
"근처 봉사 활동 모집글 조회 성공"
112114
);
113115
}
114116

115117
@GetMapping("/recruit-boards/center/{centerId}")
116118
@Operation(summary = "특정 기관 모집글 조회", description = "특정 기관의 봉사 모집글을 조회합니다.")
117119
public ApiResponse<Page<RecruitBoardResponseDto>> getRecruitBoardsByCenterId(
118-
@PathVariable UUID centerId,
119-
@PageableDefault(sort = "created_at", direction = DESC) Pageable pageable,
120-
@RequestParam(required = false) String keyword,
121-
@RequestParam(required = false) VolunteerCategory category,
122-
@RequestParam(required = false) String region,
123-
@RequestParam(required = false) Boolean admitted,
124-
@RequestParam(required = false) RecruitStatus status
120+
@PathVariable UUID centerId,
121+
@PageableDefault(sort = "created_at", direction = DESC) Pageable pageable,
122+
@RequestParam(required = false) String keyword,
123+
@RequestParam(required = false) VolunteerCategory category,
124+
@RequestParam(required = false) String region,
125+
@RequestParam(required = false) Boolean admitted,
126+
@RequestParam(required = false) RecruitStatus status
125127
) {
126128
RecruitBoardSearchCondition condition = RecruitBoardSearchCondition.builder()
127-
.keyword(keyword)
128-
.category(category)
129-
.region(region)
130-
.admitted(admitted)
131-
.status(status)
132-
.pageable(pageable)
133-
.build();
129+
.keyword(keyword)
130+
.category(category)
131+
.region(region)
132+
.admitted(admitted)
133+
.status(status)
134+
.pageable(pageable)
135+
.build();
134136

135137
return ApiResponse.ok(
136-
200,
137-
recruitBoardQueryUseCase.getRecruitBoardsByCenterId(centerId, condition),
138-
"기관 봉사 활동 모집글 조회 성공"
138+
200,
139+
recruitBoardQueryUseCase.getRecruitBoardsByCenterId(centerId, condition),
140+
"기관 봉사 활동 모집글 조회 성공"
139141
);
140142
}
141143
}

src/main/java/com/somemore/recruitboard/dto/condition/RecruitBoardNearByCondition.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.somemore.recruitboard.dto.condition;
22

3+
import com.somemore.recruitboard.domain.RecruitStatus;
34
import lombok.Builder;
45
import org.springframework.data.domain.Pageable;
56

@@ -9,6 +10,7 @@ public record RecruitBoardNearByCondition(
910
Double longitude,
1011
Double radius,
1112
String keyword,
13+
RecruitStatus status,
1214
Pageable pageable
1315
) {
1416

src/main/java/com/somemore/recruitboard/dto/request/RecruitBoardCreateRequestDto.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.somemore.recruitboard.domain.RecruitmentInfo;
88
import com.somemore.recruitboard.domain.VolunteerCategory;
99
import io.swagger.v3.oas.annotations.media.Schema;
10+
import jakarta.validation.constraints.Future;
1011
import jakarta.validation.constraints.NotBlank;
1112
import jakarta.validation.constraints.NotNull;
1213
import java.time.LocalDateTime;
@@ -28,11 +29,13 @@ public record RecruitBoardCreateRequestDto(
2829
@Schema(description = "예상 모집 인원", example = "4")
2930
@NotNull(message = "예상 모집 인원은 필수 값입니다.")
3031
Integer recruitmentCount,
31-
@Schema(description = "봉사 시작 일시", example = "2024-11-20T10:00:00", type = "string")
32+
@Schema(description = "봉사 시작 일시", example = "2024-12-20T10:00:00", type = "string")
3233
@NotNull(message = "봉사 시작 일시는 필수 값입니다.")
34+
@Future(message = "봉사 시작 일시는 내일부터 가능합니다.")
3335
LocalDateTime volunteerStartDateTime,
34-
@Schema(description = "봉사 종료 일시", example = "2024-11-20T12:00:00", type = "string")
36+
@Schema(description = "봉사 종료 일시", example = "2024-12-20T12:00:00", type = "string")
3537
@NotNull(message = "봉사 종료 일시는 필수 값입니다.")
38+
@Future(message = "봉사 종료 일시는 내일부터 가능합니다.")
3639
LocalDateTime volunteerEndDateTime,
3740
@Schema(description = "봉사 활동 유형", example = "ENVIRONMENTAL_PROTECTION")
3841
@NotNull(message = "봉사 활동 유형은 필수 값입니다.")

src/main/java/com/somemore/recruitboard/dto/request/RecruitBoardUpdateRequestDto.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fasterxml.jackson.databind.annotation.JsonNaming;
55
import com.somemore.recruitboard.domain.VolunteerCategory;
66
import io.swagger.v3.oas.annotations.media.Schema;
7+
import jakarta.validation.constraints.Future;
78
import jakarta.validation.constraints.NotBlank;
89
import jakarta.validation.constraints.NotNull;
910
import java.time.LocalDateTime;
@@ -23,10 +24,11 @@ public record RecruitBoardUpdateRequestDto(
2324
Integer recruitmentCount,
2425
@Schema(description = "봉사 시작 일시", example = "2024-11-20T10:00:00", type = "string")
2526
@NotNull(message = "봉사 시작 일시는 필수 값입니다.")
27+
@Future(message = "봉사 시작 일시는 내일부터 가능합니다.")
2628
LocalDateTime volunteerStartDateTime,
2729
@Schema(description = "봉사 종료 일시", example = "2024-11-20T12:00:00", type = "string")
2830
@NotNull(message = "봉사 종료 일시는 필수 값입니다.")
29-
LocalDateTime volunteerEndDateTime,
31+
@Future(message = "봉사 종료 일시는 내일부터 가능합니다.")LocalDateTime volunteerEndDateTime,
3032
@Schema(description = "봉사 활동 유형", example = "ENVIRONMENTAL_PROTECTION")
3133
@NotNull(message = "봉사 활동 유형은 필수 값입니다.")
3234
VolunteerCategory volunteerCategory,

src/main/java/com/somemore/recruitboard/repository/RecruitBoardRepositoryImpl.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,10 @@ public Page<RecruitBoardDetail> findAllNearby(RecruitBoardNearByCondition condit
140140

141141
Pageable pageable = condition.pageable();
142142

143-
BooleanExpression predicate = isNotDeleted()
144-
.and(locationBetween(condition))
145-
.and(keywordEq(condition.keyword()));
143+
BooleanExpression predicate = locationBetween(condition)
144+
.and(keywordEq(condition.keyword()))
145+
.and(statusEq(condition.status()))
146+
.and(isNotDeleted());
146147

147148
List<RecruitBoardDetail> content = queryFactory
148149
.select(getRecruitBoardDetailConstructorExpression(recruitBoard, location, center))

src/test/java/com/somemore/common/fixture/LocalDateTimeFixture.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,21 @@ private LocalDateTimeFixture() {
88
}
99

1010
public static LocalDateTime createStartDateTime() {
11-
// 2024-11-25 T:13:00:00
12-
return LocalDateTime.of(2024, 11, 25, 13, 0);
11+
// 내일 날짜로 13:00:00으로 설정
12+
LocalDateTime today = LocalDateTime.now();
13+
return today.plusDays(1).withHour(13).withMinute(0).withSecond(0).withNano(0);
1314
}
1415

1516
public static LocalDateTime createUpdateStartDateTime() {
16-
// 2024-11-25 T:16:00:00
17-
return LocalDateTime.of(2024, 11, 25, 16, 0);
17+
// 내일 날짜로 16:00:00으로 설정
18+
LocalDateTime today = LocalDateTime.now();
19+
return today.plusDays(1).withHour(16).withMinute(0).withSecond(0).withNano(0);
1820
}
1921

2022
public static LocalDateTime createCurrentDateTime() {
21-
// 2024-11-24 T:18:00:00
22-
return LocalDateTime.of(2024, 11, 24, 18, 0);
23+
// 오늘 날짜로 16:00:00으로 설정
24+
LocalDateTime today = LocalDateTime.now();
25+
return today.withHour(16).withMinute(0).withSecond(0).withNano(0);
2326
}
2427

2528
}

0 commit comments

Comments
 (0)