diff --git a/src/main/java/com/somemore/center/repository/NEWCenterRepository.java b/src/main/java/com/somemore/center/repository/NEWCenterRepository.java index c8c0d4718..ae8fcd90a 100644 --- a/src/main/java/com/somemore/center/repository/NEWCenterRepository.java +++ b/src/main/java/com/somemore/center/repository/NEWCenterRepository.java @@ -1,8 +1,9 @@ package com.somemore.center.repository; import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.record.CenterOverviewInfo; import com.somemore.center.repository.record.CenterProfileDto; - +import java.util.List; import java.util.Optional; import java.util.UUID; @@ -15,4 +16,12 @@ public interface NEWCenterRepository { Optional findByUserId(UUID userId); Optional findCenterProfileById(UUID centerId); + + boolean existsById(UUID id); + + default boolean doesNotExistById(UUID id) { + return !existsById(id); + } + + List findOverviewInfosByIds(List ids); } diff --git a/src/main/java/com/somemore/center/repository/NEWCenterRepositoryImpl.java b/src/main/java/com/somemore/center/repository/NEWCenterRepositoryImpl.java index 7f6944945..b76806250 100644 --- a/src/main/java/com/somemore/center/repository/NEWCenterRepositoryImpl.java +++ b/src/main/java/com/somemore/center/repository/NEWCenterRepositoryImpl.java @@ -5,12 +5,14 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import com.somemore.center.domain.NEWCenter; import com.somemore.center.domain.QNEWCenter; +import com.somemore.center.repository.record.CenterOverviewInfo; import com.somemore.center.repository.record.CenterProfileDto; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - +import com.somemore.user.domain.QUserCommonAttribute; +import java.util.List; import java.util.Optional; import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; @Repository("newCenterRepository") @RequiredArgsConstructor @@ -20,6 +22,7 @@ public class NEWCenterRepositoryImpl implements NEWCenterRepository { private final JPAQueryFactory queryFactory; private static final QNEWCenter center = QNEWCenter.nEWCenter; + private static final QUserCommonAttribute userCommonAttribute = QUserCommonAttribute.userCommonAttribute; @Override public NEWCenter save(NEWCenter center) { @@ -31,7 +34,7 @@ public Optional findById(UUID id) { return Optional.ofNullable( queryFactory.selectFrom(center) .where( - center.id.eq(id), + idEq(id), isNotDeleted() ) .fetchOne() @@ -60,13 +63,52 @@ public Optional findCenterProfileById(UUID centerId) { center.homepageUrl)) .from(center) .where( - center.id.eq(centerId), + idEq(centerId), isNotDeleted() ) .fetchOne() ); } + @Override + public boolean existsById(UUID id) { + return queryFactory + .selectOne() + .from(center) + .where( + idEq(id), + isNotDeleted() + ) + .fetchFirst() != null; + } + + @Override + public List findOverviewInfosByIds(List ids) { + return queryFactory + .select(Projections.constructor( + CenterOverviewInfo.class, + center.id, + userCommonAttribute.name, + userCommonAttribute.imgUrl + )) + .from(center) + .join(userCommonAttribute) + .on(userCommonAttribute.userId.eq(center.userId)) + .where( + idIn(ids), + isNotDeleted() + ) + .fetch(); + } + + private static BooleanExpression idIn(List ids) { + return center.id.in(ids); + } + + private BooleanExpression idEq(UUID id) { + return center.id.eq(id); + } + private BooleanExpression isNotDeleted() { return center.deleted.isFalse(); } diff --git a/src/main/java/com/somemore/domains/center/repository/mapper/CenterOverviewInfo.java b/src/main/java/com/somemore/center/repository/record/CenterOverviewInfo.java similarity index 71% rename from src/main/java/com/somemore/domains/center/repository/mapper/CenterOverviewInfo.java rename to src/main/java/com/somemore/center/repository/record/CenterOverviewInfo.java index e876366d4..fde17150d 100644 --- a/src/main/java/com/somemore/domains/center/repository/mapper/CenterOverviewInfo.java +++ b/src/main/java/com/somemore/center/repository/record/CenterOverviewInfo.java @@ -1,4 +1,4 @@ -package com.somemore.domains.center.repository.mapper; +package com.somemore.center.repository.record; import java.util.UUID; diff --git a/src/main/java/com/somemore/center/service/NEWCenterQueryService.java b/src/main/java/com/somemore/center/service/NEWCenterQueryService.java index b7cd0b777..72dafe5d4 100644 --- a/src/main/java/com/somemore/center/service/NEWCenterQueryService.java +++ b/src/main/java/com/somemore/center/service/NEWCenterQueryService.java @@ -1,8 +1,11 @@ package com.somemore.center.service; +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_CENTER; + import com.somemore.center.domain.NEWCenter; import com.somemore.center.dto.response.CenterProfileResponseDto; import com.somemore.center.repository.NEWCenterRepository; +import com.somemore.center.repository.record.CenterOverviewInfo; import com.somemore.center.repository.record.CenterProfileDto; import com.somemore.center.usecase.NEWCenterQueryUseCase; import com.somemore.domains.center.dto.response.PreferItemResponseDto; @@ -11,13 +14,12 @@ import com.somemore.global.exception.NoSuchElementException; import com.somemore.user.repository.usercommonattribute.record.UserProfileDto; import com.somemore.user.usecase.UserQueryUseCase; +import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.UUID; - @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -44,12 +46,25 @@ public CenterProfileResponseDto getCenterProfileById(UUID centerId) { CenterProfileDto centerProfileDto = centerRepository.findCenterProfileById(centerId) .orElseThrow(() -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_CENTER)); - UserProfileDto userProfileDto = userQueryUseCase.getUserProfileByUserId(centerProfileDto.userId()); + UserProfileDto userProfileDto = userQueryUseCase.getUserProfileByUserId( + centerProfileDto.userId()); - List preferItems = preferItemQueryUseCase.getPreferItemDtosByCenterId(centerProfileDto.id()); + List preferItems = preferItemQueryUseCase.getPreferItemDtosByCenterId( + centerProfileDto.id()); return CenterProfileResponseDto.of(centerProfileDto, userProfileDto, preferItems); } + @Override + public void validateCenterExists(UUID id) { + if (centerRepository.doesNotExistById(id)) { + throw new NoSuchElementException(NOT_EXISTS_CENTER); + } + } + + @Override + public List getCenterOverviewsByIds(List ids) { + return centerRepository.findOverviewInfosByIds(ids); + } } diff --git a/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java b/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java index ad99ee9fa..17eb2f7af 100644 --- a/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java +++ b/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java @@ -2,7 +2,8 @@ import com.somemore.center.domain.NEWCenter; import com.somemore.center.dto.response.CenterProfileResponseDto; - +import com.somemore.center.repository.record.CenterOverviewInfo; +import java.util.List; import java.util.UUID; public interface NEWCenterQueryUseCase { @@ -12,4 +13,8 @@ public interface NEWCenterQueryUseCase { UUID getIdByUserId(UUID userId); CenterProfileResponseDto getCenterProfileById(UUID centerId); + + void validateCenterExists(UUID id); + + List getCenterOverviewsByIds(List ids); } diff --git a/src/main/java/com/somemore/domains/center/repository/center/CenterRepository.java b/src/main/java/com/somemore/domains/center/repository/center/CenterRepository.java index 0858ea507..9e330930f 100644 --- a/src/main/java/com/somemore/domains/center/repository/center/CenterRepository.java +++ b/src/main/java/com/somemore/domains/center/repository/center/CenterRepository.java @@ -1,13 +1,13 @@ package com.somemore.domains.center.repository.center; +import com.somemore.center.repository.record.CenterOverviewInfo; import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.repository.mapper.CenterOverviewInfo; - import java.util.List; import java.util.Optional; import java.util.UUID; public interface CenterRepository { + Center save(Center center); boolean existsById(UUID id); diff --git a/src/main/java/com/somemore/domains/center/repository/center/CenterRepositoryImpl.java b/src/main/java/com/somemore/domains/center/repository/center/CenterRepositoryImpl.java index 9e6f9a7d3..8ac7d3897 100644 --- a/src/main/java/com/somemore/domains/center/repository/center/CenterRepositoryImpl.java +++ b/src/main/java/com/somemore/domains/center/repository/center/CenterRepositoryImpl.java @@ -4,15 +4,14 @@ import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; +import com.somemore.center.repository.record.CenterOverviewInfo; import com.somemore.domains.center.domain.Center; import com.somemore.domains.center.domain.QCenter; -import com.somemore.domains.center.repository.mapper.CenterOverviewInfo; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - import java.util.List; import java.util.Optional; import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; @RequiredArgsConstructor @Repository("centerRepository") diff --git a/src/main/java/com/somemore/domains/center/service/query/CenterQueryService.java b/src/main/java/com/somemore/domains/center/service/query/CenterQueryService.java index 357d83c7b..e55bf4310 100644 --- a/src/main/java/com/somemore/domains/center/service/query/CenterQueryService.java +++ b/src/main/java/com/somemore/domains/center/service/query/CenterQueryService.java @@ -1,44 +1,22 @@ package com.somemore.domains.center.service.query; -import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.dto.response.CenterProfileResponseDto; -import com.somemore.domains.center.dto.response.PreferItemResponseDto; +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_CENTER; + import com.somemore.domains.center.repository.center.CenterRepository; -import com.somemore.domains.center.repository.mapper.CenterOverviewInfo; import com.somemore.domains.center.usecase.query.CenterQueryUseCase; -import com.somemore.domains.center.usecase.query.PreferItemQueryUseCase; import com.somemore.global.exception.BadRequestException; +import java.util.UUID; import lombok.RequiredArgsConstructor; 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_CENTER; - @RequiredArgsConstructor @Transactional(readOnly = true) @Service public class CenterQueryService implements CenterQueryUseCase { - private final PreferItemQueryUseCase preferItemQueryUseCase; private final CenterRepository centerRepository; - @Override - public CenterProfileResponseDto getCenterProfileByCenterId(UUID centerId) { - - Center center = getCenterById(centerId); - List preferItemDtos = preferItemQueryUseCase.getPreferItemDtosByCenterId(centerId); - - return CenterProfileResponseDto.of(center, preferItemDtos); - } - - @Override - public List getCenterOverviewsByIds(List centerIds) { - return centerRepository.findCenterOverviewsByIds(centerIds); - } - @Override public void validateCenterExists(UUID id) { if (centerRepository.doesNotExistById(id)) { @@ -57,8 +35,4 @@ public String getNameById(UUID id) { return name; } - private Center getCenterById(UUID centerId) { - return centerRepository.findCenterById(centerId) - .orElseThrow(() -> new BadRequestException(NOT_EXISTS_CENTER.getMessage())); - } } diff --git a/src/main/java/com/somemore/domains/center/usecase/query/CenterQueryUseCase.java b/src/main/java/com/somemore/domains/center/usecase/query/CenterQueryUseCase.java index 0b19eeb84..35847eaaa 100644 --- a/src/main/java/com/somemore/domains/center/usecase/query/CenterQueryUseCase.java +++ b/src/main/java/com/somemore/domains/center/usecase/query/CenterQueryUseCase.java @@ -1,16 +1,10 @@ package com.somemore.domains.center.usecase.query; -import com.somemore.domains.center.dto.response.CenterProfileResponseDto; -import com.somemore.domains.center.repository.mapper.CenterOverviewInfo; - -import java.util.List; import java.util.UUID; public interface CenterQueryUseCase { - CenterProfileResponseDto getCenterProfileByCenterId(UUID centerId); - - List getCenterOverviewsByIds(List centerIds); void validateCenterExists(UUID centerId); + String getNameById(UUID id); } diff --git a/src/main/java/com/somemore/domains/interestcenter/controller/InterestCenterCommandApiController.java b/src/main/java/com/somemore/domains/interestcenter/controller/InterestCenterCommandApiController.java index 3e8fc83a2..b76f43621 100644 --- a/src/main/java/com/somemore/domains/interestcenter/controller/InterestCenterCommandApiController.java +++ b/src/main/java/com/somemore/domains/interestcenter/controller/InterestCenterCommandApiController.java @@ -4,11 +4,12 @@ import com.somemore.domains.interestcenter.dto.response.RegisterInterestCenterResponseDto; import com.somemore.domains.interestcenter.usecase.CancelInterestCenterUseCase; import com.somemore.domains.interestcenter.usecase.RegisterInterestCenterUseCase; -import com.somemore.global.auth.annotation.CurrentUser; +import com.somemore.global.auth.annotation.RoleId; import com.somemore.global.common.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.DeleteMapping; @@ -17,8 +18,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import java.util.UUID; - @RequiredArgsConstructor @RestController @Tag(name = "Interest Center Command API", description = "관심 기관의 등록과 취소 API를 제공합니다") @@ -31,10 +30,11 @@ public class InterestCenterCommandApiController { @Operation(summary = "관심기관 등록 API") @PostMapping("/api/interest-center") public ApiResponse registerInterestCenter( - @CurrentUser UUID volunteerId, + @RoleId UUID volunteerId, @Valid @RequestBody RegisterInterestCenterRequestDto requestDto) { - RegisterInterestCenterResponseDto responseDto = registerInterestCenterUseCase.registerInterestCenter(volunteerId, requestDto); + RegisterInterestCenterResponseDto responseDto = registerInterestCenterUseCase.registerInterestCenter( + volunteerId, requestDto); return ApiResponse.ok(200, responseDto, "관심 기관 등록 성공"); } @@ -43,7 +43,7 @@ public ApiResponse registerInterestCenter( @Operation(summary = "관심기관 취소 API") @DeleteMapping("/api/interest-center/{centerId}") public ApiResponse deleteInterestCenter( - @CurrentUser UUID volunteerId, + @RoleId UUID volunteerId, @PathVariable UUID centerId) { cancelInterestCenterUseCase.cancelInterestCenter(volunteerId, centerId); diff --git a/src/main/java/com/somemore/domains/interestcenter/controller/InterestCenterQueryApiController.java b/src/main/java/com/somemore/domains/interestcenter/controller/InterestCenterQueryApiController.java index 1ef1faea5..3ab2ec0ce 100644 --- a/src/main/java/com/somemore/domains/interestcenter/controller/InterestCenterQueryApiController.java +++ b/src/main/java/com/somemore/domains/interestcenter/controller/InterestCenterQueryApiController.java @@ -2,17 +2,16 @@ import com.somemore.domains.interestcenter.dto.response.InterestCentersResponseDto; import com.somemore.domains.interestcenter.usecase.InterestCenterQueryUseCase; -import com.somemore.global.auth.annotation.CurrentUser; +import com.somemore.global.auth.annotation.RoleId; import com.somemore.global.common.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; -import java.util.UUID; - @RequiredArgsConstructor @RestController @Tag(name = "Interest Center Query API", description = "관심 기관의 조회 API를 제공합니다") @@ -23,7 +22,7 @@ public class InterestCenterQueryApiController { @Operation(summary = "관심기관 목록 조회 API") @GetMapping("/api/interest-centers") public ApiResponse> getInterestCenters( - @CurrentUser UUID volunteerId) { + @RoleId UUID volunteerId) { List responseDtos = interestCenterQueryUseCase.getInterestCenters( volunteerId); diff --git a/src/main/java/com/somemore/domains/interestcenter/dto/response/InterestCentersResponseDto.java b/src/main/java/com/somemore/domains/interestcenter/dto/response/InterestCentersResponseDto.java index 3eb79cd3c..b98cb11eb 100644 --- a/src/main/java/com/somemore/domains/interestcenter/dto/response/InterestCentersResponseDto.java +++ b/src/main/java/com/somemore/domains/interestcenter/dto/response/InterestCentersResponseDto.java @@ -2,11 +2,10 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; -import com.somemore.domains.center.repository.mapper.CenterOverviewInfo; +import com.somemore.center.repository.record.CenterOverviewInfo; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Builder; - import java.util.UUID; +import lombok.Builder; @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @Builder @@ -18,6 +17,7 @@ public record InterestCentersResponseDto( @Schema(description = "관심기관의 프로필 이미지 링크", example = "~~/image.jpeg") String imgUrl ) { + public static InterestCentersResponseDto of(CenterOverviewInfo responseDto) { return InterestCentersResponseDto.builder() .centerId(responseDto.centerId()) diff --git a/src/main/java/com/somemore/domains/interestcenter/service/CancelInterestCenterService.java b/src/main/java/com/somemore/domains/interestcenter/service/CancelInterestCenterService.java index 1b588557b..6c2910a4d 100644 --- a/src/main/java/com/somemore/domains/interestcenter/service/CancelInterestCenterService.java +++ b/src/main/java/com/somemore/domains/interestcenter/service/CancelInterestCenterService.java @@ -1,34 +1,36 @@ package com.somemore.domains.interestcenter.service; -import com.somemore.domains.center.usecase.query.CenterQueryUseCase; +import static com.somemore.global.exception.ExceptionMessage.CANNOT_CANCEL_DELETED_INTEREST_CENTER; + +import com.somemore.center.usecase.NEWCenterQueryUseCase; import com.somemore.domains.interestcenter.domain.InterestCenter; import com.somemore.domains.interestcenter.repository.InterestCenterRepository; import com.somemore.domains.interestcenter.usecase.CancelInterestCenterUseCase; -import com.somemore.global.exception.BadRequestException; +import com.somemore.global.exception.NoSuchElementException; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; - -import static com.somemore.global.exception.ExceptionMessage.CANNOT_CANCEL_DELETED_INTEREST_CENTER; - +@Transactional @RequiredArgsConstructor @Service public class CancelInterestCenterService implements CancelInterestCenterUseCase { private final InterestCenterRepository interestCenterRepository; - private final CenterQueryUseCase centerQueryUseCase; + private final NEWCenterQueryUseCase centerQueryUseCase; @Override public void cancelInterestCenter(UUID volunteerId, UUID centerId) { centerQueryUseCase.validateCenterExists(centerId); - InterestCenter interestCenter = interestCenterRepository.findByVolunteerIdAndCenterId(volunteerId, centerId) - .orElseThrow(() -> new BadRequestException(CANNOT_CANCEL_DELETED_INTEREST_CENTER.getMessage())); + InterestCenter interestCenter = interestCenterRepository.findByVolunteerIdAndCenterId( + volunteerId, centerId) + .orElseThrow( + () -> new NoSuchElementException(CANNOT_CANCEL_DELETED_INTEREST_CENTER)); interestCenter.markAsDeleted(); - interestCenterRepository.save(interestCenter); } } diff --git a/src/main/java/com/somemore/domains/interestcenter/service/InterestCenterQueryService.java b/src/main/java/com/somemore/domains/interestcenter/service/InterestCenterQueryService.java index dba205867..fd5bfb00c 100644 --- a/src/main/java/com/somemore/domains/interestcenter/service/InterestCenterQueryService.java +++ b/src/main/java/com/somemore/domains/interestcenter/service/InterestCenterQueryService.java @@ -1,21 +1,20 @@ package com.somemore.domains.interestcenter.service; -import com.somemore.domains.center.repository.mapper.CenterOverviewInfo; -import com.somemore.domains.center.usecase.query.CenterQueryUseCase; +import com.somemore.center.repository.record.CenterOverviewInfo; +import com.somemore.center.usecase.NEWCenterQueryUseCase; import com.somemore.domains.interestcenter.dto.response.InterestCentersResponseDto; import com.somemore.domains.interestcenter.repository.InterestCenterRepository; import com.somemore.domains.interestcenter.usecase.InterestCenterQueryUseCase; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - import java.util.List; import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; @RequiredArgsConstructor @Service public class InterestCenterQueryService implements InterestCenterQueryUseCase { - private final CenterQueryUseCase centerQueryUseCase; + private final NEWCenterQueryUseCase centerQueryUseCase; private final InterestCenterRepository interestCenterRepository; @Override @@ -34,7 +33,6 @@ public List getInterestCenters(UUID volunteerId) { @Override public List getVolunteerIdsByCenterId(UUID centerId) { - return interestCenterRepository.findVolunteerIdsByCenterId(centerId); } } diff --git a/src/main/java/com/somemore/domains/interestcenter/service/RegisterInterestCenterService.java b/src/main/java/com/somemore/domains/interestcenter/service/RegisterInterestCenterService.java index 302ed8e94..0fa9f5709 100644 --- a/src/main/java/com/somemore/domains/interestcenter/service/RegisterInterestCenterService.java +++ b/src/main/java/com/somemore/domains/interestcenter/service/RegisterInterestCenterService.java @@ -1,37 +1,41 @@ package com.somemore.domains.interestcenter.service; -import com.somemore.domains.center.usecase.query.CenterQueryUseCase; +import static com.somemore.global.exception.ExceptionMessage.DUPLICATE_INTEREST_CENTER; + +import com.somemore.center.usecase.NEWCenterQueryUseCase; import com.somemore.domains.interestcenter.domain.InterestCenter; import com.somemore.domains.interestcenter.dto.request.RegisterInterestCenterRequestDto; import com.somemore.domains.interestcenter.dto.response.RegisterInterestCenterResponseDto; import com.somemore.domains.interestcenter.repository.InterestCenterRepository; import com.somemore.domains.interestcenter.usecase.RegisterInterestCenterUseCase; import com.somemore.global.exception.DuplicateException; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; - -import static com.somemore.global.exception.ExceptionMessage.DUPLICATE_INTEREST_CENTER; - +@Transactional @RequiredArgsConstructor @Service public class RegisterInterestCenterService implements RegisterInterestCenterUseCase { - private final InterestCenterRepository repository; - private final CenterQueryUseCase centerQueryUseCase; + private final InterestCenterRepository interestCenterRepository; + private final NEWCenterQueryUseCase centerQueryUseCase; @Override - public RegisterInterestCenterResponseDto registerInterestCenter(UUID volunteerId, RegisterInterestCenterRequestDto requestDto) { - + public RegisterInterestCenterResponseDto registerInterestCenter( + UUID volunteerId, + RegisterInterestCenterRequestDto requestDto + ) { centerQueryUseCase.validateCenterExists(requestDto.centerId()); - - boolean isDuplicate = repository.existsByVolunteerIdAndCenterId(volunteerId, requestDto.centerId()); + boolean isDuplicate = interestCenterRepository.existsByVolunteerIdAndCenterId(volunteerId, + requestDto.centerId()); if (isDuplicate) { - throw new DuplicateException(DUPLICATE_INTEREST_CENTER.getMessage()); + throw new DuplicateException(DUPLICATE_INTEREST_CENTER); } - InterestCenter interestCenter = repository.save(requestDto.toEntity(volunteerId)); + InterestCenter interestCenter = interestCenterRepository.save( + requestDto.toEntity(volunteerId)); return RegisterInterestCenterResponseDto.from(interestCenter); } diff --git a/src/test/java/com/somemore/center/repository/NEWCenterRepositoryImplTest.java b/src/test/java/com/somemore/center/repository/NEWCenterRepositoryImplTest.java index 650797179..d88387df7 100644 --- a/src/test/java/com/somemore/center/repository/NEWCenterRepositoryImplTest.java +++ b/src/test/java/com/somemore/center/repository/NEWCenterRepositoryImplTest.java @@ -1,24 +1,31 @@ package com.somemore.center.repository; +import static org.assertj.core.api.Assertions.assertThat; + import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.record.CenterOverviewInfo; import com.somemore.center.repository.record.CenterProfileDto; 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.util.List; +import java.util.Optional; +import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.util.Optional; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; - @Transactional class NEWCenterRepositoryImplTest extends IntegrationTestSupport { @Autowired private NEWCenterRepositoryImpl centerRepository; + @Autowired + private UserCommonAttributeRepository userCommonAttributeRepository; + @DisplayName("유저 아이디로 기관을 등록할 수 있다.") @Test void saveVolunteerByUserId() { @@ -42,7 +49,6 @@ void saveVolunteerByUserId() { @DisplayName("기관 아이디로 기관 프로필 정보를 가져올 수 있다.") @Test void findCenterProfileByUserId() { - // given UUID userId = UUID.randomUUID(); NEWCenter center = NEWCenter.createDefault(userId); @@ -66,9 +72,55 @@ void findCenterProfileByUserId_NoResult() { UUID nonExistentCenterId = UUID.randomUUID(); // when - Optional result = centerRepository.findCenterProfileById(nonExistentCenterId); + Optional result = centerRepository.findCenterProfileById( + nonExistentCenterId); // then assertThat(result).isEmpty(); } + + @DisplayName("아이디로 기관 존재 유무를 조회할 수 있다.") + @Test + void existsById() { + // given + NEWCenter center = NEWCenter.createDefault(UUID.randomUUID()); + centerRepository.save(center); + + // when + boolean result = centerRepository.existsById(center.getId()); + + // then + assertThat(result).isTrue(); + } + + @DisplayName("아이디 리스트로 기관 기본 정보를 조회할 수 있다.") + @Test + void findUserIdsByIds() { + // given + NEWCenter centerOne = NEWCenter.createDefault(UUID.randomUUID()); + NEWCenter centerTwo = NEWCenter.createDefault(UUID.randomUUID()); + centerRepository.save(centerOne); + centerRepository.save(centerTwo); + + UserCommonAttribute centerUserInfoOne = createCenterUserAttribute(centerOne.getUserId()); + UserCommonAttribute centerUserInfoTwo = createCenterUserAttribute(centerTwo.getUserId()); + userCommonAttributeRepository.save(centerUserInfoOne); + userCommonAttributeRepository.save(centerUserInfoTwo); + + List ids = List.of(centerOne.getId(), centerTwo.getId()); + + // when + List centerOverviewInfos = centerRepository.findOverviewInfosByIds(ids); + + // then + assertThat(centerOverviewInfos) + .isNotNull() + .hasSize(2) + .extracting(CenterOverviewInfo::centerId) + .containsExactlyInAnyOrderElementsOf(ids); + } + + private UserCommonAttribute createCenterUserAttribute(UUID userId) { + return UserCommonAttribute.createDefault(userId, UserRole.CENTER); + } } diff --git a/src/test/java/com/somemore/center/service/NEWCenterQueryServiceTest.java b/src/test/java/com/somemore/center/service/NEWCenterQueryServiceTest.java index 1f219027d..25b4fc80a 100644 --- a/src/test/java/com/somemore/center/service/NEWCenterQueryServiceTest.java +++ b/src/test/java/com/somemore/center/service/NEWCenterQueryServiceTest.java @@ -1,5 +1,11 @@ package com.somemore.center.service; +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_CENTER; +import static com.somemore.user.domain.UserRole.CENTER; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import com.somemore.center.domain.NEWCenter; import com.somemore.center.dto.response.CenterProfileResponseDto; import com.somemore.center.repository.NEWCenterRepository; @@ -7,22 +13,19 @@ import com.somemore.domains.center.dto.response.PreferItemResponseDto; import com.somemore.domains.center.repository.preferitem.PreferItemJpaRepository; import com.somemore.domains.center.usecase.query.PreferItemQueryUseCase; +import com.somemore.global.exception.NoSuchElementException; import com.somemore.support.IntegrationTestSupport; import com.somemore.user.domain.UserCommonAttribute; import com.somemore.user.repository.usercommonattribute.UserCommonAttributeRepository; +import java.util.List; +import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.UUID; - -import static com.somemore.user.domain.UserRole.CENTER; -import static org.assertj.core.api.Assertions.assertThat; - @Transactional -class NEWCenterQueryServiceTest extends IntegrationTestSupport{ +class NEWCenterQueryServiceTest extends IntegrationTestSupport { @Autowired private NEWCenterQueryService centerQueryService; @@ -42,7 +45,6 @@ class NEWCenterQueryServiceTest extends IntegrationTestSupport{ @Test @DisplayName("사용자 ID로 기관을 조회한다") void getByUserId() { - //given UUID userId = UUID.randomUUID(); NEWCenter center = NEWCenter.createDefault(userId); @@ -58,7 +60,6 @@ void getByUserId() { @Test @DisplayName("사용자 ID로 기관 ID를 조회한다") void getIdByUserId() { - //given UUID userId = UUID.randomUUID(); NEWCenter center = NEWCenter.createDefault(userId); @@ -74,7 +75,6 @@ void getIdByUserId() { @DisplayName("기관의 유저 ID로 기관 정보를 조회할 수 있다.") @Test void getCenterProfileByUserId() { - //given UUID userId = UUID.randomUUID(); NEWCenter center = NEWCenter.createDefault(userId); @@ -87,7 +87,8 @@ void getCenterProfileByUserId() { PreferItem preferItem1 = PreferItem.create(center.getId(), "간식"); preferItemRepository.saveAll(List.of(preferItem, preferItem1)); - List preferItems = preferItemQueryUseCase.getPreferItemDtosByCenterId(center.getId()); + List preferItems = preferItemQueryUseCase.getPreferItemDtosByCenterId( + center.getId()); //when CenterProfileResponseDto result = centerQueryService.getCenterProfileById(center.getId()); @@ -95,7 +96,8 @@ void getCenterProfileByUserId() { //then assertThat(result).isNotNull(); assertThat(result) - .extracting("id", "userId", "homepageUrl", "name", "contactNumber", "imgUrl", "introduce", "preferItems") + .extracting("id", "userId", "homepageUrl", "name", "contactNumber", "imgUrl", + "introduce", "preferItems") .containsExactly( center.getId(), userId, @@ -107,4 +109,32 @@ void getCenterProfileByUserId() { preferItems ); } + + @DisplayName("아이디로 기관 존재유무를 검증할 수 있다.") + @Test + void validateCenterExists() { + //given + NEWCenter center = NEWCenter.createDefault(UUID.randomUUID()); + centerRepository.save(center); + + // when + // then + assertThatCode( + () -> centerQueryService.validateCenterExists(center.getId())) + .doesNotThrowAnyException(); + } + + @DisplayName("존재하지 않는 아이디로 기관 존재유무를 검증하면 에러가 발생한다.") + @Test + void validateCenterExistsWhenDoesNotExist() { + //given + UUID wrongId = UUID.randomUUID(); + + // when + // then + assertThatThrownBy( + () -> centerQueryService.validateCenterExists(wrongId)) + .isInstanceOf(NoSuchElementException.class) + .hasMessage(NOT_EXISTS_CENTER.getMessage()); + } } diff --git a/src/test/java/com/somemore/domains/center/service/query/CenterQueryServiceTest.java b/src/test/java/com/somemore/domains/center/service/query/CenterQueryServiceTest.java index 06de9ade7..857103c2a 100644 --- a/src/test/java/com/somemore/domains/center/service/query/CenterQueryServiceTest.java +++ b/src/test/java/com/somemore/domains/center/service/query/CenterQueryServiceTest.java @@ -1,26 +1,21 @@ package com.somemore.domains.center.service.query; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.domain.PreferItem; -import com.somemore.domains.center.dto.response.CenterProfileResponseDto; -import com.somemore.domains.center.repository.center.CenterJpaRepository; import com.somemore.domains.center.repository.center.CenterRepository; -import com.somemore.domains.center.repository.mapper.CenterOverviewInfo; -import com.somemore.domains.center.repository.preferitem.PreferItemJpaRepository; import com.somemore.global.exception.BadRequestException; import com.somemore.global.exception.ExceptionMessage; import com.somemore.support.IntegrationTestSupport; import jakarta.transaction.Transactional; +import java.util.UUID; import org.assertj.core.api.ThrowableAssert; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import java.util.List; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.*; - @Transactional class CenterQueryServiceTest extends IntegrationTestSupport { @@ -30,76 +25,6 @@ class CenterQueryServiceTest extends IntegrationTestSupport { @Autowired private CenterRepository centerRepository; - @Autowired - private CenterJpaRepository centerJpaRepository; - - @Autowired - private PreferItemJpaRepository preferItemRepository; - - @DisplayName("기관 Id로 기관 프로필을 조회할 수 있다. (service)") - @Test - void getCenterProfileById() { - // given - Center center = createCenter(); - Center foundCenter = centerRepository.save(center); - - PreferItem preferItem = PreferItem.create(foundCenter.getId(), "어린이 동화책"); - PreferItem preferItem1 = PreferItem.create(foundCenter.getId(), "간식"); - preferItemRepository.saveAll(List.of(preferItem, preferItem1)); - - // when - CenterProfileResponseDto responseDto = centerQueryService.getCenterProfileByCenterId(foundCenter.getId()); - - // then - assertThat(responseDto) - .extracting( - "centerId", - "name", - "contactNumber", - "imgUrl", - "introduce", - "homepageLink" - ) - .containsExactly( - foundCenter.getId(), - "기본 기관 이름", - "010-1234-5678", - "http://example.com/image.jpg", - "기관 소개 내용", - "http://example.com" - ); - - assertThat(responseDto.preferItems()) - .hasSize(2) - .extracting("itemName") - .containsExactly("어린이 동화책", "간식"); - } - - @DisplayName("기관 Id들로 기관의 오버뷰 정보를 조회할 수 있다.") - @Test - void getCenterOverviewsByIds() { - //given - Center center = createCenter(); - Center center1 = createCenter(); - Center center2 = createCenter(); - centerJpaRepository.saveAll(List.of(center, center1, center2)); - List ids = List.of(center.getId(),center1.getId(), center2.getId()); - - //when - List responseDtos = centerQueryService.getCenterOverviewsByIds(ids); - - //then - assertThat(responseDtos) - .isNotNull() - .hasSize(3) - .extracting("centerId", "centerName", "imgUrl") - .containsExactlyInAnyOrder( - tuple(center.getId(), center.getName(), center.getImgUrl()), - tuple(center1.getId(), center1.getName(), center1.getImgUrl()), - tuple(center2.getId(), center2.getName(), center2.getImgUrl()) - ); - } - @DisplayName("존재하지 않는 기관 ID를 검증할 수 있다.") @Test void validateNonExistentCenter() { @@ -130,7 +55,8 @@ void validateExistingCenter() { Center savedCenter = centerRepository.save(center); // when - ThrowableAssert.ThrowingCallable callable = () -> centerQueryService.validateCenterExists(savedCenter.getId()); + ThrowableAssert.ThrowingCallable callable = () -> centerQueryService.validateCenterExists( + savedCenter.getId()); // then assertThatCode(callable).doesNotThrowAnyException(); @@ -155,7 +81,8 @@ void getNameById() { void getNameByNonExistentId() { // given // when - ThrowableAssert.ThrowingCallable callable = () -> centerQueryService.getNameById(UUID.randomUUID()); + ThrowableAssert.ThrowingCallable callable = () -> centerQueryService.getNameById( + UUID.randomUUID()); // then assertThatExceptionOfType(BadRequestException.class) diff --git a/src/test/java/com/somemore/domains/interestcenter/controller/InterestCenterCommandApiControllerTest.java b/src/test/java/com/somemore/domains/interestcenter/controller/InterestCenterCommandApiControllerTest.java index a23d14fac..f8b23340e 100644 --- a/src/test/java/com/somemore/domains/interestcenter/controller/InterestCenterCommandApiControllerTest.java +++ b/src/test/java/com/somemore/domains/interestcenter/controller/InterestCenterCommandApiControllerTest.java @@ -1,26 +1,25 @@ package com.somemore.domains.interestcenter.controller; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.doNothing; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.somemore.domains.interestcenter.dto.request.RegisterInterestCenterRequestDto; import com.somemore.domains.interestcenter.dto.response.RegisterInterestCenterResponseDto; import com.somemore.domains.interestcenter.usecase.CancelInterestCenterUseCase; import com.somemore.domains.interestcenter.usecase.RegisterInterestCenterUseCase; import com.somemore.support.ControllerTestSupport; -import com.somemore.support.annotation.WithMockCustomUser; +import com.somemore.support.annotation.MockUser; +import java.util.UUID; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; -import java.util.UUID; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.doNothing; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - class InterestCenterCommandApiControllerTest extends ControllerTestSupport { @MockBean @@ -38,14 +37,16 @@ void setUp() { ); } - @WithMockCustomUser + @MockUser @Test void registerInterestCenter_ShouldReturnSuccess() throws Exception { // given UUID volunteerId = UUID.randomUUID(); - RegisterInterestCenterResponseDto responseDto = new RegisterInterestCenterResponseDto(1L, volunteerId, requestDto.centerId()); - given(registerInterestCenterUseCase.registerInterestCenter(any(UUID.class), any(RegisterInterestCenterRequestDto.class))) + RegisterInterestCenterResponseDto responseDto = new RegisterInterestCenterResponseDto(1L, + volunteerId, requestDto.centerId()); + given(registerInterestCenterUseCase.registerInterestCenter(any(UUID.class), + any(RegisterInterestCenterRequestDto.class))) .willReturn(responseDto); // when & then @@ -55,16 +56,18 @@ void registerInterestCenter_ShouldReturnSuccess() throws Exception { .andExpect(status().isOk()) .andExpect(jsonPath("$.message").value("관심 기관 등록 성공")) .andExpect(jsonPath("$.data.id").value(responseDto.id())) - .andExpect(jsonPath("$.data.volunteer_id").value(responseDto.volunteerId().toString())) + .andExpect( + jsonPath("$.data.volunteer_id").value(responseDto.volunteerId().toString())) .andExpect(jsonPath("$.data.center_id").value(responseDto.centerId().toString())); } - @WithMockCustomUser + @MockUser @Test void deleteInterestCenter_ShouldReturnSuccess() throws Exception { // given UUID centerId = UUID.randomUUID(); - doNothing().when(cancelInterestCenterUseCase).cancelInterestCenter(any(UUID.class), any(UUID.class)); + doNothing().when(cancelInterestCenterUseCase) + .cancelInterestCenter(any(UUID.class), any(UUID.class)); // when & then mockMvc.perform(delete("/api/interest-center/{centerId}", centerId)) diff --git a/src/test/java/com/somemore/domains/interestcenter/controller/InterestCenterQueryApiControllerTest.java b/src/test/java/com/somemore/domains/interestcenter/controller/InterestCenterQueryApiControllerTest.java index df3628d22..c017907e9 100644 --- a/src/test/java/com/somemore/domains/interestcenter/controller/InterestCenterQueryApiControllerTest.java +++ b/src/test/java/com/somemore/domains/interestcenter/controller/InterestCenterQueryApiControllerTest.java @@ -1,22 +1,21 @@ package com.somemore.domains.interestcenter.controller; +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.somemore.domains.interestcenter.dto.response.InterestCentersResponseDto; import com.somemore.domains.interestcenter.usecase.InterestCenterQueryUseCase; import com.somemore.support.ControllerTestSupport; -import com.somemore.support.annotation.WithMockCustomUser; +import com.somemore.support.annotation.MockUser; +import java.util.List; +import java.util.UUID; 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 java.util.List; -import java.util.UUID; - -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - class InterestCenterQueryApiControllerTest extends ControllerTestSupport { @MockBean @@ -24,7 +23,7 @@ class InterestCenterQueryApiControllerTest extends ControllerTestSupport { @DisplayName("봉사자 ID로 관심기관 목록을 조회할 수 있다.") @Test - @WithMockCustomUser + @MockUser void getInterestCenters_ShouldReturnInterestCentersList() throws Exception { // given UUID volunteerId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000"); @@ -51,7 +50,7 @@ void getInterestCenters_ShouldReturnInterestCentersList() throws Exception { @DisplayName("봉사자 ID로 관심기관이 없을 경우 빈 리스트를 반환한다.") @Test - @WithMockCustomUser + @MockUser void getInterestCenters_ShouldReturnEmptyList_WhenNoInterestCenters() throws Exception { // given UUID volunteerId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000"); diff --git a/src/test/java/com/somemore/domains/interestcenter/service/CancelInterestCenterServiceTest.java b/src/test/java/com/somemore/domains/interestcenter/service/CancelInterestCenterServiceTest.java index 61b9c3b94..9a47545db 100644 --- a/src/test/java/com/somemore/domains/interestcenter/service/CancelInterestCenterServiceTest.java +++ b/src/test/java/com/somemore/domains/interestcenter/service/CancelInterestCenterServiceTest.java @@ -1,95 +1,87 @@ package com.somemore.domains.interestcenter.service; -import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.repository.center.CenterRepository; +import static com.somemore.global.exception.ExceptionMessage.CANNOT_CANCEL_DELETED_INTEREST_CENTER; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; import com.somemore.domains.interestcenter.domain.InterestCenter; -import com.somemore.domains.interestcenter.dto.request.RegisterInterestCenterRequestDto; -import com.somemore.domains.interestcenter.dto.response.RegisterInterestCenterResponseDto; import com.somemore.domains.interestcenter.repository.InterestCenterRepository; import com.somemore.domains.interestcenter.usecase.CancelInterestCenterUseCase; -import com.somemore.domains.interestcenter.usecase.RegisterInterestCenterUseCase; -import com.somemore.global.exception.BadRequestException; +import com.somemore.global.exception.NoSuchElementException; import com.somemore.support.IntegrationTestSupport; +import java.util.Optional; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.util.Optional; -import java.util.UUID; - -import static com.somemore.global.exception.ExceptionMessage.CANNOT_CANCEL_DELETED_INTEREST_CENTER; -import static org.junit.jupiter.api.Assertions.*; - @Transactional class CancelInterestCenterServiceTest extends IntegrationTestSupport { @Autowired private CancelInterestCenterUseCase cancelInterestCenterUseCase; - @Autowired - private RegisterInterestCenterUseCase registerInterestCenterUseCase; - @Autowired private InterestCenterRepository interestCenterRepository; @Autowired - private CenterRepository centerRepository; + private NEWCenterRepository centerRepository; + + private NEWCenter center; + private UUID volunteerId; + private InterestCenter interestCenter; + + @BeforeEach + void setUp() { + center = createCenter(); + centerRepository.save(center); + + volunteerId = UUID.randomUUID(); + interestCenter = createInterestCenter(volunteerId, center.getId()); + interestCenterRepository.save(interestCenter); + } @DisplayName("봉사자는 기관에 대한 관심 표시를 취소할 수 있다.") @Test void CancelInterestCenter() { - //given - Center center = createCenter(); - UUID volunteerId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000"); + // given UUID centerId = center.getId(); - RegisterInterestCenterRequestDto requestDto = new RegisterInterestCenterRequestDto(centerId); - - RegisterInterestCenterResponseDto responseDto = registerInterestCenterUseCase.registerInterestCenter(volunteerId, requestDto); - - InterestCenter savedInterestCenter = interestCenterRepository.findById(responseDto.id()) - .orElseThrow(() -> new IllegalStateException("등록된 관심 기관이 없습니다.")); - assertEquals(savedInterestCenter.getId(), responseDto.id()); //when cancelInterestCenterUseCase.cancelInterestCenter(volunteerId, centerId); //then - Optional deletedInterestCenterOptional = interestCenterRepository.findById(responseDto.id()); - assertTrue(deletedInterestCenterOptional.isEmpty()); - + Optional findInterestCenter = interestCenterRepository.findById( + interestCenter.getId()); + assertThat(findInterestCenter).isEmpty(); } - @DisplayName("이미 삭제된 관심 기관을 다시 취소하려 하면 예외가 발생한다.") + @DisplayName("관심 기관에 없는 기관을 취소하면 예외가 발생한다.") @Test - void cancelInterestCenter_AlreadyDeleted_ShouldThrowException() { - //given - Center center = createCenter(); - UUID volunteerId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000"); - UUID centerId = center.getId(); - RegisterInterestCenterRequestDto requestDto = new RegisterInterestCenterRequestDto(centerId); - RegisterInterestCenterResponseDto responseDto = registerInterestCenterUseCase.registerInterestCenter(volunteerId, requestDto); - cancelInterestCenterUseCase.cancelInterestCenter(volunteerId, centerId); - - //when, then - assertThrows(BadRequestException.class, - () -> cancelInterestCenterUseCase.cancelInterestCenter(volunteerId, centerId), - CANNOT_CANCEL_DELETED_INTEREST_CENTER.getMessage() - ); + void cancelInterestCenterWhenDoesNotExist() { + // given + NEWCenter newCenter = createCenter(); + centerRepository.save(newCenter); + UUID wrongCenterId = newCenter.getId(); + + // when + // then + assertThatThrownBy( + () -> cancelInterestCenterUseCase.cancelInterestCenter(volunteerId, wrongCenterId)) + .isInstanceOf(NoSuchElementException.class) + .hasMessage(CANNOT_CANCEL_DELETED_INTEREST_CENTER.getMessage()); } - private Center createCenter() { - Center center = Center.create( - "기본 기관 이름", - "010-1234-5678", - "http://example.com/image.jpg", - "기관 소개 내용", - "http://example.com" - ); - - centerRepository.save(center); + private NEWCenter createCenter() { + return NEWCenter.createDefault(UUID.randomUUID()); + } - return center; + private InterestCenter createInterestCenter(UUID volunteerId, UUID centerId) { + return InterestCenter.create(volunteerId, centerId); } } diff --git a/src/test/java/com/somemore/domains/interestcenter/service/InterestCenterQueryServiceTest.java b/src/test/java/com/somemore/domains/interestcenter/service/InterestCenterQueryServiceTest.java index 2bde83904..e3a55caa2 100644 --- a/src/test/java/com/somemore/domains/interestcenter/service/InterestCenterQueryServiceTest.java +++ b/src/test/java/com/somemore/domains/interestcenter/service/InterestCenterQueryServiceTest.java @@ -1,26 +1,26 @@ package com.somemore.domains.interestcenter.service; -import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.repository.center.CenterJpaRepository; +import static org.assertj.core.api.Assertions.assertThat; + +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; import com.somemore.domains.interestcenter.domain.InterestCenter; import com.somemore.domains.interestcenter.dto.response.InterestCentersResponseDto; -import com.somemore.domains.interestcenter.repository.InterestCenterJpaRepository; import com.somemore.domains.interestcenter.repository.InterestCenterRepository; 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.util.List; +import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; - @Transactional class InterestCenterQueryServiceTest extends IntegrationTestSupport { - @Autowired private InterestCenterQueryService interestCenterQueryService; @@ -28,10 +28,10 @@ class InterestCenterQueryServiceTest extends IntegrationTestSupport { private InterestCenterRepository interestCenterRepository; @Autowired - private InterestCenterJpaRepository interestCenterJpaRepository; + private NEWCenterRepository centerRepository; @Autowired - private CenterJpaRepository centerJpaRepository; + private UserCommonAttributeRepository userCommonAttributeRepository; @DisplayName("봉사자 ID로 관심 센터 정보를 조회할 수 있다.") @Test @@ -39,32 +39,30 @@ void getInterestCenters() { // given UUID volunteerId = UUID.randomUUID(); - Center center = createCenter(); - Center center1 = createCenter(); - Center center2 = createCenter(); - centerJpaRepository.saveAll(List.of(center, center1, center2)); + NEWCenter centerOne = createCenter(); + NEWCenter centerTwo = createCenter(); + centerRepository.save(centerOne); + centerRepository.save(centerTwo); + + UserCommonAttribute centerOneInfo = createCenterUserInfo(centerOne.getUserId()); + UserCommonAttribute centerTwoInfo = createCenterUserInfo(centerTwo.getUserId()); + userCommonAttributeRepository.save(centerOneInfo); + userCommonAttributeRepository.save(centerTwoInfo); - InterestCenter interestCenter = createInterestCenter(volunteerId, center.getId()); - InterestCenter interestCenter1 = createInterestCenter(volunteerId, center1.getId()); - InterestCenter interestCenter2 = createInterestCenter(volunteerId, center2.getId()); - interestCenterJpaRepository.saveAll(List.of(interestCenter, interestCenter1, interestCenter2)); + InterestCenter interestOne = createInterestCenter(volunteerId, centerOne.getId()); + InterestCenter interestTwo = createInterestCenter(volunteerId, centerTwo.getId()); + interestCenterRepository.save(interestOne); + interestCenterRepository.save(interestTwo); // when - List result = interestCenterQueryService.getInterestCenters(volunteerId); + List result = interestCenterQueryService.getInterestCenters( + volunteerId); // then assertThat(result) - .hasSize(3) + .hasSize(2) .extracting("centerId") - .containsExactlyInAnyOrder(center.getId(), center1.getId(), center2.getId()); - - assertThat(result) - .extracting("centerName") - .containsExactlyInAnyOrder("기본 기관 이름", "기본 기관 이름", "기본 기관 이름"); - - assertThat(result) - .extracting("imgUrl") - .containsExactlyInAnyOrder("http://image.jpg", "http://image.jpg", "http://image.jpg"); + .containsExactlyInAnyOrder(centerOne.getId(), centerTwo.getId()); } @DisplayName("봉사자의 관심 센터가 없을 경우 빈 리스트를 반환한다.") @@ -73,14 +71,9 @@ void getInterestCenters_ReturnsEmptyList_WhenNoInterestCenters() { // given UUID volunteerId = UUID.randomUUID(); - Center center = createCenter(); - centerJpaRepository.save(center); - - InterestCenter unrelatedInterestCenter = createInterestCenter(UUID.randomUUID(), center.getId()); - interestCenterJpaRepository.save(unrelatedInterestCenter); - // when - List result = interestCenterQueryService.getInterestCenters(volunteerId); + List result = interestCenterQueryService.getInterestCenters( + volunteerId); // then assertThat(result).isEmpty(); @@ -98,7 +91,9 @@ void getVolunteerIdsByCenterId() { InterestCenter interestCenter1 = createInterestCenter(volunteerId1, centerId); InterestCenter interestCenter2 = createInterestCenter(volunteerId2, centerId); InterestCenter interestCenter3 = createInterestCenter(volunteerId3, centerId); - interestCenterJpaRepository.saveAll(List.of(interestCenter1, interestCenter2, interestCenter3)); + interestCenterRepository.save(interestCenter1); + interestCenterRepository.save(interestCenter2); + interestCenterRepository.save(interestCenter3); // when List result = interestCenterQueryService.getVolunteerIdsByCenterId(centerId); @@ -113,26 +108,17 @@ void getVolunteerIdsByCenterId() { @Test void getVolunteerIdsByCenterId_ReturnsEmptyList_WhenNoVolunteers() { // given - UUID centerId = UUID.randomUUID(); - - Center center = createCenter(); - centerJpaRepository.save(center); + UUID wrongCenterId = UUID.randomUUID(); // when - List result = interestCenterQueryService.getVolunteerIdsByCenterId(centerId); + List result = interestCenterQueryService.getVolunteerIdsByCenterId(wrongCenterId); // then assertThat(result).isEmpty(); } - private Center createCenter() { - return Center.create( - "기본 기관 이름", - "010-1234-5678", - "http://image.jpg", - "기관 소개 내용", - "http://example.com" - ); + private NEWCenter createCenter() { + return NEWCenter.createDefault(UUID.randomUUID()); } private InterestCenter createInterestCenter(UUID volunteerId, UUID centerId) { @@ -141,4 +127,8 @@ private InterestCenter createInterestCenter(UUID volunteerId, UUID centerId) { .centerId(centerId) .build(); } + + private UserCommonAttribute createCenterUserInfo(UUID userId) { + return UserCommonAttribute.createDefault(userId, UserRole.CENTER); + } } diff --git a/src/test/java/com/somemore/domains/interestcenter/service/RegisterInterestCenterServiceTest.java b/src/test/java/com/somemore/domains/interestcenter/service/RegisterInterestCenterServiceTest.java index 611b8b640..d5cbd4777 100644 --- a/src/test/java/com/somemore/domains/interestcenter/service/RegisterInterestCenterServiceTest.java +++ b/src/test/java/com/somemore/domains/interestcenter/service/RegisterInterestCenterServiceTest.java @@ -1,24 +1,29 @@ package com.somemore.domains.interestcenter.service; -import com.somemore.domains.center.domain.Center; -import com.somemore.domains.center.repository.center.CenterRepository; +import static com.somemore.global.exception.ExceptionMessage.DUPLICATE_INTEREST_CENTER; +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_CENTER; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; +import com.somemore.domains.interestcenter.domain.InterestCenter; import com.somemore.domains.interestcenter.dto.request.RegisterInterestCenterRequestDto; import com.somemore.domains.interestcenter.dto.response.RegisterInterestCenterResponseDto; import com.somemore.domains.interestcenter.repository.InterestCenterRepository; import com.somemore.domains.interestcenter.usecase.RegisterInterestCenterUseCase; -import com.somemore.global.exception.BadRequestException; import com.somemore.global.exception.DuplicateException; +import com.somemore.global.exception.NoSuchElementException; import com.somemore.support.IntegrationTestSupport; +import jakarta.persistence.EntityManager; +import java.util.Optional; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.util.Optional; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; - @Transactional class RegisterInterestCenterServiceTest extends IntegrationTestSupport { @@ -29,47 +34,57 @@ class RegisterInterestCenterServiceTest extends IntegrationTestSupport { private InterestCenterRepository interestCenterRepository; @Autowired - private CenterRepository centerRepository; + private NEWCenterRepository centerRepository; + + @Autowired + private EntityManager em; + + private NEWCenter center; + + @BeforeEach + void setUp() { + center = createCenter(); + centerRepository.save(center); + } @DisplayName("봉사자는 관심 기관을 등록할 수 있다.") @Test void RegisterInterestCenter() { - //given - Center center = createCenter(); - UUID volunteerId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000"); + // given + UUID volunteerId = UUID.randomUUID(); UUID centerId = center.getId(); - RegisterInterestCenterRequestDto requestDto = new RegisterInterestCenterRequestDto(centerId); + RegisterInterestCenterRequestDto requestDto = new RegisterInterestCenterRequestDto( + centerId); - //when - RegisterInterestCenterResponseDto responseDto = registerInterestCenter.registerInterestCenter(volunteerId, requestDto); + // when + RegisterInterestCenterResponseDto responseDto = registerInterestCenter.registerInterestCenter( + volunteerId, requestDto); - //then - Optional result = interestCenterRepository.findInterestCenterResponseById(responseDto.id()); - assertTrue(result.isPresent()); - assertEquals(responseDto.id(), result.get().id()); - assertEquals(volunteerId, result.get().volunteerId()); - assertEquals(centerId, result.get().centerId()); + // then + Optional result = interestCenterRepository.findById(responseDto.id()); + assertThat(result).isPresent(); + assertThat(result.get().getId()).isEqualTo(responseDto.id()); + assertThat(result.get().getVolunteerId()).isEqualTo(volunteerId); + assertThat(result.get().getCenterId()).isEqualTo(centerId); } @DisplayName("이미 관심 표시한 기관에 관심 표시를 시도하면 예외를 던져준다.") @Test void registerInterestCenter_WithDuplicateCenterId_ShouldThrowException() { // given - Center center = createCenter(); - UUID volunteerId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000"); + UUID volunteerId = UUID.randomUUID(); UUID centerId = center.getId(); - RegisterInterestCenterRequestDto requestDto = new RegisterInterestCenterRequestDto(centerId); + RegisterInterestCenterRequestDto requestDto = new RegisterInterestCenterRequestDto( + centerId); registerInterestCenter.registerInterestCenter(volunteerId, requestDto); // when - DuplicateException exception = assertThrows( - DuplicateException.class, - () -> registerInterestCenter.registerInterestCenter(volunteerId, requestDto) - ); - // then - assertEquals("이미 관심 표시한 기관입니다.", exception.getMessage()); + assertThatThrownBy( + () -> registerInterestCenter.registerInterestCenter(volunteerId, requestDto)) + .isInstanceOf(DuplicateException.class) + .hasMessage(DUPLICATE_INTEREST_CENTER.getMessage()); } @@ -77,31 +92,20 @@ void registerInterestCenter_WithDuplicateCenterId_ShouldThrowException() { @Test void registerInterestCenter_WithInvalidCenterId_ShouldThrowException() { // given - UUID volunteerId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000"); - UUID invalidCenterId = UUID.fromString("123e4567-e89b-12d3-a456-426614174001"); - RegisterInterestCenterRequestDto requestDto = new RegisterInterestCenterRequestDto(invalidCenterId); + UUID volunteerId = UUID.randomUUID(); + UUID invalidCenterId = UUID.randomUUID(); + RegisterInterestCenterRequestDto requestDto = new RegisterInterestCenterRequestDto( + invalidCenterId); // when - BadRequestException exception = assertThrows(BadRequestException.class, () -> { - registerInterestCenter.registerInterestCenter(volunteerId, requestDto); - }); - - //then - assertEquals("존재하지 않는 기관입니다.", exception.getMessage()); + // then + assertThatThrownBy( + () -> registerInterestCenter.registerInterestCenter(volunteerId, requestDto)) + .isInstanceOf(NoSuchElementException.class) + .hasMessage(NOT_EXISTS_CENTER.getMessage()); } - private Center createCenter() { - Center center = Center.create( - "기본 기관 이름", - "010-1234-5678", - "http://example.com/image.jpg", - "기관 소개 내용", - "http://example.com" - ); - - centerRepository.save(center); - - return center; + private NEWCenter createCenter() { + return NEWCenter.createDefault(UUID.randomUUID()); } - }