diff --git a/src/main/java/com/somemore/domains/recruitboard/controller/RecruitBoardCommandApiController.java b/src/main/java/com/somemore/domains/recruitboard/controller/RecruitBoardCommandApiController.java index 9bc2fdfed..1b8d0ddac 100644 --- a/src/main/java/com/somemore/domains/recruitboard/controller/RecruitBoardCommandApiController.java +++ b/src/main/java/com/somemore/domains/recruitboard/controller/RecruitBoardCommandApiController.java @@ -1,8 +1,6 @@ package com.somemore.domains.recruitboard.controller; -import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; - import com.somemore.domains.recruitboard.dto.request.RecruitBoardCreateRequestDto; import com.somemore.domains.recruitboard.dto.request.RecruitBoardLocationUpdateRequestDto; import com.somemore.domains.recruitboard.dto.request.RecruitBoardStatusUpdateRequestDto; @@ -10,10 +8,8 @@ import com.somemore.domains.recruitboard.usecase.CreateRecruitBoardUseCase; import com.somemore.domains.recruitboard.usecase.DeleteRecruitBoardUseCase; import com.somemore.domains.recruitboard.usecase.UpdateRecruitBoardUseCase; -import com.somemore.global.auth.annotation.CurrentUser; +import com.somemore.global.auth.annotation.RoleId; import com.somemore.global.common.response.ApiResponse; -import com.somemore.global.imageupload.dto.ImageUploadRequestDto; -import com.somemore.global.imageupload.usecase.ImageUploadUseCase; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -27,9 +23,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; @Tag(name = "Recruit Board Command API", description = "봉사 활동 모집글 생성 수정 삭제 API") @RequiredArgsConstructor @@ -40,35 +34,30 @@ public class RecruitBoardCommandApiController { private final CreateRecruitBoardUseCase createRecruitBoardUseCase; private final UpdateRecruitBoardUseCase updateRecruitBoardUseCase; private final DeleteRecruitBoardUseCase deleteRecruitBoardUseCase; - private final ImageUploadUseCase imageUploadUseCase; @Secured("ROLE_CENTER") @Operation(summary = "봉사 활동 모집글 등록", description = "봉사 활동 모집글을 등록합니다.") - @PostMapping(value = "/recruit-board", consumes = MULTIPART_FORM_DATA_VALUE) + @PostMapping(value = "/recruit-board") public ApiResponse createRecruitBoard( - @CurrentUser UUID userId, - @Valid @RequestPart("data") RecruitBoardCreateRequestDto requestDto, - @RequestPart(value = "img_file", required = false) MultipartFile image + @RoleId UUID centerId, + @Valid @RequestBody RecruitBoardCreateRequestDto requestDto ) { - String imgUrl = imageUploadUseCase.uploadImage(new ImageUploadRequestDto(image)); return ApiResponse.ok( 201, - createRecruitBoardUseCase.createRecruitBoard(requestDto, userId, imgUrl), + createRecruitBoardUseCase.createRecruitBoard(requestDto, centerId), "봉사 활동 모집글 등록 성공" ); } @Secured("ROLE_CENTER") @Operation(summary = "봉사 활동 모집글 수정", description = "봉사 활동 모집글을 수정합니다.") - @PutMapping(value = "/recruit-board/{id}", consumes = MULTIPART_FORM_DATA_VALUE) + @PutMapping(value = "/recruit-board/{id}") public ApiResponse updateRecruitBoard( - @CurrentUser UUID userId, + @RoleId UUID centerId, @PathVariable Long id, - @Valid @RequestPart("data") RecruitBoardUpdateRequestDto requestDto, - @RequestPart(value = "img_file", required = false) MultipartFile image + @Valid @RequestBody RecruitBoardUpdateRequestDto requestDto ) { - String imgUrl = imageUploadUseCase.uploadImage(new ImageUploadRequestDto(image)); - updateRecruitBoardUseCase.updateRecruitBoard(requestDto, id, userId, imgUrl); + updateRecruitBoardUseCase.updateRecruitBoard(requestDto, id, centerId); return ApiResponse.ok("봉사 활동 모집글 수정 성공"); } @@ -76,11 +65,11 @@ public ApiResponse updateRecruitBoard( @Operation(summary = "봉사 활동 모집글 위치 수정", description = "봉사 활동 모집글의 위치를 수정합니다.") @PutMapping(value = "/recruit-board/{id}/location") public ApiResponse updateRecruitBoardLocation( - @CurrentUser UUID userId, + @RoleId UUID centerId, @PathVariable Long id, @Valid @RequestBody RecruitBoardLocationUpdateRequestDto requestDto ) { - updateRecruitBoardUseCase.updateRecruitBoardLocation(requestDto, id, userId); + updateRecruitBoardUseCase.updateRecruitBoardLocation(requestDto, id, centerId); return ApiResponse.ok("봉사 활동 모집글 위치 수정 성공"); } @@ -88,11 +77,11 @@ public ApiResponse updateRecruitBoardLocation( @Operation(summary = "봉사 활동 모집글 상태 수정", description = "봉사 활동 모집글의 상태를 수정합니다.") @PatchMapping(value = "/recruit-board/{id}") public ApiResponse updateRecruitBoardStatus( - @CurrentUser UUID userId, + @RoleId UUID centerId, @PathVariable Long id, @RequestBody RecruitBoardStatusUpdateRequestDto requestDto ) { - updateRecruitBoardUseCase.updateRecruitBoardStatus(requestDto.status(), id, userId); + updateRecruitBoardUseCase.updateRecruitBoardStatus(requestDto.status(), id, centerId); return ApiResponse.ok("봉사 활동 모집글 상태 수정 성공"); } @@ -100,10 +89,10 @@ public ApiResponse updateRecruitBoardStatus( @Operation(summary = "봉사 활동 모집글 삭제", description = "봉사 활동 모집글을 삭제합니다.") @DeleteMapping(value = "/recruit-board/{id}") public ApiResponse deleteRecruitBoard( - @CurrentUser UUID userId, + @RoleId UUID centerId, @PathVariable Long id ) { - deleteRecruitBoardUseCase.deleteRecruitBoard(userId, id); + deleteRecruitBoardUseCase.deleteRecruitBoard(centerId, id); return ApiResponse.ok("봉사 활동 모집글 삭제 성공"); } } diff --git a/src/main/java/com/somemore/domains/recruitboard/domain/RecruitBoard.java b/src/main/java/com/somemore/domains/recruitboard/domain/RecruitBoard.java index 370029688..dfb74ffad 100644 --- a/src/main/java/com/somemore/domains/recruitboard/domain/RecruitBoard.java +++ b/src/main/java/com/somemore/domains/recruitboard/domain/RecruitBoard.java @@ -50,30 +50,25 @@ public class RecruitBoard extends BaseEntity { @Column(name = "recruit_status", nullable = false, length = 20) private RecruitStatus recruitStatus; - @Column(name = "img_url", nullable = false) - private String imgUrl; - @Builder public RecruitBoard(UUID centerId, Long locationId, String title, String content, - RecruitmentInfo recruitmentInfo, RecruitStatus status, String imgUrl) { + RecruitmentInfo recruitmentInfo, RecruitStatus status) { this.centerId = centerId; this.locationId = locationId; this.title = title; this.content = content; this.recruitmentInfo = recruitmentInfo; this.recruitStatus = status; - this.imgUrl = imgUrl; } public boolean isWriter(UUID centerId) { return this.centerId.equals(centerId); } - public void updateWith(RecruitBoardUpdateRequestDto dto, String imgUrl) { + public void updateWith(RecruitBoardUpdateRequestDto dto) { updateRecruitmentInfo(dto); this.title = dto.title(); this.content = dto.content(); - this.imgUrl = imgUrl; } public void updateWith(String region) { diff --git a/src/main/java/com/somemore/domains/recruitboard/dto/request/RecruitBoardCreateRequestDto.java b/src/main/java/com/somemore/domains/recruitboard/dto/request/RecruitBoardCreateRequestDto.java index 9beddc3e9..77dbd88db 100644 --- a/src/main/java/com/somemore/domains/recruitboard/dto/request/RecruitBoardCreateRequestDto.java +++ b/src/main/java/com/somemore/domains/recruitboard/dto/request/RecruitBoardCreateRequestDto.java @@ -52,7 +52,7 @@ public record RecruitBoardCreateRequestDto( LocationCreateRequestDto location ) { - public RecruitBoard toEntity(UUID centerId, Long locationId, String imgUrl) { + public RecruitBoard toEntity(UUID centerId, Long locationId) { RecruitmentInfo recruitmentInfo = RecruitmentInfo.builder() .region(region) .recruitmentCount(recruitmentCount) @@ -68,7 +68,6 @@ public RecruitBoard toEntity(UUID centerId, Long locationId, String imgUrl) { .locationId(locationId) .title(title) .content(content) - .imgUrl(imgUrl) .recruitmentInfo(recruitmentInfo) .status(RECRUITING) .build(); diff --git a/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardDetailResponseDto.java b/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardDetailResponseDto.java index 2a1c2a3a8..bc5206aac 100644 --- a/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardDetailResponseDto.java +++ b/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardDetailResponseDto.java @@ -45,8 +45,6 @@ public record RecruitBoardDetailResponseDto( Integer volunteerHours, @Schema(description = "시간 인정 여부", example = "true") Boolean admitted, - @Schema(description = "이미지 URL", example = "https://image.domain.com/links") - String imgUrl, @Schema(description = "센터 간단 정보") CenterSimpleInfoResponseDto center, @Schema(description = "위치 정보 DTO") @@ -76,7 +74,6 @@ public static RecruitBoardDetailResponseDto from(RecruitBoardDetail recruitBoard .volunteerCategory(info.getVolunteerCategory()) .volunteerHours(info.getVolunteerHours()) .admitted(info.getAdmitted()) - .imgUrl(board.getImgUrl()) .location(location) .center(center) .build(); diff --git a/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardResponseDto.java b/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardResponseDto.java index 758b926aa..13668cccb 100644 --- a/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardResponseDto.java +++ b/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardResponseDto.java @@ -45,9 +45,7 @@ public record RecruitBoardResponseDto( @Schema(description = "봉사 시간", example = "4") Integer volunteerHours, @Schema(description = "시간 인정 여부", example = "true") - Boolean admitted, - @Schema(description = "이미지 URL", example = "https://image.domain.com/links") - String imgUrl + Boolean admitted ) { public static RecruitBoardResponseDto from(RecruitBoard board) { @@ -68,7 +66,6 @@ public static RecruitBoardResponseDto from(RecruitBoard board) { .volunteerCategory(info.getVolunteerCategory()) .volunteerHours(info.getVolunteerHours()) .admitted(info.getAdmitted()) - .imgUrl(board.getImgUrl()) .build(); } } diff --git a/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardWithCenterResponseDto.java b/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardWithCenterResponseDto.java index d7f73e308..97c788813 100644 --- a/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardWithCenterResponseDto.java +++ b/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardWithCenterResponseDto.java @@ -45,8 +45,6 @@ public record RecruitBoardWithCenterResponseDto( Integer volunteerHours, @Schema(description = "시간 인정 여부", example = "true") Boolean admitted, - @Schema(description = "이미지 URL", example = "https://image.domain.com/links") - String imgUrl, @Schema(description = "센터 간단 정보") CenterSimpleInfoResponseDto center ) { @@ -71,7 +69,6 @@ public static RecruitBoardWithCenterResponseDto from( .volunteerCategory(info.getVolunteerCategory()) .volunteerHours(info.getVolunteerHours()) .admitted(info.getAdmitted()) - .imgUrl(board.getImgUrl()) .center(CenterSimpleInfoResponseDto.of(board.getCenterId(), recruitBoardWithCenter.centerName())) .build(); diff --git a/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardWithLocationResponseDto.java b/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardWithLocationResponseDto.java index 170377f38..7c3e3e7ae 100644 --- a/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardWithLocationResponseDto.java +++ b/src/main/java/com/somemore/domains/recruitboard/dto/response/RecruitBoardWithLocationResponseDto.java @@ -46,8 +46,6 @@ public record RecruitBoardWithLocationResponseDto( Integer volunteerHours, @Schema(description = "시간 인정 여부", example = "true") Boolean admitted, - @Schema(description = "이미지 URL", example = "https://image.domain.com/links") - String imgUrl, @Schema(description = "위치 정보 DTO") LocationResponseDto location ) { @@ -72,7 +70,6 @@ public static RecruitBoardWithLocationResponseDto from( .volunteerCategory(info.getVolunteerCategory()) .volunteerHours(info.getVolunteerHours()) .admitted(info.getAdmitted()) - .imgUrl(board.getImgUrl()) .location( LocationResponseDto.of(recruitBoardWithLocation.address(), recruitBoardWithLocation.latitude(), diff --git a/src/main/java/com/somemore/domains/recruitboard/repository/RecruitBoardRepositoryImpl.java b/src/main/java/com/somemore/domains/recruitboard/repository/RecruitBoardRepositoryImpl.java index d18e5a846..f7ecc5433 100644 --- a/src/main/java/com/somemore/domains/recruitboard/repository/RecruitBoardRepositoryImpl.java +++ b/src/main/java/com/somemore/domains/recruitboard/repository/RecruitBoardRepositoryImpl.java @@ -10,7 +10,7 @@ import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; -import com.somemore.domains.center.domain.QCenter; +import com.somemore.center.domain.QNEWCenter; import com.somemore.domains.location.domain.QLocation; import com.somemore.domains.location.utils.GeoUtils; import com.somemore.domains.recruitboard.domain.QRecruitBoard; @@ -22,6 +22,7 @@ import com.somemore.domains.recruitboard.repository.mapper.RecruitBoardDetail; import com.somemore.domains.recruitboard.repository.mapper.RecruitBoardWithCenter; import com.somemore.domains.recruitboard.repository.mapper.RecruitBoardWithLocation; +import com.somemore.user.domain.QUserCommonAttribute; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -44,7 +45,8 @@ public class RecruitBoardRepositoryImpl implements RecruitBoardRepository { private static final QRecruitBoard recruitBoard = QRecruitBoard.recruitBoard; private static final QLocation location = QLocation.location; - private static final QCenter center = QCenter.center; + private static final QNEWCenter center = QNEWCenter.nEWCenter; + private static final QUserCommonAttribute userCommonAttribute = QUserCommonAttribute.userCommonAttribute; @Override public RecruitBoard save(RecruitBoard recruitBoard) { @@ -79,8 +81,7 @@ public Optional findWithLocationById(Long id) { RecruitBoardWithLocation result = queryFactory .select(getRecruitBoardWithLocationConstructorExpression()) .from(recruitBoard) - .join(location) - .on(recruitBoard.locationId.eq(location.id)) + .join(location).on(recruitBoard.locationId.eq(location.id)) .where(exp) .fetchOne(); @@ -104,6 +105,7 @@ public Page findAllWithCenter(RecruitBoardSearchConditio .from(recruitBoard) .where(exp) .join(center).on(recruitBoard.centerId.eq(center.id)) + .join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId)) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .orderBy(toOrderSpecifiers(pageable.getSort())) @@ -113,7 +115,8 @@ public Page findAllWithCenter(RecruitBoardSearchConditio .select(recruitBoard.count()) .from(recruitBoard) .where(exp) - .join(center).on(recruitBoard.centerId.eq(center.id)); + .join(center).on(recruitBoard.centerId.eq(center.id)) + .join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId)); return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne); } @@ -133,6 +136,7 @@ public Page findAllNearby(RecruitBoardNearByCondition condit .from(recruitBoard) .join(location).on(recruitBoard.locationId.eq(location.id)) .join(center).on(recruitBoard.centerId.eq(center.id)) + .join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId)) .where(exp) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) @@ -144,6 +148,7 @@ public Page findAllNearby(RecruitBoardNearByCondition condit .from(recruitBoard) .join(location).on(recruitBoard.locationId.eq(location.id)) .join(center).on(recruitBoard.centerId.eq(center.id)) + .join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId)) .where(exp); return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne); @@ -223,7 +228,8 @@ public long updateStatusToClosedForDateRange(LocalDateTime startTime, } @Override - public long updateStatusToCompletedForDateRange(LocalDateTime startTime, LocalDateTime endTime) { + public long updateStatusToCompletedForDateRange(LocalDateTime startTime, + LocalDateTime endTime) { return queryFactory.update(recruitBoard) .set(recruitBoard.recruitStatus, COMPLETED) .where( @@ -415,7 +421,7 @@ private OrderSpecifier[] toOrderSpecifiers(Sort sort) { private static ConstructorExpression getRecruitBoardWithCenterConstructorExpression() { return Projections.constructor(RecruitBoardWithCenter.class, - recruitBoard, center.name); + recruitBoard, userCommonAttribute.name); } private static ConstructorExpression getRecruitBoardWithLocationConstructorExpression() { @@ -425,7 +431,8 @@ private static ConstructorExpression getRecruitBoardWi private static ConstructorExpression getRecruitBoardDetailConstructorExpression() { return Projections.constructor(RecruitBoardDetail.class, - recruitBoard, location.address, location.latitude, location.longitude, center.name); + recruitBoard, location.address, location.latitude, location.longitude, + userCommonAttribute.name); } // private List convertEntityToDocuments(List recruitBoards) { diff --git a/src/main/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardService.java b/src/main/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardService.java index fcb3e3440..cb058775f 100644 --- a/src/main/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardService.java +++ b/src/main/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardService.java @@ -28,11 +28,11 @@ public class CreateRecruitBoardService implements CreateRecruitBoardUseCase { private final ServerEventPublisher serverEventPublisher; @Override - public Long createRecruitBoard(RecruitBoardCreateRequestDto dto, UUID centerId, String imgUrl) { + public Long createRecruitBoard(RecruitBoardCreateRequestDto dto, UUID centerId) { recruitBoardValidator.validateRecruitBoardTime(dto.volunteerStartDateTime(), dto.volunteerEndDateTime()); Long locationId = createLocationUseCase.createLocation(dto.location()); - RecruitBoard recruitBoard = dto.toEntity(centerId, locationId, imgUrl); + RecruitBoard recruitBoard = dto.toEntity(centerId, locationId); recruitBoardRepository.save(recruitBoard); diff --git a/src/main/java/com/somemore/domains/recruitboard/service/RecruitBoardQueryService.java b/src/main/java/com/somemore/domains/recruitboard/service/RecruitBoardQueryService.java index 151146bc4..0890ace27 100644 --- a/src/main/java/com/somemore/domains/recruitboard/service/RecruitBoardQueryService.java +++ b/src/main/java/com/somemore/domains/recruitboard/service/RecruitBoardQueryService.java @@ -1,6 +1,7 @@ package com.somemore.domains.recruitboard.service; -import com.somemore.domains.center.usecase.query.CenterQueryUseCase; +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_RECRUIT_BOARD; + import com.somemore.domains.recruitboard.domain.RecruitBoard; import com.somemore.domains.recruitboard.dto.condition.RecruitBoardNearByCondition; import com.somemore.domains.recruitboard.dto.condition.RecruitBoardSearchCondition; @@ -14,23 +15,19 @@ import com.somemore.domains.recruitboard.repository.mapper.RecruitBoardWithLocation; import com.somemore.domains.recruitboard.usecase.RecruitBoardQueryUseCase; import com.somemore.global.exception.BadRequestException; +import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.UUID; - -import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_RECRUIT_BOARD; - @RequiredArgsConstructor @Transactional(readOnly = true) @Service public class RecruitBoardQueryService implements RecruitBoardQueryUseCase { private final RecruitBoardRepository recruitBoardRepository; - private final CenterQueryUseCase centerQueryUseCase; @Override public RecruitBoard getById(Long id) { @@ -70,9 +67,7 @@ public Page getRecruitBoardsNearby( @Override public Page getRecruitBoardsByCenterId(UUID centerId, - RecruitBoardSearchCondition condition) { - centerQueryUseCase.validateCenterExists(centerId); - + RecruitBoardSearchCondition condition) { Page boards = recruitBoardRepository.findAllByCenterId(centerId, condition); return boards.map(RecruitBoardResponseDto::from); } diff --git a/src/main/java/com/somemore/domains/recruitboard/service/UpdateRecruitBoardService.java b/src/main/java/com/somemore/domains/recruitboard/service/UpdateRecruitBoardService.java index c8d644864..50c0c1126 100644 --- a/src/main/java/com/somemore/domains/recruitboard/service/UpdateRecruitBoardService.java +++ b/src/main/java/com/somemore/domains/recruitboard/service/UpdateRecruitBoardService.java @@ -26,15 +26,14 @@ public class UpdateRecruitBoardService implements UpdateRecruitBoardUseCase { private final Clock clock; @Override - public void updateRecruitBoard(RecruitBoardUpdateRequestDto dto, Long id, UUID centerId, - String imgUrl) { + public void updateRecruitBoard(RecruitBoardUpdateRequestDto dto, Long id, UUID centerId) { RecruitBoard recruitBoard = getRecruitBoard(id); validateUpdatableAndWriter(recruitBoard, centerId); recruitBoardValidator.validateUpdateRecruitBoardTime(recruitBoard.getCreatedAt(), dto.volunteerStartDateTime(), dto.volunteerEndDateTime()); - recruitBoard.updateWith(dto, imgUrl); + recruitBoard.updateWith(dto); } @Override diff --git a/src/main/java/com/somemore/domains/recruitboard/usecase/CreateRecruitBoardUseCase.java b/src/main/java/com/somemore/domains/recruitboard/usecase/CreateRecruitBoardUseCase.java index 73e19df05..31b6e78b5 100644 --- a/src/main/java/com/somemore/domains/recruitboard/usecase/CreateRecruitBoardUseCase.java +++ b/src/main/java/com/somemore/domains/recruitboard/usecase/CreateRecruitBoardUseCase.java @@ -6,5 +6,5 @@ public interface CreateRecruitBoardUseCase { - Long createRecruitBoard(RecruitBoardCreateRequestDto requestDto, UUID centerId, String imgUrl); + Long createRecruitBoard(RecruitBoardCreateRequestDto requestDto, UUID centerId); } diff --git a/src/main/java/com/somemore/domains/recruitboard/usecase/UpdateRecruitBoardUseCase.java b/src/main/java/com/somemore/domains/recruitboard/usecase/UpdateRecruitBoardUseCase.java index 968dd74cf..c44e532d5 100644 --- a/src/main/java/com/somemore/domains/recruitboard/usecase/UpdateRecruitBoardUseCase.java +++ b/src/main/java/com/somemore/domains/recruitboard/usecase/UpdateRecruitBoardUseCase.java @@ -7,8 +7,7 @@ public interface UpdateRecruitBoardUseCase { - void updateRecruitBoard(RecruitBoardUpdateRequestDto dto, Long id, UUID centerId, - String imgUrl); + void updateRecruitBoard(RecruitBoardUpdateRequestDto dto, Long id, UUID centerId); void updateRecruitBoardLocation(RecruitBoardLocationUpdateRequestDto requestDto, Long id, UUID centerId); diff --git a/src/test/java/com/somemore/domains/recruitboard/controller/RecruitBoardCommandApiControllerTest.java b/src/test/java/com/somemore/domains/recruitboard/controller/RecruitBoardCommandApiControllerTest.java index 1081d5a8c..011d9525f 100644 --- a/src/test/java/com/somemore/domains/recruitboard/controller/RecruitBoardCommandApiControllerTest.java +++ b/src/test/java/com/somemore/domains/recruitboard/controller/RecruitBoardCommandApiControllerTest.java @@ -1,5 +1,19 @@ package com.somemore.domains.recruitboard.controller; +import static com.somemore.domains.recruitboard.domain.RecruitStatus.CLOSED; +import static com.somemore.domains.recruitboard.domain.VolunteerCategory.OTHER; +import static com.somemore.support.fixture.LocalDateTimeFixture.createStartDateTime; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willDoNothing; +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.somemore.domains.location.dto.request.LocationCreateRequestDto; import com.somemore.domains.recruitboard.domain.RecruitStatus; import com.somemore.domains.recruitboard.dto.request.RecruitBoardCreateRequestDto; @@ -9,33 +23,14 @@ import com.somemore.domains.recruitboard.usecase.CreateRecruitBoardUseCase; import com.somemore.domains.recruitboard.usecase.DeleteRecruitBoardUseCase; import com.somemore.domains.recruitboard.usecase.UpdateRecruitBoardUseCase; -import com.somemore.global.imageupload.usecase.ImageUploadUseCase; import com.somemore.support.ControllerTestSupport; -import com.somemore.support.annotation.WithMockCustomUser; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; -import org.springframework.test.web.servlet.request.RequestPostProcessor; - +import com.somemore.support.annotation.MockUser; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.UUID; - -import static com.somemore.domains.recruitboard.domain.RecruitStatus.CLOSED; -import static com.somemore.domains.recruitboard.domain.VolunteerCategory.OTHER; -import static com.somemore.support.fixture.LocalDateTimeFixture.createStartDateTime; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.BDDMockito.given; -import static org.mockito.BDDMockito.willDoNothing; -import static org.springframework.http.MediaType.MULTIPART_FORM_DATA; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; class RecruitBoardCommandApiControllerTest extends ControllerTestSupport { @@ -48,12 +43,10 @@ class RecruitBoardCommandApiControllerTest extends ControllerTestSupport { @MockBean private DeleteRecruitBoardUseCase deleteRecruitBoardUseCase; - @MockBean - private ImageUploadUseCase imageUploadUseCase; @Test @DisplayName("봉사 활동 모집글 등록 성공 테스트") - @WithMockCustomUser(role = "CENTER") + @MockUser(role = "ROLE_CENTER") void createRecruitBoard_success() throws Exception { // given LocalDateTime startDateTime = createStartDateTime(); @@ -65,7 +58,7 @@ void createRecruitBoard_success() throws Exception { .longitude(BigDecimal.valueOf(127.010842267696)) .build(); - RecruitBoardCreateRequestDto dto = RecruitBoardCreateRequestDto.builder() + RecruitBoardCreateRequestDto requestDto = RecruitBoardCreateRequestDto.builder() .title("봉사 모집글 작성") .content("봉사 하실분을 모집합니다.
") .region("지역") @@ -78,43 +71,27 @@ void createRecruitBoard_success() throws Exception { .location(location) .build(); - MockMultipartFile imageFile = new MockMultipartFile( - "img_file", - "test-image.jpg", - MediaType.IMAGE_JPEG_VALUE, - "test image content".getBytes() - ); - - MockMultipartFile requestData = new MockMultipartFile( - "data", - "", - MediaType.APPLICATION_JSON_VALUE, - objectMapper.writeValueAsBytes(dto) - ); - - String mockImageUrl = "http://example.com/image/test-image.jpg"; - long mockRecruitBoardId = 1L; + String requestBody = objectMapper.writeValueAsString(requestDto); + long boardId = 1L; - given(imageUploadUseCase.uploadImage(any())).willReturn(mockImageUrl); - given(createRecruitBoardUseCase.createRecruitBoard(any(), any(UUID.class), - anyString())).willReturn(mockRecruitBoardId); + given(createRecruitBoardUseCase.createRecruitBoard(any(), any(UUID.class))) + .willReturn(boardId); // when - mockMvc.perform(multipart("/api/recruit-board") - .file(requestData) - .file(imageFile) - .contentType(MULTIPART_FORM_DATA) + mockMvc.perform(post("/api/recruit-board") + .content(requestBody) + .contentType(APPLICATION_JSON) .header("Authorization", "Bearer access-token")) // then .andExpect(status().isOk()) .andExpect(jsonPath("$.code").value(201)) - .andExpect(jsonPath("$.data").value(mockRecruitBoardId)) + .andExpect(jsonPath("$.data").value(boardId)) .andExpect(jsonPath("$.message").value("봉사 활동 모집글 등록 성공")); } @DisplayName("봉사 활동 모집글 수정 성공 테스트") @Test - @WithMockCustomUser(role = "CENTER") + @MockUser(role = "ROLE_CENTER") void updateRecruitBoard() throws Exception { // given LocalDateTime startDateTime = createStartDateTime(); @@ -132,40 +109,15 @@ void updateRecruitBoard() throws Exception { .admitted(true) .build(); - MockMultipartFile imageFile = new MockMultipartFile( - "img_file", - "test-image.jpg", - MediaType.IMAGE_JPEG_VALUE, - "test image content".getBytes() - ); - - MockMultipartFile requestData = new MockMultipartFile( - "data", - "", - MediaType.APPLICATION_JSON_VALUE, - objectMapper.writeValueAsBytes(requestDto) - ); - - String mockImageUrl = "http://example.com/image/test-image.jpg"; - - given(imageUploadUseCase.uploadImage(any())).willReturn(mockImageUrl); willDoNothing().given(updateRecruitBoardUseCase) - .updateRecruitBoard(any(), any(), any(UUID.class), anyString()); + .updateRecruitBoard(any(), any(), any(UUID.class)); - MockMultipartHttpServletRequestBuilder builder = multipart("/api/recruit-board/{id}", 1); - builder.with(new RequestPostProcessor() { - @Override - public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) { - request.setMethod("PUT"); - return request; - } - }); + String requestBody = objectMapper.writeValueAsString(requestDto); // when - mockMvc.perform(builder - .file(requestData) - .file(imageFile) - .contentType(MULTIPART_FORM_DATA) + mockMvc.perform(put("/api/recruit-board/{id}", 1) + .content(requestBody) + .contentType(APPLICATION_JSON) .header("Authorization", "Bearer access-token")) //then .andExpect(status().isOk()) @@ -176,7 +128,7 @@ public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) @DisplayName("봉사 활동 모집글 위치 수정 성공 테스트") @Test - @WithMockCustomUser(role = "CENTER") + @MockUser(role = "ROLE_CENTER") void updateRecruitBoardLocation() throws Exception { // given RecruitBoardLocationUpdateRequestDto requestDto = RecruitBoardLocationUpdateRequestDto.builder() @@ -194,7 +146,7 @@ void updateRecruitBoardLocation() throws Exception { // when mockMvc.perform(put("/api/recruit-board/{id}/location", 1L) .content(requestBody) - .contentType(MediaType.APPLICATION_JSON) + .contentType(APPLICATION_JSON) .header("Authorization", "Bearer access-token")) // then .andExpect(status().isOk()) @@ -205,7 +157,7 @@ void updateRecruitBoardLocation() throws Exception { @DisplayName("봉사 활동 상태 변경 성공") @Test - @WithMockCustomUser(role = "CENTER") + @MockUser(role = "ROLE_CENTER") void updateRecruitBoardStatus() throws Exception { // given RecruitStatus status = CLOSED; @@ -218,7 +170,7 @@ void updateRecruitBoardStatus() throws Exception { // when mockMvc.perform(patch("/api/recruit-board/{id}", 1L) .content(requestBody) - .contentType(MediaType.APPLICATION_JSON) + .contentType(APPLICATION_JSON) .header("Authorization", "Bearer access-token")) //then .andExpect(status().isOk()) @@ -229,7 +181,7 @@ void updateRecruitBoardStatus() throws Exception { @DisplayName("봉사 활동 모집글 삭제 성공") @Test - @WithMockCustomUser(role = "CENTER") + @MockUser(role = "ROLE_CENTER") void deleteRecruitBoard() throws Exception { // given Long recruitBoardId = 1L; diff --git a/src/test/java/com/somemore/domains/recruitboard/domain/RecruitBoardTest.java b/src/test/java/com/somemore/domains/recruitboard/domain/RecruitBoardTest.java index 2ef35a2e2..661064eeb 100644 --- a/src/test/java/com/somemore/domains/recruitboard/domain/RecruitBoardTest.java +++ b/src/test/java/com/somemore/domains/recruitboard/domain/RecruitBoardTest.java @@ -30,7 +30,6 @@ void setUp() { @Test void updateRecruitBoard() { // given - String imgUrl = "https://image.domain.com/updates"; LocalDateTime updateStartDateTime = createUpdateStartDateTime(); LocalDateTime updateEndDateTime = updateStartDateTime.plusHours(2); @@ -45,12 +44,11 @@ void updateRecruitBoard() { .admitted(true).build(); // when - board.updateWith(dto, imgUrl); + board.updateWith(dto); // then assertThat(board.getTitle()).isEqualTo(dto.title()); assertThat(board.getContent()).isEqualTo(dto.content()); - assertThat(board.getImgUrl()).isEqualTo(imgUrl); } @DisplayName("봉사 활동 지역을 수정할 수 있다.") @@ -152,7 +150,6 @@ public static RecruitBoard createRecruitBoard(UUID centerId) { .content("내용") .recruitmentInfo(recruitmentInfo) .status(RECRUITING) - .imgUrl("이미지 링크") .build(); } } diff --git a/src/test/java/com/somemore/domains/recruitboard/repository/RecruitBoardRepositoryImplTest.java b/src/test/java/com/somemore/domains/recruitboard/repository/RecruitBoardRepositoryImplTest.java index 5df52ef81..f34a9577e 100644 --- a/src/test/java/com/somemore/domains/recruitboard/repository/RecruitBoardRepositoryImplTest.java +++ b/src/test/java/com/somemore/domains/recruitboard/repository/RecruitBoardRepositoryImplTest.java @@ -1,16 +1,16 @@ package com.somemore.domains.recruitboard.repository; +import static com.somemore.center.domain.NEWCenter.createDefault; import static com.somemore.domains.recruitboard.domain.RecruitStatus.CLOSED; import static com.somemore.domains.recruitboard.domain.RecruitStatus.COMPLETED; import static com.somemore.domains.recruitboard.domain.RecruitStatus.RECRUITING; import static com.somemore.domains.recruitboard.domain.VolunteerCategory.ADMINISTRATIVE_SUPPORT; import static com.somemore.domains.recruitboard.domain.VolunteerCategory.OTHER; -import static com.somemore.support.fixture.CenterFixture.createCenter; import static com.somemore.support.fixture.LocationFixture.createLocation; import static org.assertj.core.api.Assertions.assertThat; -import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.repository.center.CenterRepository; +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; import com.somemore.domains.location.domain.Location; import com.somemore.domains.location.repository.LocationRepository; import com.somemore.domains.recruitboard.domain.RecruitBoard; @@ -23,6 +23,9 @@ import com.somemore.domains.recruitboard.repository.mapper.RecruitBoardWithCenter; import com.somemore.domains.recruitboard.repository.mapper.RecruitBoardWithLocation; import com.somemore.support.IntegrationTestSupport; +import com.somemore.user.domain.UserCommonAttribute; +import com.somemore.user.domain.UserRole; +import com.somemore.user.repository.usercommonattribute.UserCommonAttributeRepository; import jakarta.persistence.EntityManager; import java.time.LocalDateTime; import java.util.List; @@ -45,7 +48,10 @@ class RecruitBoardRepositoryImplTest extends IntegrationTestSupport { private RecruitBoardRepositoryImpl recruitBoardRepository; @Autowired - private CenterRepository centerRepository; + private NEWCenterRepository centerRepository; + + @Autowired + private UserCommonAttributeRepository userCommonAttributeRepository; @Autowired private LocationRepository locationRepository; @@ -54,7 +60,8 @@ class RecruitBoardRepositoryImplTest extends IntegrationTestSupport { private EntityManager em; private Location location; - private Center center; + private UserCommonAttribute userCommonAttribute; + private NEWCenter center; private RecruitBoard board; @BeforeEach @@ -62,7 +69,12 @@ void setUp() { location = createLocation(); locationRepository.save(location); - center = createCenter(); + UUID userId = UUID.randomUUID(); + + userCommonAttribute = createUserCommonAttribute(userId); + userCommonAttributeRepository.save(userCommonAttribute); + + center = createCenter(userId); centerRepository.save(center); board = createRecruitBoard(center.getId(), location.getId(), RECRUITING); @@ -471,7 +483,15 @@ void updateStatusToCompletedForDateRange() { // recruitBoardRepository.deleteDocument(savedBoard2.getId()); // } - public static RecruitBoard createRecruitBoard(UUID centerId, Long locationId, + private static UserCommonAttribute createUserCommonAttribute(UUID userId) { + return UserCommonAttribute.createDefault(userId, UserRole.CENTER); + } + + private static NEWCenter createCenter(UUID userId) { + return createDefault(userId); + } + + private static RecruitBoard createRecruitBoard(UUID centerId, Long locationId, RecruitStatus status) { RecruitmentInfo recruitmentInfo = RecruitmentInfo.builder() @@ -489,13 +509,12 @@ public static RecruitBoard createRecruitBoard(UUID centerId, Long locationId, .locationId(locationId) .title("모집글 제목") .content("모집글 내용") - .imgUrl("이미지 링크") .recruitmentInfo(recruitmentInfo) .status(status) .build(); } - public static RecruitBoard createRecruitBoard(UUID centerId, String title, + private static RecruitBoard createRecruitBoard(UUID centerId, String title, VolunteerCategory category, String region, boolean admitted, RecruitStatus status) { @@ -514,7 +533,6 @@ public static RecruitBoard createRecruitBoard(UUID centerId, String title, .locationId(1L) .title(title) .content("모집글 내용") - .imgUrl("이미지 링크") .recruitmentInfo(recruitmentInfo) .status(status) .build(); @@ -538,7 +556,6 @@ private static RecruitBoard createRecruitBoard(LocalDateTime startTime, LocalDat .locationId(1L) .title("모집글 제목") .content("모집글 내용") - .imgUrl("이미지 링크") .recruitmentInfo(recruitmentInfo) .status(status) .build(); diff --git a/src/test/java/com/somemore/domains/recruitboard/scheduler/RecruitBoardStatusUpdateSchedulerTest.java b/src/test/java/com/somemore/domains/recruitboard/scheduler/RecruitBoardStatusUpdateSchedulerTest.java index 79b9d2d87..6f5c26aa6 100644 --- a/src/test/java/com/somemore/domains/recruitboard/scheduler/RecruitBoardStatusUpdateSchedulerTest.java +++ b/src/test/java/com/somemore/domains/recruitboard/scheduler/RecruitBoardStatusUpdateSchedulerTest.java @@ -98,7 +98,6 @@ private static RecruitBoard createRecruitBoard(LocalDateTime startTime, LocalDat .locationId(1L) .title("모집글 제목") .content("모집글 내용") - .imgUrl("이미지 링크") .recruitmentInfo(recruitmentInfo) .status(status) .build(); diff --git a/src/test/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardServiceTest.java b/src/test/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardServiceTest.java index 81b98819c..1c19ddb41 100644 --- a/src/test/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardServiceTest.java +++ b/src/test/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardServiceTest.java @@ -68,10 +68,9 @@ void createRecruitBoardWithDto() { .build(); UUID centerId = UUID.randomUUID(); - String imgUrl = "https://image.domain.com/links"; // when - Long saveId = createRecruitBoardService.createRecruitBoard(dto, centerId, imgUrl); + Long saveId = createRecruitBoardService.createRecruitBoard(dto, centerId); // then Optional recruitBoard = recruitBoardRepository.findById(saveId); @@ -79,7 +78,6 @@ void createRecruitBoardWithDto() { assertThat(recruitBoard).isPresent(); assertThat(recruitBoard.get().getId()).isEqualTo(saveId); assertThat(recruitBoard.get().getCenterId()).isEqualTo(centerId); - assertThat(recruitBoard.get().getImgUrl()).isEqualTo(imgUrl); } } diff --git a/src/test/java/com/somemore/domains/recruitboard/service/DeleteRecruitBoardServiceTest.java b/src/test/java/com/somemore/domains/recruitboard/service/DeleteRecruitBoardServiceTest.java index 45b272ece..cf5dc0248 100644 --- a/src/test/java/com/somemore/domains/recruitboard/service/DeleteRecruitBoardServiceTest.java +++ b/src/test/java/com/somemore/domains/recruitboard/service/DeleteRecruitBoardServiceTest.java @@ -71,7 +71,6 @@ private static RecruitBoard createRecruitBoard() { .locationId(1L) .title("봉사모집제목") .content("봉사모집내용") - .imgUrl("https://image.domain.com/links") .recruitmentInfo(recruitmentInfo) .status(RECRUITING) .build(); diff --git a/src/test/java/com/somemore/domains/recruitboard/service/RecruitBoardQueryServiceTest.java b/src/test/java/com/somemore/domains/recruitboard/service/RecruitBoardQueryServiceTest.java index 839ee31ea..9d9e3d7ac 100644 --- a/src/test/java/com/somemore/domains/recruitboard/service/RecruitBoardQueryServiceTest.java +++ b/src/test/java/com/somemore/domains/recruitboard/service/RecruitBoardQueryServiceTest.java @@ -1,20 +1,21 @@ package com.somemore.domains.recruitboard.service; -import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_CENTER; +import static com.somemore.center.domain.NEWCenter.createDefault; +import static com.somemore.domains.recruitboard.domain.RecruitStatus.CLOSED; +import static com.somemore.domains.recruitboard.domain.RecruitStatus.COMPLETED; +import static com.somemore.domains.recruitboard.domain.RecruitStatus.RECRUITING; +import static com.somemore.domains.recruitboard.domain.VolunteerCategory.OTHER; import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_RECRUIT_BOARD; -import static com.somemore.support.fixture.CenterFixture.createCenter; -import static com.somemore.support.fixture.LocationFixture.createLocation; -import static com.somemore.support.fixture.RecruitBoardFixture.createCompletedRecruitBoard; -import static com.somemore.support.fixture.RecruitBoardFixture.createRecruitBoard; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.repository.center.CenterRepository; +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; import com.somemore.domains.location.domain.Location; import com.somemore.domains.location.repository.LocationRepository; import com.somemore.domains.recruitboard.domain.RecruitBoard; import com.somemore.domains.recruitboard.domain.RecruitStatus; +import com.somemore.domains.recruitboard.domain.RecruitmentInfo; import com.somemore.domains.recruitboard.dto.condition.RecruitBoardNearByCondition; import com.somemore.domains.recruitboard.dto.condition.RecruitBoardSearchCondition; import com.somemore.domains.recruitboard.dto.response.RecruitBoardDetailResponseDto; @@ -24,6 +25,11 @@ import com.somemore.domains.recruitboard.repository.RecruitBoardRepository; import com.somemore.global.exception.BadRequestException; import com.somemore.support.IntegrationTestSupport; +import com.somemore.user.domain.UserCommonAttribute; +import com.somemore.user.domain.UserRole; +import com.somemore.user.repository.usercommonattribute.UserCommonAttributeRepository; +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; @@ -49,16 +55,33 @@ class RecruitBoardQueryServiceTest extends IntegrationTestSupport { private RecruitBoardRepository recruitBoardRepository; @Autowired - private CenterRepository centerRepository; + private LocationRepository locationRepository; @Autowired - private LocationRepository locationRepository; + private NEWCenterRepository centerRepository; + + @Autowired + private UserCommonAttributeRepository userCommonAttributeRepository; + private UserCommonAttribute userCommonAttribute; + private NEWCenter center; private RecruitBoard recruitBoard; + private Location location; @BeforeEach void setUp() { - recruitBoard = createRecruitBoard(); + UUID userId = UUID.randomUUID(); + + userCommonAttribute = createUserCommonAttribute(userId); + userCommonAttributeRepository.save(userCommonAttribute); + + center = createCenter(userId); + centerRepository.save(center); + + location = createLocation(); + locationRepository.save(location); + + recruitBoard = createRecruitBoard(center.getId(), location.getId()); recruitBoardRepository.save(recruitBoard); } @@ -84,8 +107,8 @@ void getByIdWithDoesNotExistId() { // when // then assertThatThrownBy( - () -> recruitBoardQueryService.getRecruitBoardById(wrongId) - ).isInstanceOf(BadRequestException.class) + () -> recruitBoardQueryService.getRecruitBoardById(wrongId)) + .isInstanceOf(BadRequestException.class) .hasMessage(NOT_EXISTS_RECRUIT_BOARD.getMessage()); } @@ -93,18 +116,14 @@ void getByIdWithDoesNotExistId() { @Test void getWithCenterById() { // given - Location location = createLocation("특별한 주소"); - locationRepository.save(location); - - RecruitBoard board = createRecruitBoard(location.getId()); - recruitBoardRepository.save(board); + Long id = recruitBoard.getId(); // when RecruitBoardWithLocationResponseDto responseDto = recruitBoardQueryService.getWithLocationById( - board.getId()); + id); // then - assertThat(responseDto.id()).isEqualTo(board.getId()); + assertThat(responseDto.id()).isEqualTo(id); assertThat(responseDto.location().address()).isEqualTo(location.getAddress()); } @@ -117,8 +136,8 @@ void getWithCenterByIdWhenNotExistId() { // when // then assertThatThrownBy( - () -> recruitBoardQueryService.getWithLocationById(wrongId) - ).isInstanceOf(BadRequestException.class) + () -> recruitBoardQueryService.getWithLocationById(wrongId)) + .isInstanceOf(BadRequestException.class) .hasMessage(NOT_EXISTS_RECRUIT_BOARD.getMessage()); } @@ -126,13 +145,6 @@ void getWithCenterByIdWhenNotExistId() { @Test void getAllWithCenter() { // given - String name = "특별한 기관"; - Center center = createCenter(name); - centerRepository.save(center); - - RecruitBoard recruitBoard1 = createRecruitBoard(center.getId()); - recruitBoardRepository.save(recruitBoard1); - Pageable pageable = getPageable(); RecruitBoardSearchCondition condition = RecruitBoardSearchCondition.builder() .pageable(pageable) @@ -145,21 +157,14 @@ void getAllWithCenter() { // then assertThat(dtos).isNotEmpty(); assertThat(dtos.getTotalElements()).isEqualTo(1); - assertThat(dtos.getContent().getFirst().center().name()).isEqualTo(name); + assertThat(dtos.getContent().getFirst().center().name()).isEqualTo( + userCommonAttribute.getName()); } @DisplayName("위치 기반으로 주변 모집글을 페이징하여 조회할 수 있다") @Test void getRecruitBoardsNearBy() { // given - Center center = createCenter(); - centerRepository.save(center); - Location location = createLocation(); - locationRepository.save(location); - - RecruitBoard board = createRecruitBoard(center.getId(), location.getId()); - recruitBoardRepository.save(board); - Pageable pageable = getPageable(); RecruitBoardNearByCondition condition = RecruitBoardNearByCondition.builder() .latitude(location.getLatitude().doubleValue()) @@ -175,18 +180,16 @@ void getRecruitBoardsNearBy() { // then assertThat(result).isNotEmpty(); assertThat(result.getTotalElements()).isEqualTo(1); - assertThat(result.getContent().getFirst().id()).isEqualTo(board.getId()); + assertThat(result.getContent().getFirst().id()).isEqualTo(recruitBoard.getId()); } @DisplayName("기관 아이디로 모집글을 페이징하여 조회할 수 있다") @Test void getRecruitBoardsByCenterId() { // given - Center center = createCenter("센터"); - centerRepository.save(center); - RecruitBoard one = createRecruitBoard(center.getId()); - RecruitBoard two = createRecruitBoard(center.getId()); - RecruitBoard three = createRecruitBoard(center.getId()); + RecruitBoard one = createRecruitBoard(center.getId(), location.getId()); + RecruitBoard two = createRecruitBoard(center.getId(), location.getId()); + RecruitBoard three = createRecruitBoard(center.getId(), location.getId()); recruitBoardRepository.saveAll(List.of(one, two, three)); UUID centerId = center.getId(); @@ -201,23 +204,7 @@ void getRecruitBoardsByCenterId() { // then assertThat(result).isNotEmpty(); - assertThat(result.getTotalElements()).isEqualTo(3); - } - - @DisplayName("존재하지 않는 기관 아이디로 모집글을 조회할 경우 에러가 발생한다") - @Test - void getRecruitBoardsByCenterIdWhenNotExistsCenterId() { - // given - UUID wrongCenterId = UUID.randomUUID(); - RecruitBoardSearchCondition condition = RecruitBoardSearchCondition.builder() - .build(); - - // when - // then - assertThatThrownBy( - () -> recruitBoardQueryService.getRecruitBoardsByCenterId(wrongCenterId, condition)) - .isInstanceOf(BadRequestException.class) - .hasMessage(NOT_EXISTS_CENTER.getMessage()); + assertThat(result.getTotalElements()).isEqualTo(4); } @DisplayName("센터 ID로 완료되지 않은 모집 게시글들의 ID를 조회할 수 있다") @@ -226,27 +213,13 @@ void findNotCompletedIdsByCenterIds() { // given UUID centerId = UUID.randomUUID(); - RecruitBoard deletedRecruitingBoard = createRecruitBoard(centerId); - deletedRecruitingBoard.markAsDeleted(); - recruitBoardRepository.save(deletedRecruitingBoard); - - RecruitBoard recruitingBoard = createRecruitBoard(centerId); + RecruitBoard recruitingBoard = createRecruitBoard(centerId, RECRUITING); recruitBoardRepository.save(recruitingBoard); - RecruitBoard deletedClosedBoard = createRecruitBoard(centerId); - deletedClosedBoard.updateRecruitStatus(RecruitStatus.CLOSED); - deletedClosedBoard.markAsDeleted(); - recruitBoardRepository.save(deletedClosedBoard); - - RecruitBoard closedBoard = createRecruitBoard(centerId); - closedBoard.updateRecruitStatus(RecruitStatus.CLOSED); + RecruitBoard closedBoard = createRecruitBoard(centerId, CLOSED); recruitBoardRepository.save(closedBoard); - RecruitBoard deletedCompletedRecruitBoard = createCompletedRecruitBoard(); - deletedCompletedRecruitBoard.markAsDeleted(); - recruitBoardRepository.save(deletedCompletedRecruitBoard); - - RecruitBoard completedRecruitBoard = createCompletedRecruitBoard(); + RecruitBoard completedRecruitBoard = createRecruitBoard(centerId, COMPLETED); recruitBoardRepository.save(completedRecruitBoard); // when @@ -257,9 +230,6 @@ void findNotCompletedIdsByCenterIds() { assertThat(notCompletedBoardIds) .hasSize(2) .doesNotContain( - deletedRecruitingBoard.getId(), - deletedClosedBoard.getId(), - deletedCompletedRecruitBoard.getId(), completedRecruitBoard.getId()); } @@ -267,9 +237,9 @@ void findNotCompletedIdsByCenterIds() { @Test void getAllByIds() { // given - RecruitBoard board1 = createRecruitBoard(); - RecruitBoard board2 = createRecruitBoard(); - RecruitBoard board3 = createRecruitBoard(); + RecruitBoard board1 = createRecruitBoard(UUID.randomUUID()); + RecruitBoard board2 = createRecruitBoard(UUID.randomUUID()); + RecruitBoard board3 = createRecruitBoard(UUID.randomUUID()); recruitBoardRepository.saveAll(List.of(board1, board2, board3)); List ids = List.of(board1.getId(), board2.getId(), board3.getId(), 100000L); @@ -316,6 +286,88 @@ void getAllByIds() { // recruitBoardRepository.deleteDocument(savedBoard2.getId()); // } + private static UserCommonAttribute createUserCommonAttribute(UUID userId) { + return UserCommonAttribute.createDefault(userId, UserRole.CENTER); + } + + private static NEWCenter createCenter(UUID userId) { + return createDefault(userId); + } + + private static RecruitBoard createRecruitBoard(UUID centerId, Long locationId) { + + RecruitmentInfo recruitmentInfo = RecruitmentInfo.builder() + .region("지역") + .recruitmentCount(1) + .volunteerStartDateTime(LocalDateTime.now()) + .volunteerEndDateTime(LocalDateTime.now()) + .volunteerHours(10) + .volunteerCategory(OTHER) + .admitted(true) + .build(); + + return RecruitBoard.builder() + .centerId(centerId) + .locationId(locationId) + .title("모집글 제목") + .content("모집글 내용") + .recruitmentInfo(recruitmentInfo) + .status(RECRUITING) + .build(); + } + + private static RecruitBoard createRecruitBoard(UUID centerId) { + + RecruitmentInfo recruitmentInfo = RecruitmentInfo.builder() + .region("지역") + .recruitmentCount(1) + .volunteerStartDateTime(LocalDateTime.now()) + .volunteerEndDateTime(LocalDateTime.now()) + .volunteerHours(10) + .volunteerCategory(OTHER) + .admitted(true) + .build(); + + return RecruitBoard.builder() + .centerId(centerId) + .locationId(200L) + .title("모집글 제목") + .content("모집글 내용") + .recruitmentInfo(recruitmentInfo) + .status(RECRUITING) + .build(); + } + + private static RecruitBoard createRecruitBoard(UUID centerId, RecruitStatus status) { + + RecruitmentInfo recruitmentInfo = RecruitmentInfo.builder() + .region("지역") + .recruitmentCount(1) + .volunteerStartDateTime(LocalDateTime.now()) + .volunteerEndDateTime(LocalDateTime.now()) + .volunteerHours(10) + .volunteerCategory(OTHER) + .admitted(true) + .build(); + + return RecruitBoard.builder() + .centerId(centerId) + .locationId(200L) + .title("모집글 제목") + .content("모집글 내용") + .recruitmentInfo(recruitmentInfo) + .status(status) + .build(); + } + + private static Location createLocation() { + return Location.builder() + .address("주소") + .latitude(BigDecimal.valueOf(37.5665)) + .longitude(BigDecimal.valueOf(126.9780)) + .build(); + } + private Pageable getPageable() { Sort sort = Sort.by(Sort.Order.desc("created_at")); return PageRequest.of(0, 5, sort); diff --git a/src/test/java/com/somemore/domains/recruitboard/service/UpdateRecruitBoardServiceTest.java b/src/test/java/com/somemore/domains/recruitboard/service/UpdateRecruitBoardServiceTest.java index 52fd9285f..f926c93cd 100644 --- a/src/test/java/com/somemore/domains/recruitboard/service/UpdateRecruitBoardServiceTest.java +++ b/src/test/java/com/somemore/domains/recruitboard/service/UpdateRecruitBoardServiceTest.java @@ -69,7 +69,6 @@ void updateRecruitBoard() { LocalDateTime current = createCurrentDateTime(); LocalDateTime newStartDateTime = createUpdateStartDateTime(); LocalDateTime newEndDateTime = newStartDateTime.plusHours(3); - String newImgUrl = "https://image.domain.com/updates"; RecruitBoardUpdateRequestDto dto = RecruitBoardUpdateRequestDto.builder() .title("업데이트 제목") .content("업데이트 내용") @@ -85,8 +84,7 @@ void updateRecruitBoard() { setMockClock(current); // when - updateRecruitBoardService.updateRecruitBoard(dto, recruitBoard.getId(), centerId, - newImgUrl); + updateRecruitBoardService.updateRecruitBoard(dto, recruitBoard.getId(), centerId); // then RecruitBoard updatedRecruitBoard = recruitBoardRepository.findById(recruitBoard.getId()) @@ -94,7 +92,6 @@ void updateRecruitBoard() { assertThat(updatedRecruitBoard.getTitle()).isEqualTo(dto.title()); assertThat(updatedRecruitBoard.getContent()).isEqualTo(dto.content()); - assertThat(updatedRecruitBoard.getImgUrl()).isEqualTo(newImgUrl); RecruitmentInfo recruitmentInfo = updatedRecruitBoard.getRecruitmentInfo(); assertThat(recruitmentInfo.getRecruitmentCount()).isEqualTo(dto.recruitmentCount()); @@ -181,7 +178,6 @@ private static RecruitBoard createRecruitBoard(UUID centerId, Long locationId, .locationId(locationId) .title("봉사모집제목") .content("봉사모집내용") - .imgUrl("https://image.domain.com/links") .recruitmentInfo(recruitmentInfo) .status(RECRUITING) .build(); diff --git a/src/test/java/com/somemore/domains/recruitboard/service/validator/RecruitBoardValidatorTest.java b/src/test/java/com/somemore/domains/recruitboard/service/validator/RecruitBoardValidatorTest.java index 212abcf83..fdaf1fa16 100644 --- a/src/test/java/com/somemore/domains/recruitboard/service/validator/RecruitBoardValidatorTest.java +++ b/src/test/java/com/somemore/domains/recruitboard/service/validator/RecruitBoardValidatorTest.java @@ -168,7 +168,6 @@ public static RecruitBoard createRecruitBoard() { .content("내용") .recruitmentInfo(recruitmentInfo) .status(RECRUITING) - .imgUrl("이미지 링크") .build(); } diff --git a/src/test/java/com/somemore/support/annotation/MockUser.java b/src/test/java/com/somemore/support/annotation/MockUser.java new file mode 100644 index 000000000..1a410b01c --- /dev/null +++ b/src/test/java/com/somemore/support/annotation/MockUser.java @@ -0,0 +1,17 @@ +package com.somemore.support.annotation; + +import jakarta.validation.constraints.NotNull; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import org.springframework.security.test.context.support.WithSecurityContext; + +@Retention(RetentionPolicy.RUNTIME) +@WithSecurityContext(factory = MockUserSecurityContextFactory.class) +public @interface MockUser { + + String userId() default "123e4567-e89b-12d3-a456-426614174000"; + + String roleId() default "123e4567-e89b-12d3-a456-426614174000"; + + String role() default "ROLE_VOLUNTEER"; +} diff --git a/src/test/java/com/somemore/support/annotation/MockUserSecurityContextFactory.java b/src/test/java/com/somemore/support/annotation/MockUserSecurityContextFactory.java new file mode 100644 index 000000000..5ba4a8ce6 --- /dev/null +++ b/src/test/java/com/somemore/support/annotation/MockUserSecurityContextFactory.java @@ -0,0 +1,36 @@ +package com.somemore.support.annotation; + +import com.somemore.global.auth.authentication.JwtAuthenticationToken; +import com.somemore.global.auth.authentication.UserIdentity; +import com.somemore.global.auth.jwt.domain.EncodedToken; +import com.somemore.user.domain.UserRole; +import io.jsonwebtoken.Claims; +import java.util.Collections; +import java.util.UUID; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.test.context.support.WithSecurityContextFactory; + +public class MockUserSecurityContextFactory implements WithSecurityContextFactory { + + @Override + public SecurityContext createSecurityContext(MockUser user) { + SecurityContext context = SecurityContextHolder.createEmptyContext(); + + JwtAuthenticationToken auth = createAuthenticationToken(user); + context.setAuthentication(auth); + return context; + } + + private JwtAuthenticationToken createAuthenticationToken(MockUser user) { + UUID userId = UUID.fromString(user.userId()); + UUID roleId = UUID.fromString(user.roleId()); + UserRole userRole = UserRole.from(user.role()); + UserIdentity userIdentity = UserIdentity.of(userId, roleId, userRole); + + return JwtAuthenticationToken.of(userIdentity, new EncodedToken("")); + } +} diff --git a/src/test/java/com/somemore/support/fixture/RecruitBoardFixture.java b/src/test/java/com/somemore/support/fixture/RecruitBoardFixture.java index f7cbc1f40..cc98d5576 100644 --- a/src/test/java/com/somemore/support/fixture/RecruitBoardFixture.java +++ b/src/test/java/com/somemore/support/fixture/RecruitBoardFixture.java @@ -1,20 +1,18 @@ package com.somemore.support.fixture; +import static com.somemore.domains.recruitboard.domain.RecruitStatus.CLOSED; +import static com.somemore.domains.recruitboard.domain.RecruitStatus.COMPLETED; +import static com.somemore.domains.recruitboard.domain.RecruitStatus.RECRUITING; +import static com.somemore.domains.recruitboard.domain.VolunteerCategory.OTHER; +import static com.somemore.support.fixture.LocalDateTimeFixture.createStartDateTime; + import com.somemore.domains.recruitboard.domain.RecruitBoard; import com.somemore.domains.recruitboard.domain.RecruitStatus; import com.somemore.domains.recruitboard.domain.RecruitmentInfo; import com.somemore.domains.recruitboard.domain.VolunteerCategory; - -import java.lang.reflect.Field; import java.time.LocalDateTime; import java.util.UUID; -import static com.somemore.domains.recruitboard.domain.RecruitStatus.CLOSED; -import static com.somemore.domains.recruitboard.domain.RecruitStatus.COMPLETED; -import static com.somemore.domains.recruitboard.domain.RecruitStatus.RECRUITING; -import static com.somemore.domains.recruitboard.domain.VolunteerCategory.OTHER; -import static com.somemore.support.fixture.LocalDateTimeFixture.createStartDateTime; - public class RecruitBoardFixture { private static final String REGION = "경기"; @@ -26,7 +24,6 @@ public class RecruitBoardFixture { private static final long LOCATION_ID = 1L; private static final String TITLE = "봉사모집제목"; private static final String CONTENT = "봉사모집내용"; - private static final String IMG_URL = "https://image.domain.com/links"; private static final VolunteerCategory VOLUNTEER_CATEGORY = OTHER; private static final RecruitStatus STATUS = RECRUITING; @@ -50,7 +47,6 @@ public static RecruitBoard createRecruitBoard() { .locationId(LOCATION_ID) .title(TITLE) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); @@ -73,7 +69,6 @@ public static RecruitBoard createRecruitBoard(String title) { .locationId(LOCATION_ID) .title(title) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); @@ -96,7 +91,6 @@ public static RecruitBoard createRecruitBoard(String title, UUID centerId, Long .locationId(locationId) .title(title) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); @@ -119,7 +113,6 @@ public static RecruitBoard createRecruitBoard(String title, UUID centerId) { .locationId(LOCATION_ID) .title(title) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); @@ -142,7 +135,6 @@ public static RecruitBoard createRecruitBoard(VolunteerCategory category, UUID c .locationId(LOCATION_ID) .title(TITLE) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); @@ -165,7 +157,6 @@ public static RecruitBoard createRecruitBoard(Boolean admitted, UUID centerId) { .locationId(LOCATION_ID) .title(TITLE) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); @@ -188,7 +179,6 @@ public static RecruitBoard createRecruitBoard(Long locationId) { .locationId(locationId) .title(TITLE) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); @@ -211,7 +201,6 @@ public static RecruitBoard createRecruitBoard(UUID centerId) { .locationId(LOCATION_ID) .title(TITLE) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(RECRUITING) .build(); @@ -234,13 +223,13 @@ public static RecruitBoard createRecruitBoard(UUID centerId, Long locationId) { .locationId(locationId) .title(TITLE) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); } - public static RecruitBoard createRecruitBoard(String region, VolunteerCategory volunteerCategory) { + public static RecruitBoard createRecruitBoard(String region, + VolunteerCategory volunteerCategory) { RecruitmentInfo recruitmentInfo = RecruitmentInfo.builder() .region(region) @@ -257,7 +246,6 @@ public static RecruitBoard createRecruitBoard(String region, VolunteerCategory v .locationId(LOCATION_ID) .title(TITLE) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); @@ -280,7 +268,6 @@ public static RecruitBoard createRecruitBoard(Long locationId, String title) { .locationId(locationId) .title(title) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); @@ -303,14 +290,13 @@ public static RecruitBoard createRecruitBoard(LocalDateTime start, LocalDateTime .locationId(LOCATION_ID) .title(TITLE) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) .status(STATUS) .build(); } public static RecruitBoard createCompletedRecruitBoard(UUID centerId, - VolunteerCategory category) { + VolunteerCategory category) { RecruitmentInfo recruitmentInfo = RecruitmentInfo.builder() .region(REGION) .recruitmentCount(RECRUITMENT_COUNT) @@ -321,48 +307,32 @@ public static RecruitBoard createCompletedRecruitBoard(UUID centerId, .admitted(ADMITTED) .build(); - RecruitBoard recruitBoard = RecruitBoard.builder() + return RecruitBoard.builder() .centerId(centerId) .locationId(LOCATION_ID) .title(TITLE) .content(CONTENT) - .imgUrl(IMG_URL) .recruitmentInfo(recruitmentInfo) - .status(STATUS) + .status(COMPLETED) .build(); - - setRecruitStatus(recruitBoard, COMPLETED); - - return recruitBoard; } public static RecruitBoard createCompletedRecruitBoard(VolunteerCategory category) { - RecruitBoard recruitBoard = createCompletedRecruitBoard(UUID.randomUUID(), category); - setRecruitStatus(recruitBoard, COMPLETED); - return recruitBoard; + return createCompletedRecruitBoard(UUID.randomUUID(), category); } public static RecruitBoard createCompletedRecruitBoard() { RecruitBoard recruitBoard = createCompletedRecruitBoard(UUID.randomUUID(), VOLUNTEER_CATEGORY); - setRecruitStatus(recruitBoard, COMPLETED); + recruitBoard.updateRecruitStatus(COMPLETED); return recruitBoard; } public static RecruitBoard createCloseRecruitBoard() { RecruitBoard recruitBoard = createCompletedRecruitBoard(UUID.randomUUID(), VOLUNTEER_CATEGORY); - setRecruitStatus(recruitBoard, CLOSED); + recruitBoard.updateRecruitStatus(CLOSED); return recruitBoard; } - private static void setRecruitStatus(RecruitBoard recruitBoard, RecruitStatus status) { - try { - Field recruitStatusField = RecruitBoard.class.getDeclaredField("recruitStatus"); - recruitStatusField.setAccessible(true); // private 필드 접근 가능 설정 - recruitStatusField.set(recruitBoard, status); // 필드 값 설정 - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException("리플렉션으로 recruitStatus를 설정하는 것에 실패했습니다", e); - } - } }