Skip to content

Commit b4c28c1

Browse files
authored
refactor: 테이블 수정에 따른 모집글 리팩토링 (#317)
* refactor(test): 컨트롤러 인증 테스트 MockUser 추가 - UserId, RoleId 변경에 따른 MockUser 추가 * refactor(recruit-board): CurrentUser -> RoleId 변경 * test(recruit-board): CurrentUser -> RoleId 변경에 따른 테스트 * refactor(recruit-board): 이미지 링크 제거 * test(recruit-board): 이미지 링크 제거에 따른 테스트 * refactor(recruit-board): Center -> NewCenter, UserCommonAttribute에 따른 조회 로직 변경 * test(recruit-board): Center -> NewCenter, UserCommonAttribute에 따른 조회 로직 변경에 따른 테스트 * chore(recruit-board): 불필요한 import 제거
1 parent 6ecca44 commit b4c28c1

25 files changed

+317
-314
lines changed
Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
package com.somemore.domains.recruitboard.controller;
22

33

4-
import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE;
5-
64
import com.somemore.domains.recruitboard.dto.request.RecruitBoardCreateRequestDto;
75
import com.somemore.domains.recruitboard.dto.request.RecruitBoardLocationUpdateRequestDto;
86
import com.somemore.domains.recruitboard.dto.request.RecruitBoardStatusUpdateRequestDto;
97
import com.somemore.domains.recruitboard.dto.request.RecruitBoardUpdateRequestDto;
108
import com.somemore.domains.recruitboard.usecase.CreateRecruitBoardUseCase;
119
import com.somemore.domains.recruitboard.usecase.DeleteRecruitBoardUseCase;
1210
import com.somemore.domains.recruitboard.usecase.UpdateRecruitBoardUseCase;
13-
import com.somemore.global.auth.annotation.CurrentUser;
11+
import com.somemore.global.auth.annotation.RoleId;
1412
import com.somemore.global.common.response.ApiResponse;
15-
import com.somemore.global.imageupload.dto.ImageUploadRequestDto;
16-
import com.somemore.global.imageupload.usecase.ImageUploadUseCase;
1713
import io.swagger.v3.oas.annotations.Operation;
1814
import io.swagger.v3.oas.annotations.tags.Tag;
1915
import jakarta.validation.Valid;
@@ -27,9 +23,7 @@
2723
import org.springframework.web.bind.annotation.PutMapping;
2824
import org.springframework.web.bind.annotation.RequestBody;
2925
import org.springframework.web.bind.annotation.RequestMapping;
30-
import org.springframework.web.bind.annotation.RequestPart;
3126
import org.springframework.web.bind.annotation.RestController;
32-
import org.springframework.web.multipart.MultipartFile;
3327

3428
@Tag(name = "Recruit Board Command API", description = "봉사 활동 모집글 생성 수정 삭제 API")
3529
@RequiredArgsConstructor
@@ -40,70 +34,65 @@ public class RecruitBoardCommandApiController {
4034
private final CreateRecruitBoardUseCase createRecruitBoardUseCase;
4135
private final UpdateRecruitBoardUseCase updateRecruitBoardUseCase;
4236
private final DeleteRecruitBoardUseCase deleteRecruitBoardUseCase;
43-
private final ImageUploadUseCase imageUploadUseCase;
4437

4538
@Secured("ROLE_CENTER")
4639
@Operation(summary = "봉사 활동 모집글 등록", description = "봉사 활동 모집글을 등록합니다.")
47-
@PostMapping(value = "/recruit-board", consumes = MULTIPART_FORM_DATA_VALUE)
40+
@PostMapping(value = "/recruit-board")
4841
public ApiResponse<Long> createRecruitBoard(
49-
@CurrentUser UUID userId,
50-
@Valid @RequestPart("data") RecruitBoardCreateRequestDto requestDto,
51-
@RequestPart(value = "img_file", required = false) MultipartFile image
42+
@RoleId UUID centerId,
43+
@Valid @RequestBody RecruitBoardCreateRequestDto requestDto
5244
) {
53-
String imgUrl = imageUploadUseCase.uploadImage(new ImageUploadRequestDto(image));
5445
return ApiResponse.ok(
5546
201,
56-
createRecruitBoardUseCase.createRecruitBoard(requestDto, userId, imgUrl),
47+
createRecruitBoardUseCase.createRecruitBoard(requestDto, centerId),
5748
"봉사 활동 모집글 등록 성공"
5849
);
5950
}
6051

6152
@Secured("ROLE_CENTER")
6253
@Operation(summary = "봉사 활동 모집글 수정", description = "봉사 활동 모집글을 수정합니다.")
63-
@PutMapping(value = "/recruit-board/{id}", consumes = MULTIPART_FORM_DATA_VALUE)
54+
@PutMapping(value = "/recruit-board/{id}")
6455
public ApiResponse<String> updateRecruitBoard(
65-
@CurrentUser UUID userId,
56+
@RoleId UUID centerId,
6657
@PathVariable Long id,
67-
@Valid @RequestPart("data") RecruitBoardUpdateRequestDto requestDto,
68-
@RequestPart(value = "img_file", required = false) MultipartFile image
58+
@Valid @RequestBody RecruitBoardUpdateRequestDto requestDto
6959
) {
70-
String imgUrl = imageUploadUseCase.uploadImage(new ImageUploadRequestDto(image));
71-
updateRecruitBoardUseCase.updateRecruitBoard(requestDto, id, userId, imgUrl);
60+
updateRecruitBoardUseCase.updateRecruitBoard(requestDto, id, centerId);
7261
return ApiResponse.ok("봉사 활동 모집글 수정 성공");
7362
}
7463

7564
@Secured("ROLE_CENTER")
7665
@Operation(summary = "봉사 활동 모집글 위치 수정", description = "봉사 활동 모집글의 위치를 수정합니다.")
7766
@PutMapping(value = "/recruit-board/{id}/location")
7867
public ApiResponse<String> updateRecruitBoardLocation(
79-
@CurrentUser UUID userId,
68+
@RoleId UUID centerId,
8069
@PathVariable Long id,
8170
@Valid @RequestBody RecruitBoardLocationUpdateRequestDto requestDto
8271
) {
83-
updateRecruitBoardUseCase.updateRecruitBoardLocation(requestDto, id, userId);
72+
updateRecruitBoardUseCase.updateRecruitBoardLocation(requestDto, id, centerId);
8473
return ApiResponse.ok("봉사 활동 모집글 위치 수정 성공");
8574
}
8675

8776
@Secured("ROLE_CENTER")
8877
@Operation(summary = "봉사 활동 모집글 상태 수정", description = "봉사 활동 모집글의 상태를 수정합니다.")
8978
@PatchMapping(value = "/recruit-board/{id}")
9079
public ApiResponse<String> updateRecruitBoardStatus(
91-
@CurrentUser UUID userId,
80+
@RoleId UUID centerId,
9281
@PathVariable Long id,
9382
@RequestBody RecruitBoardStatusUpdateRequestDto requestDto
9483
) {
95-
updateRecruitBoardUseCase.updateRecruitBoardStatus(requestDto.status(), id, userId);
84+
updateRecruitBoardUseCase.updateRecruitBoardStatus(requestDto.status(), id, centerId);
9685
return ApiResponse.ok("봉사 활동 모집글 상태 수정 성공");
9786
}
9887

9988
@Secured("ROLE_CENTER")
10089
@Operation(summary = "봉사 활동 모집글 삭제", description = "봉사 활동 모집글을 삭제합니다.")
10190
@DeleteMapping(value = "/recruit-board/{id}")
10291
public ApiResponse<String> deleteRecruitBoard(
103-
@CurrentUser UUID userId,
92+
@RoleId UUID centerId,
10493
@PathVariable Long id
10594
) {
106-
deleteRecruitBoardUseCase.deleteRecruitBoard(userId, id);
95+
deleteRecruitBoardUseCase.deleteRecruitBoard(centerId, id);
10796
return ApiResponse.ok("봉사 활동 모집글 삭제 성공");
10897
}
10998
}

src/main/java/com/somemore/domains/recruitboard/domain/RecruitBoard.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,30 +50,25 @@ public class RecruitBoard extends BaseEntity {
5050
@Column(name = "recruit_status", nullable = false, length = 20)
5151
private RecruitStatus recruitStatus;
5252

53-
@Column(name = "img_url", nullable = false)
54-
private String imgUrl;
55-
5653
@Builder
5754
public RecruitBoard(UUID centerId, Long locationId, String title, String content,
58-
RecruitmentInfo recruitmentInfo, RecruitStatus status, String imgUrl) {
55+
RecruitmentInfo recruitmentInfo, RecruitStatus status) {
5956
this.centerId = centerId;
6057
this.locationId = locationId;
6158
this.title = title;
6259
this.content = content;
6360
this.recruitmentInfo = recruitmentInfo;
6461
this.recruitStatus = status;
65-
this.imgUrl = imgUrl;
6662
}
6763

6864
public boolean isWriter(UUID centerId) {
6965
return this.centerId.equals(centerId);
7066
}
7167

72-
public void updateWith(RecruitBoardUpdateRequestDto dto, String imgUrl) {
68+
public void updateWith(RecruitBoardUpdateRequestDto dto) {
7369
updateRecruitmentInfo(dto);
7470
this.title = dto.title();
7571
this.content = dto.content();
76-
this.imgUrl = imgUrl;
7772
}
7873

7974
public void updateWith(String region) {

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public record RecruitBoardCreateRequestDto(
5252
LocationCreateRequestDto location
5353
) {
5454

55-
public RecruitBoard toEntity(UUID centerId, Long locationId, String imgUrl) {
55+
public RecruitBoard toEntity(UUID centerId, Long locationId) {
5656
RecruitmentInfo recruitmentInfo = RecruitmentInfo.builder()
5757
.region(region)
5858
.recruitmentCount(recruitmentCount)
@@ -68,7 +68,6 @@ public RecruitBoard toEntity(UUID centerId, Long locationId, String imgUrl) {
6868
.locationId(locationId)
6969
.title(title)
7070
.content(content)
71-
.imgUrl(imgUrl)
7271
.recruitmentInfo(recruitmentInfo)
7372
.status(RECRUITING)
7473
.build();

src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardDetailResponseDto.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ public record RecruitBoardDetailResponseDto(
4545
Integer volunteerHours,
4646
@Schema(description = "시간 인정 여부", example = "true")
4747
Boolean admitted,
48-
@Schema(description = "이미지 URL", example = "https://image.domain.com/links")
49-
String imgUrl,
5048
@Schema(description = "센터 간단 정보")
5149
CenterSimpleInfoResponseDto center,
5250
@Schema(description = "위치 정보 DTO")
@@ -76,7 +74,6 @@ public static RecruitBoardDetailResponseDto from(RecruitBoardDetail recruitBoard
7674
.volunteerCategory(info.getVolunteerCategory())
7775
.volunteerHours(info.getVolunteerHours())
7876
.admitted(info.getAdmitted())
79-
.imgUrl(board.getImgUrl())
8077
.location(location)
8178
.center(center)
8279
.build();

src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardResponseDto.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,7 @@ public record RecruitBoardResponseDto(
4545
@Schema(description = "봉사 시간", example = "4")
4646
Integer volunteerHours,
4747
@Schema(description = "시간 인정 여부", example = "true")
48-
Boolean admitted,
49-
@Schema(description = "이미지 URL", example = "https://image.domain.com/links")
50-
String imgUrl
48+
Boolean admitted
5149
) {
5250

5351
public static RecruitBoardResponseDto from(RecruitBoard board) {
@@ -68,7 +66,6 @@ public static RecruitBoardResponseDto from(RecruitBoard board) {
6866
.volunteerCategory(info.getVolunteerCategory())
6967
.volunteerHours(info.getVolunteerHours())
7068
.admitted(info.getAdmitted())
71-
.imgUrl(board.getImgUrl())
7269
.build();
7370
}
7471
}

src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardWithCenterResponseDto.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ public record RecruitBoardWithCenterResponseDto(
4545
Integer volunteerHours,
4646
@Schema(description = "시간 인정 여부", example = "true")
4747
Boolean admitted,
48-
@Schema(description = "이미지 URL", example = "https://image.domain.com/links")
49-
String imgUrl,
5048
@Schema(description = "센터 간단 정보")
5149
CenterSimpleInfoResponseDto center
5250
) {
@@ -71,7 +69,6 @@ public static RecruitBoardWithCenterResponseDto from(
7169
.volunteerCategory(info.getVolunteerCategory())
7270
.volunteerHours(info.getVolunteerHours())
7371
.admitted(info.getAdmitted())
74-
.imgUrl(board.getImgUrl())
7572
.center(CenterSimpleInfoResponseDto.of(board.getCenterId(),
7673
recruitBoardWithCenter.centerName()))
7774
.build();

src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardWithLocationResponseDto.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ public record RecruitBoardWithLocationResponseDto(
4646
Integer volunteerHours,
4747
@Schema(description = "시간 인정 여부", example = "true")
4848
Boolean admitted,
49-
@Schema(description = "이미지 URL", example = "https://image.domain.com/links")
50-
String imgUrl,
5149
@Schema(description = "위치 정보 DTO")
5250
LocationResponseDto location
5351
) {
@@ -72,7 +70,6 @@ public static RecruitBoardWithLocationResponseDto from(
7270
.volunteerCategory(info.getVolunteerCategory())
7371
.volunteerHours(info.getVolunteerHours())
7472
.admitted(info.getAdmitted())
75-
.imgUrl(board.getImgUrl())
7673
.location(
7774
LocationResponseDto.of(recruitBoardWithLocation.address(),
7875
recruitBoardWithLocation.latitude(),

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

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import com.querydsl.core.types.dsl.BooleanExpression;
1111
import com.querydsl.jpa.impl.JPAQuery;
1212
import com.querydsl.jpa.impl.JPAQueryFactory;
13-
import com.somemore.domains.center.domain.QCenter;
13+
import com.somemore.center.domain.QNEWCenter;
1414
import com.somemore.domains.location.domain.QLocation;
1515
import com.somemore.domains.location.utils.GeoUtils;
1616
import com.somemore.domains.recruitboard.domain.QRecruitBoard;
@@ -22,6 +22,7 @@
2222
import com.somemore.domains.recruitboard.repository.mapper.RecruitBoardDetail;
2323
import com.somemore.domains.recruitboard.repository.mapper.RecruitBoardWithCenter;
2424
import com.somemore.domains.recruitboard.repository.mapper.RecruitBoardWithLocation;
25+
import com.somemore.user.domain.QUserCommonAttribute;
2526
import java.time.LocalDateTime;
2627
import java.util.List;
2728
import java.util.Optional;
@@ -44,7 +45,8 @@ public class RecruitBoardRepositoryImpl implements RecruitBoardRepository {
4445

4546
private static final QRecruitBoard recruitBoard = QRecruitBoard.recruitBoard;
4647
private static final QLocation location = QLocation.location;
47-
private static final QCenter center = QCenter.center;
48+
private static final QNEWCenter center = QNEWCenter.nEWCenter;
49+
private static final QUserCommonAttribute userCommonAttribute = QUserCommonAttribute.userCommonAttribute;
4850

4951
@Override
5052
public RecruitBoard save(RecruitBoard recruitBoard) {
@@ -79,8 +81,7 @@ public Optional<RecruitBoardWithLocation> findWithLocationById(Long id) {
7981
RecruitBoardWithLocation result = queryFactory
8082
.select(getRecruitBoardWithLocationConstructorExpression())
8183
.from(recruitBoard)
82-
.join(location)
83-
.on(recruitBoard.locationId.eq(location.id))
84+
.join(location).on(recruitBoard.locationId.eq(location.id))
8485
.where(exp)
8586
.fetchOne();
8687

@@ -104,6 +105,7 @@ public Page<RecruitBoardWithCenter> findAllWithCenter(RecruitBoardSearchConditio
104105
.from(recruitBoard)
105106
.where(exp)
106107
.join(center).on(recruitBoard.centerId.eq(center.id))
108+
.join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId))
107109
.offset(pageable.getOffset())
108110
.limit(pageable.getPageSize())
109111
.orderBy(toOrderSpecifiers(pageable.getSort()))
@@ -113,7 +115,8 @@ public Page<RecruitBoardWithCenter> findAllWithCenter(RecruitBoardSearchConditio
113115
.select(recruitBoard.count())
114116
.from(recruitBoard)
115117
.where(exp)
116-
.join(center).on(recruitBoard.centerId.eq(center.id));
118+
.join(center).on(recruitBoard.centerId.eq(center.id))
119+
.join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId));
117120

118121
return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne);
119122
}
@@ -133,6 +136,7 @@ public Page<RecruitBoardDetail> findAllNearby(RecruitBoardNearByCondition condit
133136
.from(recruitBoard)
134137
.join(location).on(recruitBoard.locationId.eq(location.id))
135138
.join(center).on(recruitBoard.centerId.eq(center.id))
139+
.join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId))
136140
.where(exp)
137141
.offset(pageable.getOffset())
138142
.limit(pageable.getPageSize())
@@ -144,6 +148,7 @@ public Page<RecruitBoardDetail> findAllNearby(RecruitBoardNearByCondition condit
144148
.from(recruitBoard)
145149
.join(location).on(recruitBoard.locationId.eq(location.id))
146150
.join(center).on(recruitBoard.centerId.eq(center.id))
151+
.join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId))
147152
.where(exp);
148153

149154
return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne);
@@ -223,7 +228,8 @@ public long updateStatusToClosedForDateRange(LocalDateTime startTime,
223228
}
224229

225230
@Override
226-
public long updateStatusToCompletedForDateRange(LocalDateTime startTime, LocalDateTime endTime) {
231+
public long updateStatusToCompletedForDateRange(LocalDateTime startTime,
232+
LocalDateTime endTime) {
227233
return queryFactory.update(recruitBoard)
228234
.set(recruitBoard.recruitStatus, COMPLETED)
229235
.where(
@@ -415,7 +421,7 @@ private OrderSpecifier<?>[] toOrderSpecifiers(Sort sort) {
415421

416422
private static ConstructorExpression<RecruitBoardWithCenter> getRecruitBoardWithCenterConstructorExpression() {
417423
return Projections.constructor(RecruitBoardWithCenter.class,
418-
recruitBoard, center.name);
424+
recruitBoard, userCommonAttribute.name);
419425
}
420426

421427
private static ConstructorExpression<RecruitBoardWithLocation> getRecruitBoardWithLocationConstructorExpression() {
@@ -425,7 +431,8 @@ private static ConstructorExpression<RecruitBoardWithLocation> getRecruitBoardWi
425431

426432
private static ConstructorExpression<RecruitBoardDetail> getRecruitBoardDetailConstructorExpression() {
427433
return Projections.constructor(RecruitBoardDetail.class,
428-
recruitBoard, location.address, location.latitude, location.longitude, center.name);
434+
recruitBoard, location.address, location.latitude, location.longitude,
435+
userCommonAttribute.name);
429436
}
430437

431438
// private List<RecruitBoardDocument> convertEntityToDocuments(List<RecruitBoard> recruitBoards) {

src/main/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ public class CreateRecruitBoardService implements CreateRecruitBoardUseCase {
2828
private final ServerEventPublisher serverEventPublisher;
2929

3030
@Override
31-
public Long createRecruitBoard(RecruitBoardCreateRequestDto dto, UUID centerId, String imgUrl) {
31+
public Long createRecruitBoard(RecruitBoardCreateRequestDto dto, UUID centerId) {
3232
recruitBoardValidator.validateRecruitBoardTime(dto.volunteerStartDateTime(), dto.volunteerEndDateTime());
3333

3434
Long locationId = createLocationUseCase.createLocation(dto.location());
35-
RecruitBoard recruitBoard = dto.toEntity(centerId, locationId, imgUrl);
35+
RecruitBoard recruitBoard = dto.toEntity(centerId, locationId);
3636

3737
recruitBoardRepository.save(recruitBoard);
3838

src/main/java/com/somemore/domains/recruitboard/service/RecruitBoardQueryService.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.somemore.domains.recruitboard.service;
22

3-
import com.somemore.domains.center.usecase.query.CenterQueryUseCase;
3+
import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_RECRUIT_BOARD;
4+
45
import com.somemore.domains.recruitboard.domain.RecruitBoard;
56
import com.somemore.domains.recruitboard.dto.condition.RecruitBoardNearByCondition;
67
import com.somemore.domains.recruitboard.dto.condition.RecruitBoardSearchCondition;
@@ -14,23 +15,19 @@
1415
import com.somemore.domains.recruitboard.repository.mapper.RecruitBoardWithLocation;
1516
import com.somemore.domains.recruitboard.usecase.RecruitBoardQueryUseCase;
1617
import com.somemore.global.exception.BadRequestException;
18+
import java.util.List;
19+
import java.util.UUID;
1720
import lombok.RequiredArgsConstructor;
1821
import org.springframework.data.domain.Page;
1922
import org.springframework.stereotype.Service;
2023
import org.springframework.transaction.annotation.Transactional;
2124

22-
import java.util.List;
23-
import java.util.UUID;
24-
25-
import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_RECRUIT_BOARD;
26-
2725
@RequiredArgsConstructor
2826
@Transactional(readOnly = true)
2927
@Service
3028
public class RecruitBoardQueryService implements RecruitBoardQueryUseCase {
3129

3230
private final RecruitBoardRepository recruitBoardRepository;
33-
private final CenterQueryUseCase centerQueryUseCase;
3431

3532
@Override
3633
public RecruitBoard getById(Long id) {
@@ -70,9 +67,7 @@ public Page<RecruitBoardDetailResponseDto> getRecruitBoardsNearby(
7067

7168
@Override
7269
public Page<RecruitBoardResponseDto> getRecruitBoardsByCenterId(UUID centerId,
73-
RecruitBoardSearchCondition condition) {
74-
centerQueryUseCase.validateCenterExists(centerId);
75-
70+
RecruitBoardSearchCondition condition) {
7671
Page<RecruitBoard> boards = recruitBoardRepository.findAllByCenterId(centerId, condition);
7772
return boards.map(RecruitBoardResponseDto::from);
7873
}

0 commit comments

Comments
 (0)