diff --git a/cakk-admin/src/main/kotlin/com/cakk/admin/mapper/PointMapper.kt b/cakk-admin/src/main/kotlin/com/cakk/admin/mapper/PointMapper.kt index 8af5fd4f..55043853 100644 --- a/cakk-admin/src/main/kotlin/com/cakk/admin/mapper/PointMapper.kt +++ b/cakk-admin/src/main/kotlin/com/cakk/admin/mapper/PointMapper.kt @@ -1,5 +1,7 @@ package com.cakk.admin.mapper +import com.cakk.common.enums.ReturnCode +import com.cakk.common.exception.CakkException import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.GeometryFactory import org.locationtech.jts.geom.Point @@ -10,9 +12,9 @@ private const val SPATIAL_REFERENCE_IDENTIFIER_NUMBER = 4326 private val geometryFactory = GeometryFactory(PrecisionModel(), SPATIAL_REFERENCE_IDENTIFIER_NUMBER) -fun supplyPointBy(latitude: Double?, longitude: Double?): Point? { +fun supplyPointBy(latitude: Double?, longitude: Double?): Point { if (Objects.isNull(latitude) || Objects.isNull(longitude)) { - return null + throw CakkException(ReturnCode.WRONG_PARAMETER) } return geometryFactory.createPoint(Coordinate(longitude!!, latitude!!)) } diff --git a/cakk-admin/src/main/kotlin/com/cakk/admin/service/BusinessInformationService.kt b/cakk-admin/src/main/kotlin/com/cakk/admin/service/BusinessInformationService.kt index e948fede..4a5aa868 100644 --- a/cakk-admin/src/main/kotlin/com/cakk/admin/service/BusinessInformationService.kt +++ b/cakk-admin/src/main/kotlin/com/cakk/admin/service/BusinessInformationService.kt @@ -4,34 +4,34 @@ import com.cakk.admin.dto.request.PromotionRequest import com.cakk.admin.dto.response.CakeShopOwnerCandidateResponse import com.cakk.admin.dto.response.CakeShopOwnerCandidatesResponse import com.cakk.admin.mapper.* +import com.cakk.core.facade.cake.BusinessInformationReadFacade +import com.cakk.core.facade.cake.CakeShopReadFacade +import com.cakk.core.facade.user.UserReadFacade import com.cakk.domain.mysql.bo.user.VerificationPolicy import com.cakk.domain.mysql.entity.user.BusinessInformation import com.cakk.domain.mysql.entity.user.User -import com.cakk.domain.mysql.repository.reader.BusinessInformationReader -import com.cakk.domain.mysql.repository.reader.CakeShopReader -import com.cakk.domain.mysql.repository.reader.UserReader import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @Service class BusinessInformationService( - private val businessInformationReader: BusinessInformationReader, - private val userReader: UserReader, - private val cakeShopReader: CakeShopReader, + private val businessInformationReadFacade: BusinessInformationReadFacade, + private val userReadFacade: UserReadFacade, + private val cakeShopReadFacade: CakeShopReadFacade, private val verificationPolicy: VerificationPolicy, ) { @Transactional fun promoteUserToBusinessOwner(dto: PromotionRequest) { - val user: User = userReader.findByUserId(dto.userId) - val businessInformation: BusinessInformation = cakeShopReader.findBusinessInformationWithShop(dto.cakeShopId) + val user: User = userReadFacade.findByUserId(dto.userId) + val businessInformation: BusinessInformation = cakeShopReadFacade.findBusinessInformationWithShop(dto.cakeShopId) businessInformation.updateBusinessOwner(verificationPolicy, user) } @Transactional(readOnly = true) fun getBusinessOwnerCandidates(): CakeShopOwnerCandidatesResponse { - var businessInformationList = businessInformationReader.findAllCakeShopBusinessOwnerCandidates() + var businessInformationList = businessInformationReadFacade.findAllCakeShopBusinessOwnerCandidates() businessInformationList = businessInformationList .filter { it.isBusinessOwnerCandidate(verificationPolicy) } @@ -42,7 +42,7 @@ class BusinessInformationService( @Transactional(readOnly = true) fun getCandidateInformation(userId: Long): CakeShopOwnerCandidateResponse { - val businessInformation = businessInformationReader.findByUserId(userId) + val businessInformation = businessInformationReadFacade.findByUserId(userId) return supplyCakeShopOwnerCandidateResponseBy(businessInformation) } diff --git a/cakk-admin/src/main/kotlin/com/cakk/admin/service/CakeService.kt b/cakk-admin/src/main/kotlin/com/cakk/admin/service/CakeService.kt index c7cfa73e..e45fe772 100644 --- a/cakk-admin/src/main/kotlin/com/cakk/admin/service/CakeService.kt +++ b/cakk-admin/src/main/kotlin/com/cakk/admin/service/CakeService.kt @@ -6,21 +6,21 @@ import org.springframework.transaction.annotation.Transactional import com.cakk.admin.dto.param.CakeCreateByAdminParam import com.cakk.admin.dto.param.CakeUpdateByAdminParam import com.cakk.core.facade.cake.CakeManageFacade +import com.cakk.core.facade.cake.CakeReadFacade +import com.cakk.core.facade.cake.CakeShopReadFacade import com.cakk.core.facade.tag.TagManageFacade -import com.cakk.domain.mysql.repository.reader.CakeReader -import com.cakk.domain.mysql.repository.reader.CakeShopReader @Service class CakeService( - private val cakeShopReader: CakeShopReader, - private val cakeReader: CakeReader, + private val cakeReadFacade: CakeReadFacade, + private val cakeShopReadFacade: CakeShopReadFacade, private val tagManageFacade: TagManageFacade, private val cakeManageFacade: CakeManageFacade ) { @Transactional fun createCake(dto: CakeCreateByAdminParam) { - val cakeShop = cakeShopReader.findById(dto.cakeShopId) + val cakeShop = cakeShopReadFacade.findById(dto.cakeShopId) val cake = dto.cake val tags = dto.tagNames.map { tagManageFacade.create(it) }.toMutableList() @@ -29,7 +29,7 @@ class CakeService( @Transactional fun updateCake(dto: CakeUpdateByAdminParam) { - val cake = cakeReader.findById(dto.cakeId) + val cake = cakeReadFacade.findById(dto.cakeId) val tags = dto.tagNames.map { tagManageFacade.create(it) }.toMutableList() cakeManageFacade.update(cake, dto.cakeImageUrl, tags, dto.cakeCategories) @@ -37,7 +37,7 @@ class CakeService( @Transactional fun deleteCake(cakeId: Long) { - val cake = cakeReader.findById(cakeId) + val cake = cakeReadFacade.findById(cakeId) cakeManageFacade.delete(cake) } diff --git a/cakk-admin/src/main/kotlin/com/cakk/admin/service/ShopService.kt b/cakk-admin/src/main/kotlin/com/cakk/admin/service/ShopService.kt index 7f6d52dc..9e12ec4d 100644 --- a/cakk-admin/src/main/kotlin/com/cakk/admin/service/ShopService.kt +++ b/cakk-admin/src/main/kotlin/com/cakk/admin/service/ShopService.kt @@ -6,17 +6,17 @@ import org.springframework.transaction.annotation.Transactional import com.cakk.admin.dto.param.CakeShopCreateByAdminParam import com.cakk.admin.dto.response.CakeShopCreateResponse import com.cakk.admin.mapper.supplyCakeShopCreateResponseBy +import com.cakk.core.facade.cake.CakeShopReadFacade import com.cakk.core.facade.shop.CakeShopManageFacade import com.cakk.domain.mysql.dto.param.link.UpdateLinkParam import com.cakk.domain.mysql.dto.param.operation.UpdateShopOperationParam import com.cakk.domain.mysql.dto.param.shop.CakeShopUpdateParam import com.cakk.domain.mysql.dto.param.shop.UpdateShopAddressParam import com.cakk.domain.mysql.entity.shop.CakeShop -import com.cakk.domain.mysql.repository.reader.CakeShopReader @Service class ShopService( - private val cakeShopReader: CakeShopReader, + private val cakeShopReadFacade: CakeShopReadFacade, private val cakeShopManageFacade: CakeShopManageFacade ) { @@ -34,25 +34,25 @@ class ShopService( @Transactional fun updateBasicInformation(dto: CakeShopUpdateParam) { - val cakeShop = cakeShopReader.findById(dto.cakeShopId) + val cakeShop = cakeShopReadFacade.findById(dto.cakeShopId) cakeShop.updateBasicInformation(dto) } @Transactional fun updateShopLinks(param: UpdateLinkParam) { - val cakeShop = cakeShopReader.findById(param.cakeShopId) + val cakeShop = cakeShopReadFacade.findById(param.cakeShopId) cakeShop.updateShopLinks(param.cakeShopLinks) } @Transactional fun updateShopOperationDays(param: UpdateShopOperationParam) { - val cakeShop = cakeShopReader.findById(param.cakeShopId) + val cakeShop = cakeShopReadFacade.findById(param.cakeShopId) cakeShop.updateShopOperationDays(param.cakeShopOperations) } @Transactional fun updateShopAddress(param: UpdateShopAddressParam) { - val cakeShop = cakeShopReader.findById(param.cakeShopId) + val cakeShop = cakeShopReadFacade.findById(param.cakeShopId) cakeShop.updateShopAddress(param) } } diff --git a/cakk-api/src/main/java/com/cakk/api/mapper/CakeMapper.java b/cakk-api/src/main/java/com/cakk/api/mapper/CakeMapper.java index b5aaff38..2b125ee4 100644 --- a/cakk-api/src/main/java/com/cakk/api/mapper/CakeMapper.java +++ b/cakk-api/src/main/java/com/cakk/api/mapper/CakeMapper.java @@ -89,6 +89,6 @@ public static Cake supplyCakeBy(String cakeImageUrl) { } private static boolean isEmptyTag(TagParam tagParam) { - return isNull(tagParam.tagId()) || isNull(tagParam.tagName() ); + return isNull(tagParam.tagId()) || isNull(tagParam.tagName()); } } diff --git a/cakk-api/src/main/java/com/cakk/api/mapper/ShopMapper.java b/cakk-api/src/main/java/com/cakk/api/mapper/ShopMapper.java index 00416350..0aac6578 100644 --- a/cakk-api/src/main/java/com/cakk/api/mapper/ShopMapper.java +++ b/cakk-api/src/main/java/com/cakk/api/mapper/ShopMapper.java @@ -21,9 +21,9 @@ import com.cakk.api.dto.response.shop.CakeShopOwnerResponse; import com.cakk.api.dto.response.shop.CakeShopSearchResponse; import com.cakk.api.dto.response.shop.CakeShopSimpleResponse; +import com.cakk.domain.mysql.bo.shop.CakeShopByLocationParam; +import com.cakk.domain.mysql.bo.shop.CakeShopBySearchParam; import com.cakk.domain.mysql.dto.param.like.HeartCakeShopResponseParam; -import com.cakk.domain.mysql.dto.param.shop.CakeShopByLocationParam; -import com.cakk.domain.mysql.dto.param.shop.CakeShopBySearchParam; import com.cakk.domain.mysql.dto.param.shop.CakeShopDetailParam; import com.cakk.domain.mysql.dto.param.shop.CakeShopInfoParam; import com.cakk.domain.mysql.dto.param.shop.CakeShopLocationResponseParam; diff --git a/cakk-api/src/main/java/com/cakk/api/service/cake/CakeService.java b/cakk-api/src/main/java/com/cakk/api/service/cake/CakeService.java index f71b5613..108426fa 100644 --- a/cakk-api/src/main/java/com/cakk/api/service/cake/CakeService.java +++ b/cakk-api/src/main/java/com/cakk/api/service/cake/CakeService.java @@ -19,6 +19,9 @@ import com.cakk.api.dto.response.cake.CakeImageListResponse; import com.cakk.api.mapper.CakeMapper; import com.cakk.core.facade.cake.CakeManageFacade; +import com.cakk.core.facade.cake.CakeReadFacade; +import com.cakk.core.facade.cake.CakeShopReadFacade; +import com.cakk.core.facade.tag.TagReadFacade; import com.cakk.domain.mysql.dto.param.cake.CakeCreateParam; import com.cakk.domain.mysql.dto.param.cake.CakeDetailParam; import com.cakk.domain.mysql.dto.param.cake.CakeImageResponseParam; @@ -28,9 +31,6 @@ import com.cakk.domain.mysql.entity.cake.Tag; import com.cakk.domain.mysql.entity.shop.CakeShop; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.CakeReader; -import com.cakk.domain.mysql.repository.reader.CakeShopReader; -import com.cakk.domain.mysql.repository.reader.TagReader; import com.cakk.domain.redis.repository.CakeViewsRedisRepository; @Transactional(readOnly = true) @@ -38,30 +38,30 @@ @RequiredArgsConstructor public class CakeService { - private final CakeReader cakeReader; - private final TagReader tagReader; - private final CakeShopReader cakeShopReader; + private final CakeReadFacade cakeReadFacade; + private final TagReadFacade tagReadFacade; + private final CakeShopReadFacade cakeShopReadFacade; private final CakeViewsRedisRepository cakeViewsRedisRepository; private final CakeManageFacade cakeManageFacade; private final ApplicationEventPublisher publisher; public CakeImageListResponse findCakeImagesByCursorAndCategory(final CakeSearchByCategoryRequest dto) { final List cakeImages - = cakeReader.searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()); + = cakeReadFacade.searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()); return CakeMapper.supplyCakeImageListResponse(cakeImages); } public CakeImageListResponse findCakeImagesByCursorAndCakeShopId(final CakeSearchByShopRequest dto) { final List cakeImages - = cakeReader.searchCakeImagesByCursorAndCakeShopId(dto.cakeId(), dto.cakeShopId(), dto.pageSize()); + = cakeReadFacade.searchCakeImagesByCursorAndCakeShopId(dto.cakeId(), dto.cakeShopId(), dto.pageSize()); return CakeMapper.supplyCakeImageListResponse(cakeImages); } public CakeImageListResponse findCakeImagesByCursorAndSearch(final CakeSearchByLocationRequest dto) { final List cakeImages - = cakeReader.searchCakeImagesByCursorAndSearchKeyword(dto.toParam()); + = cakeReadFacade.searchCakeImagesByCursorAndSearchKeyword(dto.toParam()); final IncreaseSearchCountEvent event = new IncreaseSearchCountEvent(dto.keyword()); publisher.publishEvent(event); @@ -78,21 +78,21 @@ public CakeImageListResponse searchCakeImagesByCursorAndViews(final CakeSearchBy return CakeMapper.supplyCakeImageListResponse(List.of(), cakeIds); } - final List cakeImages = cakeReader.searchCakeImagesByCakeIds(cakeIds); + final List cakeImages = cakeReadFacade.searchCakeImagesByCakeIds(cakeIds); return CakeMapper.supplyCakeImageListResponse(cakeImages, cakeIds); } public CakeDetailResponse findCakeDetailById(Long cakeId) { - final CakeDetailParam cake = cakeReader.searchCakeDetailById(cakeId); + final CakeDetailParam cake = cakeReadFacade.searchCakeDetailById(cakeId); return CakeMapper.cakeDetailResponseFromParam(cake); } @Transactional public void createCake(CakeCreateParam param) { - final CakeShop cakeShop = cakeShopReader.searchByIdAndOwner(param.cakeShopId(), param.owner()); + final CakeShop cakeShop = cakeShopReadFacade.searchByIdAndOwner(param.cakeShopId(), param.owner()); final Cake cake = param.cake(); - final List tags = tagReader.getTagsByTagName(param.tagNames()); + final List tags = tagReadFacade.getTagsByTagName(param.tagNames()); final List cakeCategories = param.cakeCategories(); cakeManageFacade.create(cakeShop, cake, tags, cakeCategories); @@ -100,8 +100,8 @@ public void createCake(CakeCreateParam param) { @Transactional public void updateCake(CakeUpdateParam param) { - final Cake cake = cakeReader.findWithCakeTagsAndCakeCategories(param.cakeId(), param.owner()); - final List tags = tagReader.getTagsByTagName(param.tagNames()); + final Cake cake = cakeReadFacade.findWithCakeTagsAndCakeCategories(param.cakeId(), param.owner()); + final List tags = tagReadFacade.getTagsByTagName(param.tagNames()); final String cakeImageUrl = param.cakeImageUrl(); final List cakeCategories = param.cakeCategories(); @@ -110,7 +110,7 @@ public void updateCake(CakeUpdateParam param) { @Transactional public void deleteCake(User owner, Long cakeId) { - final Cake cake = cakeReader.findWithCakeTagsAndCakeCategories(cakeId, owner); + final Cake cake = cakeReadFacade.findWithCakeTagsAndCakeCategories(cakeId, owner); cakeManageFacade.delete(cake); } diff --git a/cakk-api/src/main/java/com/cakk/api/service/like/HeartService.java b/cakk-api/src/main/java/com/cakk/api/service/like/HeartService.java index 6b38c724..16e42e18 100644 --- a/cakk-api/src/main/java/com/cakk/api/service/like/HeartService.java +++ b/cakk-api/src/main/java/com/cakk/api/service/like/HeartService.java @@ -16,25 +16,23 @@ import com.cakk.api.mapper.CakeMapper; import com.cakk.api.mapper.HeartMapper; import com.cakk.api.mapper.ShopMapper; +import com.cakk.core.facade.cake.CakeReadFacade; +import com.cakk.core.facade.cake.CakeShopReadFacade; +import com.cakk.core.facade.cake.CakeShopUserReadFacade; import com.cakk.core.facade.user.UserHeartFacade; import com.cakk.domain.mysql.dto.param.like.HeartCakeImageResponseParam; import com.cakk.domain.mysql.dto.param.like.HeartCakeShopResponseParam; import com.cakk.domain.mysql.entity.cake.Cake; import com.cakk.domain.mysql.entity.shop.CakeShop; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.CakeHeartReader; -import com.cakk.domain.mysql.repository.reader.CakeReader; -import com.cakk.domain.mysql.repository.reader.CakeShopHeartReader; -import com.cakk.domain.mysql.repository.reader.CakeShopReader; @RequiredArgsConstructor @Service public class HeartService { - private final CakeReader cakeReader; - private final CakeShopReader cakeShopReader; - private final CakeHeartReader cakeHeartReader; - private final CakeShopHeartReader cakeShopHeartReader; + private final CakeReadFacade cakeReadFacade; + private final CakeShopReadFacade cakeShopReadFacade; + private final CakeShopUserReadFacade cakeShopUserReadFacade; private final UserHeartFacade userHeartFacade; @Transactional(readOnly = true) @@ -42,7 +40,7 @@ public HeartCakeImageListResponse searchCakeImagesByCursorAndHeart( final HeartCakeSearchRequest dto, final User signInUser ) { - final List cakeImages = cakeHeartReader.searchCakeImagesByCursorAndHeart( + final List cakeImages = cakeShopUserReadFacade.searchCakeImagesByCursorAndHeart( dto.cakeHeartId(), signInUser.getId(), dto.pageSize() @@ -56,7 +54,7 @@ public HeartCakeShopListResponse searchCakeShopByCursorAndHeart( final HeartCakeShopSearchRequest dto, final User signInUser ) { - final List cakeShops = cakeShopHeartReader.searchAllByCursorAndHeart( + final List cakeShops = cakeShopUserReadFacade.searchAllCakeShopsByCursorAndHeart( dto.cakeShopHeartId(), signInUser.getId(), dto.pageSize() @@ -67,7 +65,7 @@ public HeartCakeShopListResponse searchCakeShopByCursorAndHeart( @Transactional(readOnly = true) public HeartResponse isHeartCake(final User user, final Long cakeId) { - final Cake cake = cakeReader.findByIdWithHeart(cakeId); + final Cake cake = cakeReadFacade.findByIdWithHeart(cakeId); final boolean isHeart = cake.isHeartedBy(user); return HeartMapper.supplyHeartResponseBy(isHeart); @@ -75,7 +73,7 @@ public HeartResponse isHeartCake(final User user, final Long cakeId) { @Transactional(readOnly = true) public HeartResponse isHeartCakeShop(final User user, final Long cakeShopId) { - final CakeShop cakeShop = cakeShopReader.findByIdWithHeart(cakeShopId); + final CakeShop cakeShop = cakeShopReadFacade.findByIdWithHeart(cakeShopId); final boolean isHeart = cakeShop.isHeartedBy(user); return HeartMapper.supplyHeartResponseBy(isHeart); @@ -83,14 +81,14 @@ public HeartResponse isHeartCakeShop(final User user, final Long cakeShopId) { @DistributedLock(key = "#cakeId") public void heartCake(final User user, final Long cakeId) { - final Cake cake = cakeReader.findByIdWithHeart(cakeId); + final Cake cake = cakeReadFacade.findByIdWithHeart(cakeId); userHeartFacade.heartCake(user, cake); } @DistributedLock(key = "#cakeShopId") public void heartCakeShop(final User user, final Long cakeShopId) { - final CakeShop cakeShop = cakeShopReader.findByIdWithHeart(cakeShopId); + final CakeShop cakeShop = cakeShopReadFacade.findByIdWithHeart(cakeShopId); userHeartFacade.heartCakeShop(user, cakeShop); } diff --git a/cakk-api/src/main/java/com/cakk/api/service/like/LikeService.java b/cakk-api/src/main/java/com/cakk/api/service/like/LikeService.java index 5a78592a..57ffcdb4 100644 --- a/cakk-api/src/main/java/com/cakk/api/service/like/LikeService.java +++ b/cakk-api/src/main/java/com/cakk/api/service/like/LikeService.java @@ -5,21 +5,21 @@ import lombok.RequiredArgsConstructor; import com.cakk.api.annotation.DistributedLock; +import com.cakk.core.facade.cake.CakeShopReadFacade; import com.cakk.core.facade.user.UserLikeFacade; import com.cakk.domain.mysql.entity.shop.CakeShop; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.CakeShopReader; @Service @RequiredArgsConstructor public class LikeService { - private final CakeShopReader cakeShopReader; + private final CakeShopReadFacade cakeShopReadFacade; private final UserLikeFacade userCakeFacade; @DistributedLock(key = "#cakeShopId") public void likeCakeShop(final User user, final Long cakeShopId) { - final CakeShop cakeShop = cakeShopReader.findByIdWithLike(cakeShopId); + final CakeShop cakeShop = cakeShopReadFacade.findByIdWithLike(cakeShopId); userCakeFacade.likeCakeShop(user, cakeShop); } diff --git a/cakk-api/src/main/java/com/cakk/api/service/shop/ShopService.java b/cakk-api/src/main/java/com/cakk/api/service/shop/ShopService.java index ed8b2703..f69669e8 100644 --- a/cakk-api/src/main/java/com/cakk/api/service/shop/ShopService.java +++ b/cakk-api/src/main/java/com/cakk/api/service/shop/ShopService.java @@ -32,13 +32,16 @@ import com.cakk.api.mapper.LinkMapper; import com.cakk.api.mapper.PointMapper; import com.cakk.api.mapper.ShopMapper; +import com.cakk.core.facade.cake.BusinessInformationReadFacade; +import com.cakk.core.facade.cake.CakeShopReadFacade; import com.cakk.core.facade.shop.CakeShopManageFacade; -import com.cakk.domain.mysql.bo.CakeShops; +import com.cakk.core.facade.user.UserReadFacade; +import com.cakk.domain.mysql.bo.shop.CakeShopByLocationParam; +import com.cakk.domain.mysql.bo.shop.CakeShopBySearchParam; +import com.cakk.domain.mysql.bo.shop.CakeShops; import com.cakk.domain.mysql.bo.user.VerificationPolicy; import com.cakk.domain.mysql.dto.param.link.UpdateLinkParam; import com.cakk.domain.mysql.dto.param.operation.UpdateShopOperationParam; -import com.cakk.domain.mysql.dto.param.shop.CakeShopByLocationParam; -import com.cakk.domain.mysql.dto.param.shop.CakeShopBySearchParam; import com.cakk.domain.mysql.dto.param.shop.CakeShopDetailParam; import com.cakk.domain.mysql.dto.param.shop.CakeShopInfoParam; import com.cakk.domain.mysql.dto.param.shop.CakeShopSimpleParam; @@ -53,18 +56,15 @@ import com.cakk.domain.mysql.event.shop.CertificationEvent; import com.cakk.domain.mysql.event.views.CakeShopIncreaseViewsEvent; import com.cakk.domain.mysql.mapper.EventMapper; -import com.cakk.domain.mysql.repository.reader.BusinessInformationReader; -import com.cakk.domain.mysql.repository.reader.CakeShopReader; -import com.cakk.domain.mysql.repository.reader.UserReader; import com.cakk.domain.redis.repository.CakeShopViewsRedisRepository; @Service @RequiredArgsConstructor public class ShopService { - private final UserReader userReader; - private final CakeShopReader cakeShopReader; - private final BusinessInformationReader businessInformationReader; + private final UserReadFacade userReadFacade; + private final CakeShopReadFacade cakeShopReadFacade; + private final BusinessInformationReadFacade businessInformationReadFacade; private final CakeShopManageFacade cakeShopManageFacade; private final CakeShopViewsRedisRepository cakeShopViewsRedisRepository; @@ -85,46 +85,47 @@ public CakeShopCreateResponse createCakeShopByCertification(final CreateShopRequ @Transactional public void promoteUserToBusinessOwner(final PromotionRequest request) { - final User user = userReader.findByUserId(request.userId()); - final BusinessInformation businessInformation = cakeShopReader.findBusinessInformationWithShop(request.cakeShopId()); + final User user = userReadFacade.findByUserId(request.userId()); + final BusinessInformation businessInformation = cakeShopReadFacade.findBusinessInformationWithShop(request.cakeShopId()); businessInformation.updateBusinessOwner(verificationPolicy, user); } @Transactional public void updateBasicInformation(final CakeShopUpdateParam param) { - final CakeShop cakeShop = cakeShopReader.searchByIdAndOwner(param.cakeShopId(), param.user()); + final CakeShop cakeShop = cakeShopReadFacade.searchByIdAndOwner(param.cakeShopId(), param.user()); cakeShop.updateBasicInformation(param); } @Transactional public void updateShopLinks(final UpdateLinkParam param) { - final CakeShop cakeShop = cakeShopReader.searchWithShopLinks(param.user(), param.cakeShopId()); + final CakeShop cakeShop = cakeShopReadFacade.searchWithShopLinks(param.user(), param.cakeShopId()); cakeShop.updateShopLinks(param.cakeShopLinks()); } @Transactional public void updateShopAddress(final UpdateShopAddressParam param) { - final CakeShop cakeShop = cakeShopReader.searchByIdAndOwner(param.cakeShopId(), param.user()); + final CakeShop cakeShop = cakeShopReadFacade.searchByIdAndOwner(param.cakeShopId(), param.user()); cakeShop.updateShopAddress(param); } @Transactional public void updateShopOperationDays(final UpdateShopOperationParam param) { - final CakeShop cakeShop = cakeShopReader.searchWithOperations(param.user(), param.cakeShopId()); + final CakeShop cakeShop = cakeShopReadFacade.searchWithOperations(param.user(), param.cakeShopId()); cakeShop.updateShopOperationDays(param.cakeShopOperations()); } @Transactional(readOnly = true) public CakeShopByMineResponse getMyBusinessId(final User user) { - final List result = businessInformationReader.findAllWithCakeShopByUser(user); + final List result = businessInformationReadFacade.findAllWithCakeShopByUser(user); return ShopMapper.supplyCakeShopByMineResponseBy(result); } @Transactional public void requestCertificationBusinessOwner(final CertificationParam param) { - final BusinessInformation businessInformation = cakeShopReader.findBusinessInformationByCakeShopId(param.cakeShopId()); + final BusinessInformation businessInformation = cakeShopReadFacade.findBusinessInformationByCakeShopId( + param.cakeShopId()); final CertificationEvent certificationEvent = verificationPolicy .requestCertificationBusinessOwner(businessInformation, param); @@ -133,14 +134,14 @@ public void requestCertificationBusinessOwner(final CertificationParam param) { @Transactional(readOnly = true) public CakeShopSimpleResponse searchSimpleById(final Long cakeShopId) { - final CakeShopSimpleParam cakeShop = cakeShopReader.searchSimpleById(cakeShopId); + final CakeShopSimpleParam cakeShop = cakeShopReadFacade.searchSimpleById(cakeShopId); return ShopMapper.cakeShopSimpleResponseFromParam(cakeShop); } @Transactional(readOnly = true) public CakeShopDetailResponse searchDetailById(final Long cakeShopId) { - final CakeShopDetailParam cakeShop = cakeShopReader.searchDetailById(cakeShopId); + final CakeShopDetailParam cakeShop = cakeShopReadFacade.searchDetailById(cakeShopId); final CakeShopIncreaseViewsEvent event = EventMapper.supplyCakeShopIncreaseViewsEvent(cakeShopId); publisher.publishEvent(event); @@ -149,7 +150,7 @@ public CakeShopDetailResponse searchDetailById(final Long cakeShopId) { @Transactional(readOnly = true) public CakeShopInfoResponse searchInfoById(final Long cakeShopId) { - final CakeShopInfoParam cakeShopInfo = cakeShopReader.searchInfoById(cakeShopId); + final CakeShopInfoParam cakeShopInfo = cakeShopReadFacade.searchInfoById(cakeShopId); return ShopMapper.supplyCakeShopInfoResponseBy(cakeShopInfo); } @@ -161,7 +162,7 @@ public CakeShopByMapResponse searchShop(final SearchShopByLocationRequest reques final Double distance = request.distance(); final Point point = PointMapper.supplyPointBy(latitude, longitude); - final List result = cakeShopReader + final List result = cakeShopReadFacade .searchShopByLocationBased(point, Objects.requireNonNullElse(distance, 1000.0)); final CakeShops cakeShops = new CakeShops<>(result, 4); @@ -171,7 +172,7 @@ public CakeShopByMapResponse searchShop(final SearchShopByLocationRequest reques @Transactional(readOnly = true) public CakeShopSearchResponse searchShopByKeyword(final CakeShopSearchRequest dto) { final int pageSize = dto.pageSize(); - final List result = cakeShopReader.searchShopBySearch(dto.toParam()); + final List result = cakeShopReadFacade.searchShopBySearch(dto.toParam()); final List cakeShopBySearchParams = ShopMapper.supplyCakeShopBySearchParamListBy(result); final CakeShops cakeShops = new CakeShops<>(cakeShopBySearchParams, 4, pageSize); @@ -192,7 +193,7 @@ public CakeShopSearchResponse searchCakeShopsByCursorAndViews(final CakeShopSear return ShopMapper.supplyCakeShopSearchResponseBy(List.of()); } - final List result = cakeShopReader.searchShopsByShopIds(cakeShopIds); + final List result = cakeShopReadFacade.searchShopsByShopIds(cakeShopIds); final List cakeShopBySearchParams = ShopMapper.supplyCakeShopBySearchParamListBy(result); final CakeShops cakeShops = new CakeShops<>(cakeShopBySearchParams, 6, pageSize); @@ -201,14 +202,14 @@ public CakeShopSearchResponse searchCakeShopsByCursorAndViews(final CakeShopSear @Transactional(readOnly = true) public CakeShopOwnerResponse isExistBusinessInformation(final User owner, final Long cakeShopId) { - final Boolean isOwned = businessInformationReader.isExistBusinessInformation(owner, cakeShopId); + final Boolean isOwned = businessInformationReadFacade.isExistBusinessInformation(owner, cakeShopId); return ShopMapper.supplyCakeShopOwnerResponseBy(isOwned); } @Transactional(readOnly = true) public CakeShopOwnerCandidatesResponse getBusinessOwnerCandidates() { - List businessInformations = businessInformationReader.findAllCakeShopBusinessOwnerCandidates(); + List businessInformations = businessInformationReadFacade.findAllCakeShopBusinessOwnerCandidates(); businessInformations = businessInformations .stream() @@ -220,7 +221,7 @@ public CakeShopOwnerCandidatesResponse getBusinessOwnerCandidates() { @Transactional(readOnly = true) public CakeShopOwnerCandidateResponse getCandidateInformation(final Long userId) { - BusinessInformation businessInformation = businessInformationReader.findByUserId(userId); + BusinessInformation businessInformation = businessInformationReadFacade.findByUserId(userId); return BusinessInformationMapper.supplyCakeShopOwnerCandidateResponseBy(businessInformation); } diff --git a/cakk-api/src/main/java/com/cakk/api/service/user/SignService.java b/cakk-api/src/main/java/com/cakk/api/service/user/SignService.java index f2132681..db5bb3bf 100644 --- a/cakk-api/src/main/java/com/cakk/api/service/user/SignService.java +++ b/cakk-api/src/main/java/com/cakk/api/service/user/SignService.java @@ -14,8 +14,8 @@ import com.cakk.common.enums.ReturnCode; import com.cakk.common.exception.CakkException; import com.cakk.core.facade.user.UserManageFacade; +import com.cakk.core.facade.user.UserReadFacade; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.UserReader; import com.cakk.domain.redis.repository.TokenRedisRepository; @Service @@ -25,7 +25,7 @@ public class SignService { private final OidcProviderFactory oidcProviderFactory; private final JwtProvider jwtProvider; - private final UserReader userReader; + private final UserReadFacade userReadFacade; private final UserManageFacade userManageFacade; private final TokenRedisRepository tokenRedisRepository; @@ -40,7 +40,7 @@ public JwtResponse signUp(final UserSignUpRequest dto) { @Transactional(readOnly = true) public JwtResponse signIn(final UserSignInRequest dto) { final String providerId = oidcProviderFactory.getProviderId(dto.provider(), dto.idToken()); - final User user = userReader.findByProviderId(providerId); + final User user = userReadFacade.findByProviderId(providerId); return JwtResponse.from(jwtProvider.generateToken(user)); } diff --git a/cakk-api/src/main/java/com/cakk/api/service/user/UserService.java b/cakk-api/src/main/java/com/cakk/api/service/user/UserService.java index 89389a85..24101ce5 100644 --- a/cakk-api/src/main/java/com/cakk/api/service/user/UserService.java +++ b/cakk-api/src/main/java/com/cakk/api/service/user/UserService.java @@ -9,28 +9,28 @@ import com.cakk.api.dto.response.user.ProfileInformationResponse; import com.cakk.api.mapper.UserMapper; import com.cakk.core.facade.user.UserManageFacade; +import com.cakk.core.facade.user.UserReadFacade; import com.cakk.domain.mysql.dto.param.user.ProfileUpdateParam; import com.cakk.domain.mysql.entity.user.User; import com.cakk.domain.mysql.entity.user.UserWithdrawal; -import com.cakk.domain.mysql.repository.reader.UserReader; @Service @RequiredArgsConstructor public class UserService { - private final UserReader userReader; + private final UserReadFacade userReadFacade; private final UserManageFacade userManageFacade; @Transactional(readOnly = true) public ProfileInformationResponse findProfile(final User signInUser) { - final User user = userReader.findByUserId(signInUser.getId()); + final User user = userReadFacade.findByUserId(signInUser.getId()); return UserMapper.supplyProfileInformationResponseBy(user); } @Transactional public void updateInformation(final User signInUser, final ProfileUpdateRequest dto) { - final User user = userReader.findByUserId(signInUser.getId()); + final User user = userReadFacade.findByUserId(signInUser.getId()); final ProfileUpdateParam param = UserMapper.supplyProfileUpdateParamBy(dto); userManageFacade.updateProfile(user, param); @@ -38,7 +38,7 @@ public void updateInformation(final User signInUser, final ProfileUpdateRequest @Transactional public void withdraw(final User signInUser) { - final User user = userReader.findByIdWithAll(signInUser.getId()); + final User user = userReadFacade.findByIdWithAll(signInUser.getId()); final UserWithdrawal withdrawal = UserMapper.supplyUserWithdrawalBy(user); userManageFacade.withdraw(user, withdrawal); diff --git a/cakk-api/src/main/java/com/cakk/api/service/views/ViewsService.java b/cakk-api/src/main/java/com/cakk/api/service/views/ViewsService.java index dec7e7f1..011412cc 100644 --- a/cakk-api/src/main/java/com/cakk/api/service/views/ViewsService.java +++ b/cakk-api/src/main/java/com/cakk/api/service/views/ViewsService.java @@ -9,15 +9,15 @@ import lombok.RequiredArgsConstructor; import com.cakk.common.exception.CakkException; +import com.cakk.core.facade.cake.CakeReadFacade; import com.cakk.domain.mysql.entity.cake.Cake; import com.cakk.domain.mysql.event.views.CakeIncreaseViewsEvent; -import com.cakk.domain.mysql.repository.reader.CakeReader; @RequiredArgsConstructor @Service public class ViewsService { - private final CakeReader cakeReader; + private final CakeReadFacade cakeReadFacade; private final ApplicationEventPublisher publisher; @@ -28,7 +28,7 @@ public void increaseCakeViews(final Long cakeId) { } try { - final Cake cake = cakeReader.findById(cakeId); + final Cake cake = cakeReadFacade.findById(cakeId); final CakeIncreaseViewsEvent event = cake.getInCreaseViewsEvent(); publisher.publishEvent(event); diff --git a/cakk-api/src/test/java/com/cakk/api/common/base/IntegrationTest.java b/cakk-api/src/test/java/com/cakk/api/common/base/IntegrationTest.java index 5ab9f014..a8bfc26a 100644 --- a/cakk-api/src/test/java/com/cakk/api/common/base/IntegrationTest.java +++ b/cakk-api/src/test/java/com/cakk/api/common/base/IntegrationTest.java @@ -18,8 +18,8 @@ import com.cakk.api.provider.jwt.JwtProvider; import com.cakk.api.vo.JsonWebToken; +import com.cakk.core.facade.user.UserReadFacade; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.UserReader; @ExtendWith(SpringExtension.class) @ActiveProfiles("test") @@ -42,7 +42,7 @@ public abstract class IntegrationTest { private JwtProvider jwtProvider; @Autowired - protected UserReader userReader; + protected UserReadFacade userReadFacade; protected static final String BASE_URL = "http://localhost:"; @@ -82,13 +82,13 @@ protected HttpHeaders getAuthHeaderById(Long id) { } protected JsonWebToken getAuthToken() { - final User user = userReader.findByUserId(1L); + final User user = userReadFacade.findByUserId(1L); return jwtProvider.generateToken(user); } private JsonWebToken getAuthTokenById(Long id) { - final User user = userReader.findByUserId(id); + final User user = userReadFacade.findByUserId(id); return jwtProvider.generateToken(user); } diff --git a/cakk-api/src/test/java/com/cakk/api/common/base/ServiceTest.java b/cakk-api/src/test/java/com/cakk/api/common/base/ServiceTest.java index 43e3dc34..cc20a688 100644 --- a/cakk-api/src/test/java/com/cakk/api/common/base/ServiceTest.java +++ b/cakk-api/src/test/java/com/cakk/api/common/base/ServiceTest.java @@ -14,11 +14,13 @@ import net.jqwik.api.Arbitraries; import com.navercorp.fixturemonkey.FixtureMonkey; +import com.navercorp.fixturemonkey.api.instantiator.Instantiator; import com.navercorp.fixturemonkey.api.introspector.BuilderArbitraryIntrospector; import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector; import com.navercorp.fixturemonkey.api.introspector.FieldReflectionArbitraryIntrospector; import com.navercorp.fixturemonkey.jakarta.validation.plugin.JakartaValidationPlugin; +import com.cakk.common.enums.Gender; import com.cakk.common.enums.Provider; import com.cakk.common.enums.Role; import com.cakk.domain.mysql.config.JpaConfig; @@ -59,14 +61,21 @@ protected final FixtureMonkey getBuilderMonkey() { protected User getUser() { return getConstructorMonkey().giveMeBuilder(User.class) - .set("id", Arbitraries.longs().greaterOrEqual(10)) - .set("provider", Arbitraries.of(Provider.class)) - .set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) - .set("email", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) - .set("nickname", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) - .set("birthday", LocalDate.now()) - .set("role", Arbitraries.of(Role.class)) - .sample(); + .instantiate( + User.class, + Instantiator.constructor() + .parameter(long.class) + .parameter(Provider.class) + .parameter(String.class) + .parameter(String.class) + .parameter(String.class) + .parameter(String.class) + .parameter(Gender.class) + .parameter(LocalDate.class) + .parameter(String.class) + .parameter(String.class) + .parameter(Role.class) + ).sample(); } public static Point supplyPointBy(Double latitude, Double longitude) { diff --git a/cakk-api/src/test/java/com/cakk/api/common/config/WithMockCustomUserSecurityContextFactory.java b/cakk-api/src/test/java/com/cakk/api/common/config/WithMockCustomUserSecurityContextFactory.java index f1d16c6d..40441a72 100644 --- a/cakk-api/src/test/java/com/cakk/api/common/config/WithMockCustomUserSecurityContextFactory.java +++ b/cakk-api/src/test/java/com/cakk/api/common/config/WithMockCustomUserSecurityContextFactory.java @@ -9,20 +9,20 @@ import com.cakk.api.common.annotation.MockCustomUser; import com.cakk.api.vo.OAuthUserDetails; +import com.cakk.core.facade.user.UserReadFacade; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.UserReader; @Component public class WithMockCustomUserSecurityContextFactory implements WithSecurityContextFactory { @Autowired - private UserReader userReader; + private UserReadFacade userReadFacade; @Override public SecurityContext createSecurityContext(MockCustomUser annotation) { final SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - final User user = userReader.findByUserId(1L); + final User user = userReadFacade.findByUserId(1L); final OAuthUserDetails userDetails = new OAuthUserDetails(user); final UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); diff --git a/cakk-api/src/test/java/com/cakk/api/integration/cake/CakeIntegrationTest.java b/cakk-api/src/test/java/com/cakk/api/integration/cake/CakeIntegrationTest.java index e5387ac5..7cd923d0 100644 --- a/cakk-api/src/test/java/com/cakk/api/integration/cake/CakeIntegrationTest.java +++ b/cakk-api/src/test/java/com/cakk/api/integration/cake/CakeIntegrationTest.java @@ -27,9 +27,9 @@ import com.cakk.common.enums.CakeDesignCategory; import com.cakk.common.enums.ReturnCode; import com.cakk.common.response.ApiResponse; +import com.cakk.core.facade.cake.CakeReadFacade; import com.cakk.domain.mysql.dto.param.cake.CakeImageResponseParam; import com.cakk.domain.mysql.entity.cake.CakeCategory; -import com.cakk.domain.mysql.repository.reader.CakeCategoryReader; import com.cakk.domain.redis.repository.CakeViewsRedisRepository; @SqlGroup({ @@ -45,7 +45,7 @@ class CakeIntegrationTest extends IntegrationTest { private static final String API_URL = "/api/v1/cakes"; @Autowired - private CakeCategoryReader cakeCategoryReader; + private CakeReadFacade cakeReadFacade; @Autowired private CakeViewsRedisRepository cakeViewsRedisRepository; @@ -101,7 +101,7 @@ void searchByCategory1() { assertEquals(lastCakeId, data.lastCakeId()); assertEquals(5, data.size()); data.cakeImages().forEach(cakeImage -> { - CakeCategory cakeCategory = cakeCategoryReader.findByCakeId(cakeImage.cakeId()); + CakeCategory cakeCategory = cakeReadFacade.findCakeCategoryByCakeId(cakeImage.cakeId()); assertEquals(CakeDesignCategory.FLOWER, cakeCategory.getCakeDesignCategory()); }); } @@ -132,7 +132,7 @@ void searchByCategory2() { assertEquals(lastCakeId, data.lastCakeId()); assertEquals(5, data.size()); data.cakeImages().forEach(cakeImage -> { - CakeCategory cakeCategory = cakeCategoryReader.findByCakeId(cakeImage.cakeId()); + CakeCategory cakeCategory = cakeReadFacade.findCakeCategoryByCakeId(cakeImage.cakeId()); assertEquals(CakeDesignCategory.FLOWER, cakeCategory.getCakeDesignCategory()); }); } @@ -189,7 +189,7 @@ void searchByShopId1() { assertEquals(lastCakeId, data.lastCakeId()); assertEquals(3, data.size()); data.cakeImages().forEach(cakeImage -> { - assertEquals(Long.valueOf(1L), cakeImage.cakeShopId()); + assertEquals(Long.valueOf(1), cakeImage.cakeShopId()); }); } @@ -219,7 +219,7 @@ void searchByShopId2() { assertEquals(lastCakeId, data.lastCakeId()); assertEquals(3, data.size()); data.cakeImages().forEach(cakeImage -> - assertEquals(Long.valueOf(1L), cakeImage.cakeShopId()) + assertEquals(Long.valueOf(1), cakeImage.cakeShopId()) ); } diff --git a/cakk-api/src/test/java/com/cakk/api/integration/shop/ShopIntegrationTest.java b/cakk-api/src/test/java/com/cakk/api/integration/shop/ShopIntegrationTest.java index a3a8d395..0f1fb1d2 100644 --- a/cakk-api/src/test/java/com/cakk/api/integration/shop/ShopIntegrationTest.java +++ b/cakk-api/src/test/java/com/cakk/api/integration/shop/ShopIntegrationTest.java @@ -40,13 +40,11 @@ import com.cakk.common.enums.Days; import com.cakk.common.enums.ReturnCode; import com.cakk.common.response.ApiResponse; +import com.cakk.core.facade.cake.CakeShopReadFacade; import com.cakk.domain.mysql.dto.param.shop.CakeShopLinkParam; import com.cakk.domain.mysql.dto.param.shop.CakeShopOperationParam; import com.cakk.domain.mysql.entity.shop.CakeShop; import com.cakk.domain.mysql.entity.shop.CakeShopOperation; -import com.cakk.domain.mysql.repository.reader.CakeShopLinkReader; -import com.cakk.domain.mysql.repository.reader.CakeShopOperationReader; -import com.cakk.domain.mysql.repository.reader.CakeShopReader; import com.cakk.domain.redis.repository.CakeShopViewsRedisRepository; import com.cakk.domain.redis.repository.CakeViewsRedisRepository; @@ -63,13 +61,7 @@ class ShopIntegrationTest extends IntegrationTest { private static final String API_URL = "/api/v1/shops"; @Autowired - private CakeShopReader cakeShopReader; - - @Autowired - private CakeShopOperationReader cakeShopOperationReader; - - @Autowired - private CakeShopLinkReader cakeShopLinkReader; + private CakeShopReadFacade cakeShopReadFacade; @Autowired private CakeViewsRedisRepository cakeViewsRedisRepository; @@ -124,7 +116,7 @@ void simple1() { assertEquals(ReturnCode.SUCCESS.getCode(), response.getReturnCode()); assertEquals(ReturnCode.SUCCESS.getMessage(), response.getReturnMessage()); - final CakeShop cakeShop = cakeShopReader.findById(cakeShopId); + final CakeShop cakeShop = cakeShopReadFacade.findById(cakeShopId); assertEquals(cakeShop.getId(), data.cakeShopId()); assertEquals(cakeShop.getThumbnailUrl(), data.thumbnailUrl()); assertEquals(cakeShop.getShopName(), data.cakeShopName()); @@ -153,7 +145,7 @@ void simple2() { assertEquals(ReturnCode.SUCCESS.getCode(), response.getReturnCode()); assertEquals(ReturnCode.SUCCESS.getMessage(), response.getReturnMessage()); - final CakeShop cakeShop = cakeShopReader.findById(cakeShopId); + final CakeShop cakeShop = cakeShopReadFacade.findById(cakeShopId); assertEquals(cakeShop.getId(), data.cakeShopId()); assertEquals(cakeShop.getThumbnailUrl(), data.thumbnailUrl()); assertEquals(cakeShop.getShopName(), data.cakeShopName()); @@ -203,19 +195,19 @@ void detail1() { assertEquals(ReturnCode.SUCCESS.getCode(), response.getReturnCode()); assertEquals(ReturnCode.SUCCESS.getMessage(), response.getReturnMessage()); - final CakeShop cakeShop = cakeShopReader.findById(cakeShopId); + final CakeShop cakeShop = cakeShopReadFacade.findById(cakeShopId); assertEquals(cakeShop.getId(), data.cakeShopId()); assertEquals(cakeShop.getThumbnailUrl(), data.thumbnailUrl()); assertEquals(cakeShop.getShopName(), data.cakeShopName()); assertEquals(cakeShop.getShopBio(), data.cakeShopBio()); assertEquals(cakeShop.getShopDescription(), data.cakeShopDescription()); - final Set cakeShopOperations = cakeShopOperationReader.findAllByCakeShopId(cakeShopId).stream() + final Set cakeShopOperations = cakeShopReadFacade.findCakeShopOperationsByCakeShopId(cakeShopId).stream() .map(CakeShopOperation::getOperationDay) .collect(Collectors.toSet()); assertEquals(cakeShopOperations, data.operationDays()); - final Set cakeShopLinks = cakeShopLinkReader.findAllByCakeShopId(cakeShopId).stream() + final Set cakeShopLinks = cakeShopReadFacade.findCakeShopLinksByCakeShopId(cakeShopId).stream() .map((it) -> new CakeShopLinkParam(it.getLinkKind(), it.getLinkPath())) .collect(Collectors.toSet()); assertEquals(cakeShopLinks, data.links()); @@ -286,7 +278,7 @@ void detailInfo1() { assertEquals(ReturnCode.SUCCESS.getCode(), response.getReturnCode()); assertEquals(ReturnCode.SUCCESS.getMessage(), response.getReturnMessage()); - final CakeShop cakeShop = cakeShopReader.findById(cakeShopId); + final CakeShop cakeShop = cakeShopReadFacade.findById(cakeShopId); Double longitude = cakeShop.getLocation().getX(); Double latitude = cakeShop.getLocation().getY(); @@ -294,7 +286,7 @@ void detailInfo1() { assertEquals(latitude, data.latitude()); assertEquals(longitude, data.longitude()); - List cakeShopOperations = cakeShopOperationReader.findAllByCakeShopId(cakeShopId).stream() + List cakeShopOperations = cakeShopReadFacade.findCakeShopOperationsByCakeShopId(cakeShopId).stream() .map((it) -> new CakeShopOperationParam(it.getOperationDay(), it.getOperationStartTime(), it.getOperationEndTime())) .toList(); assertEquals(cakeShopOperations, data.shopOperationDays()); diff --git a/cakk-api/src/test/java/com/cakk/api/integration/user/MyPageIntegrationTest.java b/cakk-api/src/test/java/com/cakk/api/integration/user/MyPageIntegrationTest.java index a971ab99..d802a008 100644 --- a/cakk-api/src/test/java/com/cakk/api/integration/user/MyPageIntegrationTest.java +++ b/cakk-api/src/test/java/com/cakk/api/integration/user/MyPageIntegrationTest.java @@ -63,7 +63,7 @@ void profile() { assertEquals(ReturnCode.SUCCESS.getCode(), response.getReturnCode()); assertEquals(ReturnCode.SUCCESS.getMessage(), response.getReturnMessage()); - final User user = userReader.findByUserId(getUserId()); + final User user = userReadFacade.findByUserId(getUserId()); assertEquals(body.nickname(), user.getNickname()); assertEquals(body.profileImageUrl(), user.getProfileImageUrl()); assertEquals(body.email(), user.getEmail()); @@ -128,7 +128,7 @@ void modify() { assertEquals(ReturnCode.SUCCESS.getCode(), response.getReturnCode()); assertEquals(ReturnCode.SUCCESS.getMessage(), response.getReturnMessage()); - final User user = userReader.findByUserId(1L); + final User user = userReadFacade.findByUserId(1L); assertEquals(body.nickname(), user.getNickname()); assertEquals(body.profileImageUrl(), user.getProfileImageUrl()); assertEquals(body.email(), user.getEmail()); @@ -157,6 +157,6 @@ void withdraw() { assertEquals(ReturnCode.SUCCESS.getCode(), response.getReturnCode()); assertEquals(ReturnCode.SUCCESS.getMessage(), response.getReturnMessage()); - assertThrows(CakkException.class, () -> userReader.findByUserId(1L)); + assertThrows(CakkException.class, () -> userReadFacade.findByUserId(1L)); } } diff --git a/cakk-api/src/test/java/com/cakk/api/service/cake/CakeServiceTest.java b/cakk-api/src/test/java/com/cakk/api/service/cake/CakeServiceTest.java index 3f40e6b8..751c5148 100644 --- a/cakk-api/src/test/java/com/cakk/api/service/cake/CakeServiceTest.java +++ b/cakk-api/src/test/java/com/cakk/api/service/cake/CakeServiceTest.java @@ -18,8 +18,8 @@ import com.cakk.api.dto.request.cake.CakeSearchByViewsRequest; import com.cakk.api.dto.response.cake.CakeImageListResponse; import com.cakk.common.enums.CakeDesignCategory; +import com.cakk.core.facade.cake.CakeReadFacade; import com.cakk.domain.mysql.dto.param.cake.CakeImageResponseParam; -import com.cakk.domain.mysql.repository.reader.CakeReader; import com.cakk.domain.redis.repository.CakeViewsRedisRepository; @DisplayName("케이크 조회 관련 비즈니스 로직 테스트") @@ -29,7 +29,7 @@ class CakeServiceTest extends ServiceTest { private CakeService cakeService; @Mock - private CakeReader cakeReader; + private CakeReadFacade cakeReadFacade; @Mock private CakeViewsRedisRepository cakeViewsRedisRepository; @@ -44,7 +44,7 @@ void findCakeImagesByCursorAndCategory1() { .set("cakeImageUrl", Arbitraries.strings().alpha().ofMinLength(10).ofMaxLength(20)) .sampleList(3); - doReturn(cakeImages).when(cakeReader).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()); + doReturn(cakeImages).when(cakeReadFacade).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()); // when CakeImageListResponse result = cakeService.findCakeImagesByCursorAndCategory(dto); @@ -53,7 +53,7 @@ void findCakeImagesByCursorAndCategory1() { Assertions.assertEquals(cakeImages.size(), result.cakeImages().size()); Assertions.assertNotNull(result.lastCakeId()); - verify(cakeReader).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()); + verify(cakeReadFacade).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()); } @TestWithDisplayName("카테고리에 해당하는 케이크가 없을 시 빈 배열을 리턴한다.") @@ -62,7 +62,7 @@ void findCakeImagesByCursorAndCategory2() { CakeSearchByCategoryRequest dto = new CakeSearchByCategoryRequest(null, CakeDesignCategory.FLOWER, 3); List cakeImages = getConstructorMonkey().giveMe(CakeImageResponseParam.class, 0); - doReturn(cakeImages).when(cakeReader).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()); + doReturn(cakeImages).when(cakeReadFacade).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()); // when CakeImageListResponse result = cakeService.findCakeImagesByCursorAndCategory(dto); @@ -71,7 +71,7 @@ void findCakeImagesByCursorAndCategory2() { Assertions.assertEquals(cakeImages.size(), result.cakeImages().size()); Assertions.assertNull(result.lastCakeId()); - verify(cakeReader).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()); + verify(cakeReadFacade).searchCakeImagesByCursorAndCategory(dto.cakeId(), dto.category(), dto.pageSize()); } @TestWithDisplayName("케이크 샵에 속한 케이크 목록을 조회한다") @@ -84,7 +84,7 @@ void findCakeImagesByCursorAndShop1() { .set("cakeImageUrl", Arbitraries.strings().alpha().ofMinLength(10).ofMaxLength(20)) .sampleList(3); - doReturn(cakeImages).when(cakeReader).searchCakeImagesByCursorAndCakeShopId(dto.cakeId(), dto.cakeShopId(), dto.pageSize()); + doReturn(cakeImages).when(cakeReadFacade).searchCakeImagesByCursorAndCakeShopId(dto.cakeId(), dto.cakeShopId(), dto.pageSize()); // when CakeImageListResponse result = cakeService.findCakeImagesByCursorAndCakeShopId(dto); @@ -93,7 +93,7 @@ void findCakeImagesByCursorAndShop1() { Assertions.assertEquals(cakeImages.size(), result.cakeImages().size()); Assertions.assertNotNull(result.lastCakeId()); - verify(cakeReader).searchCakeImagesByCursorAndCakeShopId(dto.cakeId(), dto.cakeShopId(), dto.pageSize()); + verify(cakeReadFacade).searchCakeImagesByCursorAndCakeShopId(dto.cakeId(), dto.cakeShopId(), dto.pageSize()); } @TestWithDisplayName("케이크 샵에 속한 케이크가 없을 시 빈 배열을 리턴한다.") @@ -102,7 +102,7 @@ void findCakeImagesByCursorAndShop2() { CakeSearchByShopRequest dto = new CakeSearchByShopRequest(null, 1L, 3); List cakeImages = getConstructorMonkey().giveMe(CakeImageResponseParam.class, 0); - doReturn(cakeImages).when(cakeReader).searchCakeImagesByCursorAndCakeShopId(dto.cakeId(), dto.cakeShopId(), dto.pageSize()); + doReturn(cakeImages).when(cakeReadFacade).searchCakeImagesByCursorAndCakeShopId(dto.cakeId(), dto.cakeShopId(), dto.pageSize()); // when CakeImageListResponse result = cakeService.findCakeImagesByCursorAndCakeShopId(dto); @@ -111,7 +111,7 @@ void findCakeImagesByCursorAndShop2() { Assertions.assertEquals(cakeImages.size(), result.cakeImages().size()); Assertions.assertNull(result.lastCakeId()); - verify(cakeReader).searchCakeImagesByCursorAndCakeShopId(dto.cakeId(), dto.cakeShopId(), dto.pageSize()); + verify(cakeReadFacade).searchCakeImagesByCursorAndCakeShopId(dto.cakeId(), dto.cakeShopId(), dto.pageSize()); } @TestWithDisplayName("인기 케이크 목록을 조회한다") @@ -128,7 +128,7 @@ void searchCakeImagesByCursorAndViews1() { .sampleList(3); doReturn(cakeIds).when(cakeViewsRedisRepository).findTopCakeIdsByOffsetAndCount(cursor, pageSize); - doReturn(cakeImages).when(cakeReader).searchCakeImagesByCakeIds(cakeIds); + doReturn(cakeImages).when(cakeReadFacade).searchCakeImagesByCakeIds(cakeIds); // when CakeImageListResponse result = cakeService.searchCakeImagesByCursorAndViews(dto); @@ -138,7 +138,7 @@ void searchCakeImagesByCursorAndViews1() { Assertions.assertNull(result.lastCakeId()); verify(cakeViewsRedisRepository, times(1)).findTopCakeIdsByOffsetAndCount(cursor, pageSize); - verify(cakeReader, times(1)).searchCakeImagesByCakeIds(cakeIds); + verify(cakeReadFacade, times(1)).searchCakeImagesByCakeIds(cakeIds); } @TestWithDisplayName("인기 케이크 목록이 없을 시 빈 배열을 조회한다") @@ -158,6 +158,6 @@ void searchCakeImagesByCursorAndViews2() { Assertions.assertNull(result.lastCakeId()); verify(cakeViewsRedisRepository, times(1)).findTopCakeIdsByOffsetAndCount(cursor, pageSize); - verify(cakeReader, times(0)).searchCakeImagesByCakeIds(anyList()); + verify(cakeReadFacade, times(0)).searchCakeImagesByCakeIds(anyList()); } } diff --git a/cakk-api/src/test/java/com/cakk/api/service/like/HeartConcurrencyTest.java b/cakk-api/src/test/java/com/cakk/api/service/like/HeartConcurrencyTest.java index 43dbab3f..82d41a26 100644 --- a/cakk-api/src/test/java/com/cakk/api/service/like/HeartConcurrencyTest.java +++ b/cakk-api/src/test/java/com/cakk/api/service/like/HeartConcurrencyTest.java @@ -15,12 +15,12 @@ import org.springframework.test.context.jdbc.SqlGroup; import com.cakk.api.common.annotation.TestWithDisplayName; +import com.cakk.core.facade.cake.CakeReadFacade; +import com.cakk.core.facade.cake.CakeShopReadFacade; +import com.cakk.core.facade.user.UserReadFacade; import com.cakk.domain.mysql.entity.cake.Cake; import com.cakk.domain.mysql.entity.shop.CakeShop; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.CakeReader; -import com.cakk.domain.mysql.repository.reader.CakeShopReader; -import com.cakk.domain.mysql.repository.reader.UserReader; @SpringBootTest(properties = "spring.profiles.active=test") @SqlGroup({ @@ -35,19 +35,19 @@ class HeartConcurrencyTest { private HeartService heartService; @Autowired - private CakeReader cakeReader; + private CakeReadFacade cakeReadFacade; @Autowired - private CakeShopReader cakeShopReader; + private CakeShopReadFacade cakeShopReadFacade; @Autowired - private UserReader userReader; + private UserReadFacade userReadFacade; private List userList; @BeforeEach void initUserList() { - userList = userReader.findAll(); + userList = userReadFacade.findAll(); } @TestWithDisplayName("케이크 하트 동작 시, 동시성 문제가 발생하지 않는다.") @@ -75,7 +75,7 @@ void executeHeartCakeWithLock() throws InterruptedException { latch.await(); // then - final Cake cake = cakeReader.findById(cakeId); + final Cake cake = cakeReadFacade.findById(cakeId); assertEquals(100, cake.getHeartCount().intValue()); } @@ -104,7 +104,7 @@ void executeHeartCakeShopWithLock() throws InterruptedException { latch.await(); // then - final CakeShop cakeShop = cakeShopReader.findById(cakeShopId); + final CakeShop cakeShop = cakeShopReadFacade.findById(cakeShopId); assertEquals(100, cakeShop.getHeartCount().intValue()); } } diff --git a/cakk-api/src/test/java/com/cakk/api/service/like/HeartServiceTest.java b/cakk-api/src/test/java/com/cakk/api/service/like/HeartServiceTest.java index 82d25047..29f2efd3 100644 --- a/cakk-api/src/test/java/com/cakk/api/service/like/HeartServiceTest.java +++ b/cakk-api/src/test/java/com/cakk/api/service/like/HeartServiceTest.java @@ -18,15 +18,14 @@ import com.cakk.api.dto.response.like.HeartCakeImageListResponse; import com.cakk.common.enums.ReturnCode; import com.cakk.common.exception.CakkException; +import com.cakk.core.facade.cake.CakeReadFacade; +import com.cakk.core.facade.cake.CakeShopReadFacade; +import com.cakk.core.facade.cake.CakeShopUserReadFacade; import com.cakk.core.facade.user.UserHeartFacade; import com.cakk.domain.mysql.dto.param.like.HeartCakeImageResponseParam; import com.cakk.domain.mysql.entity.cake.Cake; import com.cakk.domain.mysql.entity.shop.CakeShop; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.CakeHeartReader; -import com.cakk.domain.mysql.repository.reader.CakeReader; -import com.cakk.domain.mysql.repository.reader.CakeShopHeartReader; -import com.cakk.domain.mysql.repository.reader.CakeShopReader; @DisplayName("하트 기능 관련 비즈니스 로직 테스트") class HeartServiceTest extends ServiceTest { @@ -35,16 +34,13 @@ class HeartServiceTest extends ServiceTest { private HeartService heartService; @Mock - private CakeReader cakeReader; + private CakeReadFacade cakeReadFacade; @Mock - private CakeShopReader cakeShopReader; + private CakeShopReadFacade cakeShopReadFacade; @Mock - private CakeHeartReader cakeHeartReader; - - @Mock - private CakeShopHeartReader cakeShopHeartReader; + private CakeShopUserReadFacade cakeShopUserReadFacade; @Mock private UserHeartFacade userHeartFacade; @@ -63,7 +59,7 @@ void findCakeImagesByCursorAndHeart() { .sampleList(5); doReturn(cakeImages) - .when(cakeHeartReader) + .when(cakeShopUserReadFacade) .searchCakeImagesByCursorAndHeart(dto.cakeHeartId(), user.getId(), dto.pageSize()); // when @@ -73,7 +69,7 @@ void findCakeImagesByCursorAndHeart() { Assertions.assertEquals(cakeImages, result.cakeImages()); Assertions.assertNotNull(result.lastCakeHeartId()); - verify(cakeHeartReader, times(1)) + verify(cakeShopUserReadFacade, times(1)) .searchCakeImagesByCursorAndHeart(dto.cakeHeartId(), user.getId(), dto.pageSize()); } @@ -90,7 +86,7 @@ void findCakeImagesByCursorAndHeart2() { .sampleList(5); doReturn(cakeImages) - .when(cakeHeartReader) + .when(cakeShopUserReadFacade) .searchCakeImagesByCursorAndHeart(dto.cakeHeartId(), user.getId(), dto.pageSize()); // when @@ -100,7 +96,7 @@ void findCakeImagesByCursorAndHeart2() { Assertions.assertEquals(cakeImages, result.cakeImages()); Assertions.assertNotNull(result.lastCakeHeartId()); - verify(cakeHeartReader, times(1)) + verify(cakeShopUserReadFacade, times(1)) .searchCakeImagesByCursorAndHeart(dto.cakeHeartId(), user.getId(), dto.pageSize()); } @@ -110,7 +106,7 @@ void findCakeImagesByCursorAndHeart3() { final User user = getUser(); doReturn(List.of()) - .when(cakeHeartReader) + .when(cakeShopUserReadFacade) .searchCakeImagesByCursorAndHeart(dto.cakeHeartId(), user.getId(), dto.pageSize()); // when @@ -120,7 +116,7 @@ void findCakeImagesByCursorAndHeart3() { Assertions.assertEquals(0, result.cakeImages().size()); Assertions.assertNull(result.lastCakeHeartId()); - verify(cakeHeartReader, times(1)) + verify(cakeShopUserReadFacade, times(1)) .searchCakeImagesByCursorAndHeart(dto.cakeHeartId(), user.getId(), dto.pageSize()); } @@ -131,13 +127,13 @@ void heartCake1() { final Long cakeId = 1L; final Cake cake = getConstructorMonkey().giveMeOne(Cake.class); - doReturn(cake).when(cakeReader).findByIdWithHeart(cakeId); + doReturn(cake).when(cakeReadFacade).findByIdWithHeart(cakeId); doNothing().when(userHeartFacade).heartCake(user, cake); // when & then assertDoesNotThrow(() -> heartService.heartCake(user, cakeId)); - verify(cakeReader, times(1)).findByIdWithHeart(cakeId); + verify(cakeReadFacade, times(1)).findByIdWithHeart(cakeId); verify(userHeartFacade, times(1)).heartCake(user, cake); } @@ -149,13 +145,13 @@ void heartCake2() { final Cake cake = getConstructorMonkey().giveMeOne(Cake.class); cake.heart(user); - doReturn(cake).when(cakeReader).findByIdWithHeart(cakeId); + doReturn(cake).when(cakeReadFacade).findByIdWithHeart(cakeId); doNothing().when(userHeartFacade).heartCake(user, cake); // when & then assertDoesNotThrow(() -> heartService.heartCake(user, cakeId)); - verify(cakeReader, times(1)).findByIdWithHeart(cakeId); + verify(cakeReadFacade, times(1)).findByIdWithHeart(cakeId); verify(userHeartFacade, times(1)).heartCake(user, cake); } @@ -165,7 +161,7 @@ void heartCake3() { final User user = getUser(); final Long cakeId = 1L; - doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE)).when(cakeReader).findByIdWithHeart(cakeId); + doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE)).when(cakeReadFacade).findByIdWithHeart(cakeId); // when & then assertThrows( @@ -173,7 +169,7 @@ void heartCake3() { () -> heartService.heartCake(user, cakeId), ReturnCode.NOT_EXIST_CAKE.getMessage()); - verify(cakeReader, times(1)).findByIdWithHeart(cakeId); + verify(cakeReadFacade, times(1)).findByIdWithHeart(cakeId); } @TestWithDisplayName("케이크 샵에 대하여 하트를 동작한다.") @@ -188,13 +184,13 @@ void heartCakeShop1() { .set("location", supplyPointBy(Arbitraries.doubles().sample(), Arbitraries.doubles().sample())) .sample(); - doReturn(cakeShop).when(cakeShopReader).findByIdWithHeart(cakeShopId); + doReturn(cakeShop).when(cakeShopReadFacade).findByIdWithHeart(cakeShopId); doNothing().when(userHeartFacade).heartCakeShop(user, cakeShop); // when & then assertDoesNotThrow(() -> heartService.heartCakeShop(user, cakeShopId)); - verify(cakeShopReader, times(1)).findByIdWithHeart(cakeShopId); + verify(cakeShopReadFacade, times(1)).findByIdWithHeart(cakeShopId); verify(userHeartFacade, times(1)).heartCakeShop(user, cakeShop); } @@ -204,7 +200,7 @@ void heartCakeShop3() { final User user = getUser(); final Long cakeShopId = 1L; - doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)).when(cakeShopReader).findByIdWithHeart(cakeShopId); + doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)).when(cakeShopReadFacade).findByIdWithHeart(cakeShopId); // when & then assertThrows( @@ -212,6 +208,6 @@ void heartCakeShop3() { () -> heartService.heartCakeShop(user, cakeShopId), ReturnCode.NOT_EXIST_CAKE_SHOP.getMessage()); - verify(cakeShopReader, times(1)).findByIdWithHeart(cakeShopId); + verify(cakeShopReadFacade, times(1)).findByIdWithHeart(cakeShopId); } } diff --git a/cakk-api/src/test/java/com/cakk/api/service/like/LikeConcurrencyTest.java b/cakk-api/src/test/java/com/cakk/api/service/like/LikeConcurrencyTest.java index 41bf975a..eaa12ca2 100644 --- a/cakk-api/src/test/java/com/cakk/api/service/like/LikeConcurrencyTest.java +++ b/cakk-api/src/test/java/com/cakk/api/service/like/LikeConcurrencyTest.java @@ -14,10 +14,10 @@ import org.springframework.test.context.jdbc.SqlGroup; import com.cakk.api.common.annotation.TestWithDisplayName; +import com.cakk.core.facade.cake.CakeShopReadFacade; +import com.cakk.core.facade.user.UserReadFacade; import com.cakk.domain.mysql.entity.shop.CakeShop; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.CakeShopReader; -import com.cakk.domain.mysql.repository.reader.UserReader; @SpringBootTest(properties = "spring.profiles.active=test") @SqlGroup({ @@ -32,16 +32,16 @@ public class LikeConcurrencyTest { private LikeService likeService; @Autowired - private CakeShopReader cakeShopReader; + private CakeShopReadFacade cakeShopReadFacade; @Autowired - private UserReader userReader; + private UserReadFacade userReadFacade; private User user; @BeforeEach void initUser() { - user = userReader.findByUserId(1L); + user = userReadFacade.findByUserId(1L); } @TestWithDisplayName("케이크샵 좋아요 동작 시, 동시성 문제가 발생하지 않는다.") @@ -67,7 +67,7 @@ void executeLikeCakeShopWithLock() throws InterruptedException { latch.await(); // then - final CakeShop cakeShop = cakeShopReader.findById(cakeShopId); + final CakeShop cakeShop = cakeShopReadFacade.findById(cakeShopId); assertEquals(50, cakeShop.getLikeCount().intValue()); } } diff --git a/cakk-api/src/test/java/com/cakk/api/service/like/LikeServiceTest.java b/cakk-api/src/test/java/com/cakk/api/service/like/LikeServiceTest.java index 281865bf..044ac8e7 100644 --- a/cakk-api/src/test/java/com/cakk/api/service/like/LikeServiceTest.java +++ b/cakk-api/src/test/java/com/cakk/api/service/like/LikeServiceTest.java @@ -11,10 +11,10 @@ import com.cakk.api.common.annotation.TestWithDisplayName; import com.cakk.api.common.base.ServiceTest; +import com.cakk.core.facade.cake.CakeShopReadFacade; import com.cakk.core.facade.user.UserLikeFacade; import com.cakk.domain.mysql.entity.shop.CakeShop; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.CakeShopReader; @DisplayName("좋아요 기능 관련 비즈니스 로직 테스트") public class LikeServiceTest extends ServiceTest { @@ -22,7 +22,7 @@ public class LikeServiceTest extends ServiceTest { private LikeService likeService; @Mock - private CakeShopReader cakeShopReader; + private CakeShopReadFacade cakeShopReadFacade; @Mock private UserLikeFacade userLikeFacade; @@ -39,7 +39,7 @@ void likeCakeShop() { .set("location", supplyPointBy(Arbitraries.doubles().sample(), Arbitraries.doubles().sample())) .sample(); - doReturn(cakeShop).when(cakeShopReader).findByIdWithLike(cakeShopId); + doReturn(cakeShop).when(cakeShopReadFacade).findByIdWithLike(cakeShopId); doNothing().when(userLikeFacade).likeCakeShop(user, cakeShop); // when diff --git a/cakk-api/src/test/java/com/cakk/api/service/shop/ShopServiceTest.java b/cakk-api/src/test/java/com/cakk/api/service/shop/ShopServiceTest.java index bbeb02ce..69196267 100644 --- a/cakk-api/src/test/java/com/cakk/api/service/shop/ShopServiceTest.java +++ b/cakk-api/src/test/java/com/cakk/api/service/shop/ShopServiceTest.java @@ -31,18 +31,19 @@ import com.cakk.common.enums.ReturnCode; import com.cakk.common.enums.VerificationStatus; import com.cakk.common.exception.CakkException; +import com.cakk.core.facade.cake.CakeShopReadFacade; import com.cakk.core.facade.shop.CakeShopManageFacade; +import com.cakk.core.facade.user.UserReadFacade; import com.cakk.domain.mysql.bo.user.VerificationPolicy; import com.cakk.domain.mysql.dto.param.shop.CakeShopDetailParam; import com.cakk.domain.mysql.dto.param.shop.CakeShopInfoParam; import com.cakk.domain.mysql.dto.param.shop.CakeShopSimpleParam; +import com.cakk.domain.mysql.dto.param.shop.CakeShopUpdateParam; import com.cakk.domain.mysql.dto.param.user.CertificationParam; import com.cakk.domain.mysql.entity.shop.CakeShop; import com.cakk.domain.mysql.entity.user.BusinessInformation; import com.cakk.domain.mysql.entity.user.User; import com.cakk.domain.mysql.event.shop.CertificationEvent; -import com.cakk.domain.mysql.repository.reader.CakeShopReader; -import com.cakk.domain.mysql.repository.reader.UserReader; import com.cakk.domain.redis.repository.CakeShopViewsRedisRepository; @DisplayName("케이크 샵 조회 관련 비즈니스 로직 테스트") @@ -52,10 +53,10 @@ public class ShopServiceTest extends ServiceTest { private ShopService shopService; @Mock - private UserReader userReader; + private UserReadFacade userReadFacade; @Mock - private CakeShopReader cakeShopReader; + private CakeShopReadFacade cakeShopReadFacade; @Mock private CakeShopManageFacade cakeShopManageFacade; @@ -130,7 +131,7 @@ void searchSimpleById1() { .set("cakeShopBio", Arbitraries.strings().alpha().ofMinLength(1).ofMaxLength(40)) .sample(); - doReturn(response).when(cakeShopReader).searchSimpleById(cakeShopId); + doReturn(response).when(cakeShopReadFacade).searchSimpleById(cakeShopId); // when CakeShopSimpleResponse result = shopService.searchSimpleById(cakeShopId); @@ -138,7 +139,7 @@ void searchSimpleById1() { // then assertEquals(ShopMapper.cakeShopSimpleResponseFromParam(response), result); - verify(cakeShopReader, times(1)).searchSimpleById(cakeShopId); + verify(cakeShopReadFacade, times(1)).searchSimpleById(cakeShopId); } @TestWithDisplayName("id에 해당하는 케이크 샵이 없으면 간단조회 시, 에러를 반환한다.") @@ -146,7 +147,7 @@ void searchSimpleById2() { // given Long cakeShopId = 1L; - doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)).when(cakeShopReader).searchSimpleById(cakeShopId); + doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)).when(cakeShopReadFacade).searchSimpleById(cakeShopId); // then assertThatThrownBy( @@ -154,7 +155,7 @@ void searchSimpleById2() { .isInstanceOf(CakkException.class) .hasMessageContaining(ReturnCode.NOT_EXIST_CAKE_SHOP.getMessage()); - verify(cakeShopReader, times(1)).searchSimpleById(cakeShopId); + verify(cakeShopReadFacade, times(1)).searchSimpleById(cakeShopId); } @TestWithDisplayName("id로 케이크 샵을 상세조회 한다.") @@ -171,7 +172,7 @@ void searchDetailById1() { .set("links", Set.of()) .sample(); - doReturn(param).when(cakeShopReader).searchDetailById(cakeShopId); + doReturn(param).when(cakeShopReadFacade).searchDetailById(cakeShopId); // when CakeShopDetailResponse result = shopService.searchDetailById(cakeShopId); @@ -179,7 +180,7 @@ void searchDetailById1() { // then assertEquals(ShopMapper.cakeShopDetailResponseFromParam(param), result); - verify(cakeShopReader, times(1)).searchDetailById(cakeShopId); + verify(cakeShopReadFacade, times(1)).searchDetailById(cakeShopId); } @TestWithDisplayName("id에 해당하는 케이크 샵이 없으면 상세조회 시, 에러를 반환한다.") @@ -187,7 +188,7 @@ void searchDetailById2() { // given Long cakeShopId = 1L; - doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)).when(cakeShopReader).searchDetailById(cakeShopId); + doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)).when(cakeShopReadFacade).searchDetailById(cakeShopId); // then assertThatThrownBy( @@ -195,7 +196,7 @@ void searchDetailById2() { .isInstanceOf(CakkException.class) .hasMessageContaining(ReturnCode.NOT_EXIST_CAKE_SHOP.getMessage()); - verify(cakeShopReader, times(1)).searchDetailById(cakeShopId); + verify(cakeShopReadFacade, times(1)).searchDetailById(cakeShopId); } @TestWithDisplayName("Admin에 의해 케이크 샵을 생성하는데 성공한다") @@ -221,22 +222,23 @@ void promoteUser() { PromotionRequest request = getPromotionRequestFixture(); BusinessInformation businessInformation = getBusinessInformationFixture(); - doReturn(getConstructorMonkey().giveMeOne(User.class)).when(userReader).findByUserId(request.userId()); - doReturn(businessInformation).when(cakeShopReader).findBusinessInformationWithShop(request.cakeShopId()); + doReturn(getConstructorMonkey().giveMeOne(User.class)).when(userReadFacade).findByUserId(request.userId()); + doReturn(businessInformation).when(cakeShopReadFacade).findBusinessInformationWithShop(request.cakeShopId()); //when,then shopService.promoteUserToBusinessOwner(request); //verify - verify(userReader, times(1)).findByUserId(request.userId()); - verify(cakeShopReader, times(1)).findBusinessInformationWithShop(request.cakeShopId()); + verify(userReadFacade, times(1)).findByUserId(request.userId()); + verify(cakeShopReadFacade, times(1)).findBusinessInformationWithShop(request.cakeShopId()); } @TestWithDisplayName("cakeShopId가 존재한다면, 정보를 찾아서 이벤트를 발행한다") void requestCertificationEventWithInfo() { //given CertificationParam param = getCertificationParamFixture(false); - doReturn(getBusinessInformationFixture()).when(cakeShopReader).findBusinessInformationByCakeShopId(param.cakeShopId()); + doReturn(getBusinessInformationFixture()).when(cakeShopReadFacade).findBusinessInformationByCakeShopId( + param.cakeShopId()); when(verificationPolicy.requestCertificationBusinessOwner(any(BusinessInformation.class), any(CertificationParam.class))) .thenReturn(getCertificationEventFixture()); @@ -244,7 +246,7 @@ void requestCertificationEventWithInfo() { shopService.requestCertificationBusinessOwner(param); //verify - verify(cakeShopReader, times(1)).findBusinessInformationByCakeShopId(param.cakeShopId()); + verify(cakeShopReadFacade, times(1)).findBusinessInformationByCakeShopId(param.cakeShopId()); verify(publisher, times(1)).publishEvent(any(CertificationEvent.class)); } @@ -263,7 +265,7 @@ void searchInfoById1() { .set("operationDays", List.of()) .sample(); - doReturn(param).when(cakeShopReader).searchInfoById(cakeShopId); + doReturn(param).when(cakeShopReadFacade).searchInfoById(cakeShopId); // when CakeShopInfoResponse result = shopService.searchInfoById(cakeShopId); @@ -271,7 +273,7 @@ void searchInfoById1() { // then assertEquals(ShopMapper.supplyCakeShopInfoResponseBy(param), result); - verify(cakeShopReader, times(1)).searchInfoById(cakeShopId); + verify(cakeShopReadFacade, times(1)).searchInfoById(cakeShopId); } @TestWithDisplayName("id에 해당하는 케이크 샵이 없으면 상세조회 시, 에러를 반환한다.") @@ -279,7 +281,7 @@ void searchInfoById2() { // given Long cakeShopId = 1L; - doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)).when(cakeShopReader).searchInfoById(cakeShopId); + doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)).when(cakeShopReadFacade).searchInfoById(cakeShopId); // then assertThatThrownBy( @@ -287,7 +289,7 @@ void searchInfoById2() { .isInstanceOf(CakkException.class) .hasMessageContaining(ReturnCode.NOT_EXIST_CAKE_SHOP.getMessage()); - verify(cakeShopReader, times(1)).searchInfoById(cakeShopId); + verify(cakeShopReadFacade, times(1)).searchInfoById(cakeShopId); } @TestWithDisplayName("인기 케이크 샵 목록을 조회한다.") @@ -305,7 +307,7 @@ void searchCakeShopsByCursorAndViews1() { .sampleList(3); doReturn(cakeShopIds).when(cakeShopViewsRedisRepository).findTopShopIdsByOffsetAndCount(offset, pageSize); - doReturn(cakeShops).when(cakeShopReader).searchShopsByShopIds(cakeShopIds); + doReturn(cakeShops).when(cakeShopReadFacade).searchShopsByShopIds(cakeShopIds); // when final CakeShopSearchResponse result = shopService.searchCakeShopsByCursorAndViews(dto); @@ -315,7 +317,7 @@ void searchCakeShopsByCursorAndViews1() { assertEquals(cakeShops.size(), result.size()); verify(cakeShopViewsRedisRepository, times(1)).findTopShopIdsByOffsetAndCount(offset, pageSize); - verify(cakeShopReader, times(1)).searchShopsByShopIds(cakeShopIds); + verify(cakeShopReadFacade, times(1)).searchShopsByShopIds(cakeShopIds); } @TestWithDisplayName("인기 케이크 샵 목록이 없는 경우, 빈 배열을 조회한다.") @@ -336,6 +338,26 @@ void searchCakeShopsByCursorAndViews2() { assertThat(result.cakeShops()).isEmpty(); verify(cakeShopViewsRedisRepository, times(1)).findTopShopIdsByOffsetAndCount(offset, pageSize); - verify(cakeShopReader, times(0)).searchShopsByShopIds(cakeShopIds); + verify(cakeShopReadFacade, times(0)).searchShopsByShopIds(cakeShopIds); + } + + @TestWithDisplayName("케이크샵 기본 정보 수정을 한다") + void updateCakeShopBasicInformation() { + //given + CakeShopUpdateParam cakeShopUpdateParam = getConstructorMonkey().giveMeBuilder(CakeShopUpdateParam.class) + .set("cakeShopId", Arbitraries.longs().greaterOrEqual(1)) + .set("user", getUser()) + .sample(); + CakeShop cakeShopFixture = getCakeShopFixture(); + + doReturn(cakeShopFixture) + .when(cakeShopReadFacade).searchByIdAndOwner(cakeShopUpdateParam.cakeShopId(), cakeShopUpdateParam.user()); + + //when, then + shopService.updateBasicInformation(cakeShopUpdateParam); + + //verify + verify(cakeShopReadFacade, times(1)) + .searchByIdAndOwner(cakeShopUpdateParam.cakeShopId(), cakeShopUpdateParam.user()); } } diff --git a/cakk-api/src/test/java/com/cakk/api/service/user/SignServiceTest.java b/cakk-api/src/test/java/com/cakk/api/service/user/SignServiceTest.java index e7fc503b..9c7f329c 100644 --- a/cakk-api/src/test/java/com/cakk/api/service/user/SignServiceTest.java +++ b/cakk-api/src/test/java/com/cakk/api/service/user/SignServiceTest.java @@ -22,8 +22,8 @@ import com.cakk.common.enums.ReturnCode; import com.cakk.common.exception.CakkException; import com.cakk.core.facade.user.UserManageFacade; +import com.cakk.core.facade.user.UserReadFacade; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.UserReader; import com.cakk.domain.redis.repository.TokenRedisRepository; @DisplayName("Sign 관련 비즈니스 로직 테스트") @@ -39,7 +39,7 @@ class SignServiceTest extends ServiceTest { private JwtProvider jwtProvider; @Mock - private UserReader userReader; + private UserReadFacade userReadFacade; @Mock private UserManageFacade userManagerFacade; @@ -119,7 +119,7 @@ void signIn() { .sample(); doReturn(providerId).when(oidcProviderFactory).getProviderId(dto.provider(), dto.idToken()); - doReturn(user).when(userReader).findByProviderId(providerId); + doReturn(user).when(userReadFacade).findByProviderId(providerId); doReturn(jwt).when(jwtProvider).generateToken(user); // when @@ -131,7 +131,7 @@ void signIn() { Assertions.assertNotNull(result.grantType()); verify(oidcProviderFactory, times(1)).getProviderId(dto.provider(), dto.idToken()); - verify(userReader, times(1)).findByProviderId(providerId); + verify(userReadFacade, times(1)).findByProviderId(providerId); verify(jwtProvider, times(1)).generateToken(user); } @@ -147,7 +147,7 @@ void signIn2() { .sample(); doReturn(providerId).when(oidcProviderFactory).getProviderId(dto.provider(), dto.idToken()); - doThrow(new CakkException(ReturnCode.NOT_EXIST_USER)).when(userReader).findByProviderId(providerId); + doThrow(new CakkException(ReturnCode.NOT_EXIST_USER)).when(userReadFacade).findByProviderId(providerId); // when Assertions.assertThrows( @@ -156,7 +156,7 @@ void signIn2() { ReturnCode.NOT_EXIST_USER.getMessage()); verify(oidcProviderFactory, times(1)).getProviderId(dto.provider(), dto.idToken()); - verify(userReader, times(1)).findByProviderId(providerId); + verify(userReadFacade, times(1)).findByProviderId(providerId); verify(jwtProvider, times(0)).generateToken(user); } diff --git a/cakk-api/src/test/java/com/cakk/api/service/user/UserServiceTest.java b/cakk-api/src/test/java/com/cakk/api/service/user/UserServiceTest.java index 50b41651..4a7777db 100644 --- a/cakk-api/src/test/java/com/cakk/api/service/user/UserServiceTest.java +++ b/cakk-api/src/test/java/com/cakk/api/service/user/UserServiceTest.java @@ -17,8 +17,8 @@ import com.cakk.common.enums.ReturnCode; import com.cakk.common.exception.CakkException; import com.cakk.core.facade.user.UserManageFacade; +import com.cakk.core.facade.user.UserReadFacade; import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.reader.UserReader; @DisplayName("유저 관련 비즈니스 로직 테스트") class UserServiceTest extends ServiceTest { @@ -27,7 +27,7 @@ class UserServiceTest extends ServiceTest { private UserService userService; @Mock - private UserReader userReader; + private UserReadFacade userReadFacade; @Mock private UserManageFacade userManagerFacade; @@ -35,13 +35,9 @@ class UserServiceTest extends ServiceTest { @TestWithDisplayName("유저 프로필을 조회한다.") void findProfile1() { // given - final User user = getConstructorMonkey().giveMeBuilder(User.class) - .set("id", Arbitraries.longs().greaterOrEqual(10)) - .set("provider", Arbitraries.of(Provider.class)) - .set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) - .sample(); + final User user = getUser(); - doReturn(user).when(userReader).findByUserId(user.getId()); + doReturn(user).when(userReadFacade).findByUserId(user.getId()); // when final ProfileInformationResponse response = userService.findProfile(user); @@ -49,7 +45,7 @@ void findProfile1() { // then Assertions.assertNotNull(response); - verify(userReader, times(1)).findByUserId(user.getId()); + verify(userReadFacade, times(1)).findByUserId(user.getId()); } @TestWithDisplayName("유저가 존재하지 않으면 유저 프로필 조회에 실패한다.") @@ -61,14 +57,14 @@ void findProfile2() { .set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) .sample(); - doThrow(new CakkException(ReturnCode.NOT_EXIST_USER)).when(userReader).findByUserId(user.getId()); + doThrow(new CakkException(ReturnCode.NOT_EXIST_USER)).when(userReadFacade).findByUserId(user.getId()); // when Assertions.assertThrows(CakkException.class, () -> userService.findProfile(user), ReturnCode.NOT_EXIST_USER.getMessage()); - verify(userReader, times(1)).findByUserId(user.getId()); + verify(userReadFacade, times(1)).findByUserId(user.getId()); } @TestWithDisplayName("유저 프로필을 수정한다.") @@ -81,12 +77,12 @@ void updateInformation() { .sample(); final ProfileUpdateRequest request = getConstructorMonkey().giveMeOne(ProfileUpdateRequest.class); - doReturn(user).when(userReader).findByUserId(user.getId()); + doReturn(user).when(userReadFacade).findByUserId(user.getId()); // when & then Assertions.assertDoesNotThrow(() -> userService.updateInformation(user, request)); - verify(userReader, times(1)).findByUserId(user.getId()); + verify(userReadFacade, times(1)).findByUserId(user.getId()); } @TestWithDisplayName("유저를 탈퇴한다.") @@ -94,12 +90,12 @@ void withdraw1() { // given final User user = getUser(); - doReturn(user).when(userReader).findByIdWithAll(user.getId()); + doReturn(user).when(userReadFacade).findByIdWithAll(user.getId()); // when & then Assertions.assertDoesNotThrow(() -> userService.withdraw(user)); - verify(userReader, times(1)).findByIdWithAll(user.getId()); + verify(userReadFacade, times(1)).findByIdWithAll(user.getId()); verify(userManagerFacade, times(1)).withdraw(any(), any()); } @@ -108,14 +104,14 @@ void withdraw2() { // given final User user = getUser(); - doThrow(new CakkException(ReturnCode.NOT_EXIST_USER)).when(userReader).findByIdWithAll(user.getId()); + doThrow(new CakkException(ReturnCode.NOT_EXIST_USER)).when(userReadFacade).findByIdWithAll(user.getId()); // when & then Assertions.assertThrows(CakkException.class, () -> userService.withdraw(user), ReturnCode.NOT_EXIST_USER.getMessage()); - verify(userReader, times(1)).findByIdWithAll(user.getId()); + verify(userReadFacade, times(1)).findByIdWithAll(user.getId()); verify(userManagerFacade, never()).withdraw(any(), any()); } } diff --git a/cakk-common/src/main/java/com/cakk/common/enums/VerificationStatus.kt b/cakk-common/src/main/java/com/cakk/common/enums/VerificationStatus.kt index 68a8947c..1bf31317 100644 --- a/cakk-common/src/main/java/com/cakk/common/enums/VerificationStatus.kt +++ b/cakk-common/src/main/java/com/cakk/common/enums/VerificationStatus.kt @@ -1,29 +1,29 @@ package com.cakk.common.enums enum class VerificationStatus(@JvmField val code: Int) { - UNREQUESTED(0), - APPROVED(1), - REJECTED(2), - PENDING(3); + UNREQUESTED(0), + APPROVED(1), + REJECTED(2), + PENDING(3); - val isCandidate: Boolean - get() = code == 3 + val isCandidate: Boolean + get() = code == 3 - val isNotCandidate: Boolean - get() = code != 3 + val isNotCandidate: Boolean + get() = code != 3 - val isApproved: Boolean - get() = code == 1 + val isApproved: Boolean + get() = code == 1 - val isRejected: Boolean - get() = code == 2 + val isRejected: Boolean + get() = code == 2 - fun makeApproved(): VerificationStatus { - return APPROVED - } + fun makeApproved(): VerificationStatus { + return APPROVED + } - fun makePending(): VerificationStatus { - return PENDING - } + fun makePending(): VerificationStatus { + return PENDING + } } diff --git a/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/BusinessInformationReadFacade.kt b/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/BusinessInformationReadFacade.kt new file mode 100644 index 00000000..86d3c061 --- /dev/null +++ b/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/BusinessInformationReadFacade.kt @@ -0,0 +1,32 @@ +package com.cakk.core.facade.cake + +import com.cakk.common.enums.ReturnCode +import com.cakk.common.enums.VerificationStatus +import com.cakk.common.exception.CakkException +import com.cakk.core.annotation.DomainFacade +import com.cakk.domain.mysql.entity.user.BusinessInformation +import com.cakk.domain.mysql.entity.user.User +import com.cakk.domain.mysql.repository.jpa.BusinessInformationJpaRepository + +@DomainFacade +class BusinessInformationReadFacade( + private val businessInformationJpaRepository: BusinessInformationJpaRepository +) { + + fun isExistBusinessInformation(owner: User, cakeShopId: Long): Boolean { + return businessInformationJpaRepository.existsBusinessInformationByUserAndCakeShop_Id(owner, cakeShopId) + } + + fun findAllWithCakeShopByUser(owner: User): List { + return businessInformationJpaRepository.findAllWithCakeShopByUser(owner) + } + + fun findAllCakeShopBusinessOwnerCandidates(): List { + return businessInformationJpaRepository.findAllCakeShopBusinessOwnerCandidates(VerificationStatus.PENDING) + } + + fun findByUserId(userId: Long): BusinessInformation { + return businessInformationJpaRepository.findBusinessInformationByUserId(userId) ?: throw CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP) + } +} + diff --git a/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/CakeReadFacade.kt b/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/CakeReadFacade.kt new file mode 100644 index 00000000..2b2f8a09 --- /dev/null +++ b/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/CakeReadFacade.kt @@ -0,0 +1,83 @@ +package com.cakk.core.facade.cake + +import com.cakk.common.enums.CakeDesignCategory +import com.cakk.common.enums.ReturnCode +import com.cakk.common.exception.CakkException +import com.cakk.core.annotation.DomainFacade +import com.cakk.domain.mysql.dto.param.cake.CakeDetailParam +import com.cakk.domain.mysql.dto.param.cake.CakeImageResponseParam +import com.cakk.domain.mysql.dto.param.cake.CakeSearchParam +import com.cakk.domain.mysql.entity.cake.Cake +import com.cakk.domain.mysql.entity.cake.CakeCategory +import com.cakk.domain.mysql.entity.user.User +import com.cakk.domain.mysql.repository.jpa.CakeCategoryJpaRepository +import com.cakk.domain.mysql.repository.jpa.CakeJpaRepository +import com.cakk.domain.mysql.repository.query.CakeQueryRepository +import java.util.* + +@DomainFacade +class CakeReadFacade( + private val cakeJpaRepository: CakeJpaRepository, + private val cakeCategoryJpaRepository: CakeCategoryJpaRepository, + private val cakeQueryRepository: CakeQueryRepository +) { + + fun findById(cakeId: Long): Cake { + return cakeJpaRepository.findById(cakeId).orElseThrow { CakkException(ReturnCode.NOT_EXIST_CAKE) } + } + + fun findByIdWithHeart(cakeId: Long?): Cake { + val cake: Cake = cakeQueryRepository.searchByIdWithHeart(cakeId) + if (Objects.isNull(cake)) { + throw CakkException(ReturnCode.NOT_EXIST_CAKE) + } + return cake + } + + fun searchCakeImagesByCursorAndCategory( + cakeId: Long?, + category: CakeDesignCategory, + pageSize: Int + ): List { + return cakeQueryRepository.searchCakeImagesByCursorAndCategory(cakeId, category, pageSize) + } + + fun searchCakeImagesByCursorAndCakeShopId( + cakeId: Long?, + cakeShopId: Long?, + pageSize: Int + ): List { + return cakeQueryRepository.searchCakeImagesByCursorAndCakeShopId(cakeId, cakeShopId, pageSize) + } + + fun searchCakeImagesByCursorAndSearchKeyword(param: CakeSearchParam): List { + return cakeQueryRepository.searchCakeImagesByCursorAndSearchKeyword( + param.cakeId, + param.keyword, + param.location, + param.pageSize + ) + } + + fun searchCakeImagesByCakeIds(cakeIds: List?): List { + return cakeQueryRepository.searchCakeImagesByCakeIds(cakeIds) + } + + fun findWithCakeTagsAndCakeCategories(cakeId: Long?, owner: User?): Cake { + return cakeQueryRepository.searchWithCakeTagsAndCakeCategories(cakeId, owner) + .orElseThrow { CakkException(ReturnCode.NOT_CAKE_SHOP_OWNER) } + } + + fun searchCakeDetailById(cakeId: Long?): CakeDetailParam { + val param: CakeDetailParam = cakeQueryRepository.searchCakeDetailById(cakeId) + if (Objects.isNull(param)) { + throw CakkException(ReturnCode.NOT_EXIST_CAKE) + } + return param + } + + fun findCakeCategoryByCakeId(cakeId: Long?): CakeCategory { + return cakeCategoryJpaRepository.findByCakeId(cakeId) ?: throw CakkException(ReturnCode.NOT_EXIST_CAKE_CATEGORY) + } +} + diff --git a/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/CakeShopReadFacade.kt b/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/CakeShopReadFacade.kt new file mode 100644 index 00000000..847588a8 --- /dev/null +++ b/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/CakeShopReadFacade.kt @@ -0,0 +1,104 @@ +package com.cakk.core.facade.cake + +import com.cakk.common.enums.ReturnCode +import com.cakk.common.exception.CakkException +import com.cakk.core.annotation.DomainFacade +import com.cakk.domain.mysql.bo.shop.CakeShopByLocationParam +import com.cakk.domain.mysql.dto.param.shop.CakeShopDetailParam +import com.cakk.domain.mysql.dto.param.shop.CakeShopInfoParam +import com.cakk.domain.mysql.dto.param.shop.CakeShopSearchParam +import com.cakk.domain.mysql.dto.param.shop.CakeShopSimpleParam +import com.cakk.domain.mysql.entity.shop.CakeShop +import com.cakk.domain.mysql.entity.shop.CakeShopLink +import com.cakk.domain.mysql.entity.shop.CakeShopOperation +import com.cakk.domain.mysql.entity.user.BusinessInformation +import com.cakk.domain.mysql.entity.user.User +import com.cakk.domain.mysql.repository.jpa.BusinessInformationJpaRepository +import com.cakk.domain.mysql.repository.jpa.CakeShopJpaRepository +import com.cakk.domain.mysql.repository.jpa.CakeShopLinkJpaRepository +import com.cakk.domain.mysql.repository.jpa.CakeShopOperationJpaRepository +import com.cakk.domain.mysql.repository.query.CakeShopQueryRepository +import org.locationtech.jts.geom.Point + +@DomainFacade +class CakeShopReadFacade( + private val cakeShopJpaRepository: CakeShopJpaRepository, + private val cakeShopQueryRepository: CakeShopQueryRepository, + private val cakeShopOperationJpaRepository: CakeShopOperationJpaRepository, + private val cakeShopLinkJpaRepository: CakeShopLinkJpaRepository, + private val businessInformationJpaRepository: BusinessInformationJpaRepository +) { + + fun findById(cakeShopId: Long): CakeShop { + return cakeShopJpaRepository.findById(cakeShopId).orElseThrow { CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP) } + } + + fun findByIdWithHeart(cakeShopId: Long): CakeShop { + return cakeShopQueryRepository.searchByIdWithHeart(cakeShopId) ?: throw CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP) + } + + fun findByIdWithLike(cakeShopId: Long?): CakeShop { + return cakeShopQueryRepository.searchByIdWithLike(cakeShopId) ?: throw CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP) + } + + fun searchSimpleById(cakeShopId: Long?): CakeShopSimpleParam { + return cakeShopQueryRepository.searchSimpleById(cakeShopId) ?: throw CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP) + } + + fun searchDetailById(cakeShopId: Long?): CakeShopDetailParam { + return cakeShopQueryRepository.searchDetailById(cakeShopId) ?: throw CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP) + } + + fun searchInfoById(cakeShopId: Long?): CakeShopInfoParam { + return cakeShopQueryRepository.searchInfoById(cakeShopId) ?: throw CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP) + } + + fun findBusinessInformationWithShop(cakeShopId: Long): BusinessInformation { + return businessInformationJpaRepository.findBusinessInformationWithCakeShop(cakeShopId) ?: throw CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP) + } + + fun findBusinessInformationByCakeShopId(cakeShopId: Long): BusinessInformation { + return businessInformationJpaRepository.findBusinessInformationWithCakeShop(cakeShopId) ?: throw CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP) + } + + fun searchShopByLocationBased(point: Point?, distance: Double?): List { + return cakeShopQueryRepository.findShopsByLocationBased(point, distance) + } + + fun searchShopBySearch(param: CakeShopSearchParam): List { + return cakeShopQueryRepository.searchByKeywordWithLocation( + param.cakeShopId, + param.keyword, + param.location, + param.pageSize + ) + } + + fun searchWithShopLinks(owner: User?, cakeShopId: Long?): CakeShop { + return cakeShopQueryRepository.searchWithShopLinks(owner, cakeShopId) + .orElseThrow { CakkException(ReturnCode.NOT_CAKE_SHOP_OWNER) } + } + + fun searchByIdAndOwner(cakeShopId: Long?, owner: User?): CakeShop { + return cakeShopQueryRepository.searchWithBusinessInformationAndOwnerById(owner, cakeShopId) + .orElseThrow { CakkException(ReturnCode.NOT_CAKE_SHOP_OWNER) } + } + + fun searchWithOperations(owner: User?, cakeShopId: Long?): CakeShop { + return cakeShopQueryRepository.searchWithOperations(owner, cakeShopId) + .orElseThrow { CakkException(ReturnCode.NOT_CAKE_SHOP_OWNER) } + } + + fun searchShopsByShopIds(shopIds: List?): List { + return cakeShopQueryRepository.searchByShopIds(shopIds) + } + + fun findCakeShopOperationsByCakeShopId(cakeShopId: Long): List { + return cakeShopOperationJpaRepository.findAllByCakeShopId(cakeShopId) + } + + fun findCakeShopLinksByCakeShopId(cakeShopId: Long): List { + return cakeShopLinkJpaRepository.findAllByCakeShopId(cakeShopId) + } +} + diff --git a/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/CakeShopUserReadFacade.kt b/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/CakeShopUserReadFacade.kt new file mode 100644 index 00000000..1fdaf4f6 --- /dev/null +++ b/cakk-core/src/main/kotlin/com/cakk/core/facade/cake/CakeShopUserReadFacade.kt @@ -0,0 +1,32 @@ +package com.cakk.core.facade.cake + +import com.cakk.core.annotation.DomainFacade +import com.cakk.domain.mysql.dto.param.like.HeartCakeImageResponseParam +import com.cakk.domain.mysql.dto.param.like.HeartCakeShopResponseParam +import com.cakk.domain.mysql.repository.query.CakeHeartQueryRepository +import com.cakk.domain.mysql.repository.query.CakeShopHeartQueryRepository + +@DomainFacade +class CakeShopUserReadFacade( + private val cakeShopHeartQueryRepository: CakeShopHeartQueryRepository, + private val cakeHeartQueryRepository: CakeHeartQueryRepository +) { + + fun searchAllCakeShopsByCursorAndHeart( + cakeShopHeartId: Long?, + userId: Long?, + pageSize: Int + ): List { + val cakeShopHeartIds: List = cakeShopHeartQueryRepository.searchIdsByCursorAndHeart(cakeShopHeartId, userId, pageSize) + return cakeShopHeartQueryRepository.searchAllByCursorAndHeart(cakeShopHeartIds) + } + + fun searchCakeImagesByCursorAndHeart( + cakeHeartId: Long?, + userId: Long?, + pageSize: Int + ): List { + return cakeHeartQueryRepository.searchCakeImagesByCursorAndHeart(cakeHeartId, userId, pageSize) + } +} + diff --git a/cakk-core/src/main/kotlin/com/cakk/core/facade/tag/TagManageFacade.kt b/cakk-core/src/main/kotlin/com/cakk/core/facade/tag/TagManageFacade.kt index e9f1981a..89d437fe 100644 --- a/cakk-core/src/main/kotlin/com/cakk/core/facade/tag/TagManageFacade.kt +++ b/cakk-core/src/main/kotlin/com/cakk/core/facade/tag/TagManageFacade.kt @@ -11,9 +11,7 @@ class TagManageFacade( ) { fun create(tagName: String): Tag { - return tagJpaRepository.findTagByTagName(tagName).orElseGet { - tagJpaRepository.save(TagMapper.supplyTagBy(tagName)) - } + return tagJpaRepository.findTagByTagName(tagName) ?: tagJpaRepository.save(TagMapper.supplyTagBy(tagName)) } fun createAll(tagNames: List): List { diff --git a/cakk-core/src/main/kotlin/com/cakk/core/facade/tag/TagReadFacade.kt b/cakk-core/src/main/kotlin/com/cakk/core/facade/tag/TagReadFacade.kt new file mode 100644 index 00000000..4a8aa2ca --- /dev/null +++ b/cakk-core/src/main/kotlin/com/cakk/core/facade/tag/TagReadFacade.kt @@ -0,0 +1,22 @@ +package com.cakk.core.facade.tag + +import com.cakk.core.annotation.DomainFacade +import com.cakk.domain.mysql.entity.cake.Tag +import com.cakk.domain.mysql.mapper.TagMapper +import com.cakk.domain.mysql.repository.jpa.TagJpaRepository + +@DomainFacade +class TagReadFacade( + private val tagJpaRepository: TagJpaRepository +) { + + fun getTagsByTagName(tagNames: List): List { + val tags: List = tagJpaRepository.findTagsByTagNameIsIn(tagNames) + return tagNames.map { + tags.find { + tag: Tag -> tag.tagName == it + } ?: tagJpaRepository.save(TagMapper.supplyTagBy(it)) + }.toList() + } +} + diff --git a/cakk-core/src/main/kotlin/com/cakk/core/facade/user/UserManageFacade.kt b/cakk-core/src/main/kotlin/com/cakk/core/facade/user/UserManageFacade.kt index ecba66cd..1bc05649 100644 --- a/cakk-core/src/main/kotlin/com/cakk/core/facade/user/UserManageFacade.kt +++ b/cakk-core/src/main/kotlin/com/cakk/core/facade/user/UserManageFacade.kt @@ -16,11 +16,9 @@ class UserManageFacade( ) { fun create(user: User): User { - userJpaRepository.findByProviderId(user.providerId).ifPresent { + userJpaRepository.findByProviderId(user.providerId)?.let { throw CakkException(ReturnCode.ALREADY_EXIST_USER) - } - - return userJpaRepository.save(user) + } ?: return userJpaRepository.save(user) } fun updateProfile(user: User, param: ProfileUpdateParam) { diff --git a/cakk-core/src/main/kotlin/com/cakk/core/facade/user/UserReadFacade.kt b/cakk-core/src/main/kotlin/com/cakk/core/facade/user/UserReadFacade.kt new file mode 100644 index 00000000..cdaa3dbf --- /dev/null +++ b/cakk-core/src/main/kotlin/com/cakk/core/facade/user/UserReadFacade.kt @@ -0,0 +1,32 @@ +package com.cakk.core.facade.user + +import com.cakk.common.enums.ReturnCode +import com.cakk.common.exception.CakkException +import com.cakk.core.annotation.DomainFacade +import com.cakk.domain.mysql.entity.user.User +import com.cakk.domain.mysql.repository.jpa.UserJpaRepository +import com.cakk.domain.mysql.repository.query.UserQueryRepository + +@DomainFacade +class UserReadFacade( + private val userJpaRepository: UserJpaRepository, + private val userQueryRepository: UserQueryRepository +) { + + fun findByUserId(userId: Long): User { + return userJpaRepository.findById(userId).orElseThrow { CakkException(ReturnCode.NOT_EXIST_USER) } + } + + fun findByProviderId(providerId: String): User { + return userJpaRepository.findByProviderId(providerId) ?: throw CakkException(ReturnCode.NOT_EXIST_USER) + } + + fun findByIdWithAll(userId: Long): User { + return userQueryRepository.searchByIdWithAll(userId) ?: throw CakkException(ReturnCode.NOT_EXIST_USER) + } + + fun findAll(): List { + return userJpaRepository.findAll() + } +} + diff --git a/cakk-core/src/test/kotlin/com/cakk/core/common/base/FacadeTest.kt b/cakk-core/src/test/kotlin/com/cakk/core/common/base/FacadeTest.kt index 675862d5..4346fc12 100644 --- a/cakk-core/src/test/kotlin/com/cakk/core/common/base/FacadeTest.kt +++ b/cakk-core/src/test/kotlin/com/cakk/core/common/base/FacadeTest.kt @@ -1,11 +1,13 @@ package com.cakk.core.common.base +import com.cakk.common.enums.Gender import com.cakk.common.enums.Provider import com.cakk.common.enums.Role import com.cakk.domain.mysql.entity.cake.Cake import com.cakk.domain.mysql.entity.shop.CakeShop import com.cakk.domain.mysql.entity.user.User import com.navercorp.fixturemonkey.FixtureMonkey +import com.navercorp.fixturemonkey.api.instantiator.Instantiator import com.navercorp.fixturemonkey.api.introspector.BuilderArbitraryIntrospector import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector import com.navercorp.fixturemonkey.api.introspector.FieldReflectionArbitraryIntrospector @@ -46,14 +48,21 @@ abstract class FacadeTest { protected fun getUserFixture(role: Role): User { return getConstructorMonkey().giveMeBuilder(User::class.java) - .set("id", Arbitraries.longs().greaterOrEqual(10)) - .set("provider", Arbitraries.of(Provider::class.java)) - .set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) - .set("email", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) - .set("nickname", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) - .set("birthday", LocalDate.now()) - .set("role", role) - .sample() + .instantiate( + User::class.java, + Instantiator.constructor() + .parameter(Long::class.java) + .parameter(Provider::class.java) + .parameter(String::class.java) + .parameter(String::class.java) + .parameter(String::class.java) + .parameter(String::class.java) + .parameter(Gender::class.java) + .parameter(LocalDate::class.java) + .parameter(String::class.java) + .parameter(String::class.java) + .parameter(role.javaClass) + ).sample() } protected fun getCakeFixture(): Cake { diff --git a/cakk-core/src/test/kotlin/com/cakk/core/facade/UserManageFacadeTest.kt b/cakk-core/src/test/kotlin/com/cakk/core/facade/UserManageFacadeTest.kt index 080945d5..0bd67d9a 100644 --- a/cakk-core/src/test/kotlin/com/cakk/core/facade/UserManageFacadeTest.kt +++ b/cakk-core/src/test/kotlin/com/cakk/core/facade/UserManageFacadeTest.kt @@ -3,7 +3,6 @@ package com.cakk.core.facade import org.mockito.Mockito.* import java.time.LocalDateTime -import java.util.Optional import org.mockito.InjectMocks import org.mockito.Mock @@ -41,7 +40,7 @@ internal class UserManageFacadeTest : FacadeTest() { // given val user = getUserFixture(Role.USER) - doReturn(Optional.ofNullable(null)).`when`(userJpaRepository).findByProviderId(user.providerId) + doReturn(null).`when`(userJpaRepository).findByProviderId(user.providerId) doReturn(user).`when`(userJpaRepository).save(user) // when @@ -57,7 +56,7 @@ internal class UserManageFacadeTest : FacadeTest() { // given val user = getUserFixture(Role.USER) - doReturn(Optional.of(user)).`when`(userJpaRepository).findByProviderId(user.providerId) + doReturn(user).`when`(userJpaRepository).findByProviderId(user.providerId) // when val exception = shouldThrow { diff --git a/cakk-domain/mysql/build.gradle b/cakk-domain/mysql/build.gradle deleted file mode 100644 index 19e40048..00000000 --- a/cakk-domain/mysql/build.gradle +++ /dev/null @@ -1,54 +0,0 @@ -description = "mysql module" - -dependencies { - implementation project(':cakk-common') - - // jpa - api("org.springframework.boot:spring-boot-starter-data-jpa") - implementation 'io.hypersistence:hypersistence-utils-hibernate-63:3.7.4' - - // test - testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.23") - testImplementation('org.assertj:assertj-core') - testImplementation('org.junit.jupiter:junit-jupiter') - testImplementation('org.mockito:mockito-core') - testImplementation('org.mockito:mockito-junit-jupiter') - testRuntimeOnly('org.junit.platform:junit-platform-launcher') - - // querydsl - implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' - annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' - annotationProcessor "jakarta.annotation:jakarta.annotation-api" - annotationProcessor "jakarta.persistence:jakarta.persistence-api" - implementation 'org.hibernate.orm:hibernate-spatial:6.4.4.Final' - implementation 'com.querydsl:querydsl-spatial' - - // database - runtimeOnly 'com.mysql:mysql-connector-j:8.2.0' - runtimeOnly 'com.h2database:h2' - - //serialize - implementation('com.fasterxml.jackson.datatype:jackson-datatype-jsr310') - implementation('com.fasterxml.jackson.core:jackson-databind') - - // log - implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' -} - -bootJar { - enabled = false -} - -jar { - enabled = true -} - -test { - testLogging { - showStandardStreams = true - showCauses = true - showExceptions = true - showStackTraces = true - exceptionFormat = 'full' - } -} diff --git a/cakk-domain/mysql/build.gradle.kts b/cakk-domain/mysql/build.gradle.kts new file mode 100644 index 00000000..0e5cca14 --- /dev/null +++ b/cakk-domain/mysql/build.gradle.kts @@ -0,0 +1,54 @@ +description = "mysql module" + +dependencies { + implementation(project(":cakk-common")) + + // jpa + api("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("io.hypersistence:hypersistence-utils-hibernate-63:3.7.4") + + // test + testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.23") + testImplementation("org.assertj:assertj-core") + testImplementation("org.junit.jupiter:junit-jupiter") + testImplementation("org.mockito:mockito-core") + testImplementation("org.mockito:mockito-junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + + // querydsl + implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta") + annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta") + annotationProcessor("jakarta.annotation:jakarta.annotation-api") + annotationProcessor("jakarta.persistence:jakarta.persistence-api") + implementation("org.hibernate.orm:hibernate-spatial:6.4.4.Final") + implementation("com.querydsl:querydsl-spatial") + + // database + runtimeOnly("com.mysql:mysql-connector-j:8.2.0") + runtimeOnly("com.h2database:h2") + + //serialize + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + implementation("com.fasterxml.jackson.core:jackson-databind") + + // log + implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0") +} + +tasks.bootJar { + enabled = false +} + +tasks.jar { + enabled = true +} + +tasks.test { + testLogging { + showStandardStreams = true + showCauses = true + showExceptions = true + showStackTraces = true + exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL + } +} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/annotation/Reader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/annotation/Reader.java deleted file mode 100644 index aedbc177..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/annotation/Reader.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.cakk.domain.mysql.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -import org.springframework.core.annotation.AliasFor; -import org.springframework.stereotype.Component; - -/** - * Indicates that an annotated class is a "Reader" (e.g. a data access object). - * - *

This annotation serves as a specialization of {@link Component @Component}, - * allowing for implementation classes to be autodetected through classpath scanning. - * - * @author komment - * @see Component - * @see Repository - */ - -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Component -public @interface Reader { - - /** - * Alias for {@link Component#value}. - */ - @AliasFor(annotation = Component.class) - String value() default ""; -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopByLocationParam.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShopByLocationParam.java similarity index 94% rename from cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopByLocationParam.java rename to cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShopByLocationParam.java index bc07d4b4..40a7af3c 100644 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopByLocationParam.java +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShopByLocationParam.java @@ -1,4 +1,4 @@ -package com.cakk.domain.mysql.dto.param.shop; +package com.cakk.domain.mysql.bo.shop; import java.util.Set; diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopBySearchParam.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShopBySearchParam.java similarity index 79% rename from cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopBySearchParam.java rename to cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShopBySearchParam.java index 28d041c3..005a0983 100644 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopBySearchParam.java +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShopBySearchParam.java @@ -1,4 +1,4 @@ -package com.cakk.domain.mysql.dto.param.shop; +package com.cakk.domain.mysql.bo.shop; import java.util.Set; @@ -8,6 +8,8 @@ import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import com.cakk.domain.mysql.dto.param.shop.CakeShopOperationParam; + @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopParam.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShopParam.java similarity index 94% rename from cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopParam.java rename to cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShopParam.java index 3ebeaf20..67283404 100644 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopParam.java +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShopParam.java @@ -1,4 +1,4 @@ -package com.cakk.domain.mysql.dto.param.shop; +package com.cakk.domain.mysql.bo.shop; import java.util.HashSet; import java.util.Set; diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/CakeShops.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShops.java similarity index 83% rename from cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/CakeShops.java rename to cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShops.java index 5774ac2b..0d2b5048 100644 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/CakeShops.java +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/bo/shop/CakeShops.java @@ -1,9 +1,6 @@ -package com.cakk.domain.mysql.bo; +package com.cakk.domain.mysql.bo.shop; import java.util.List; -import java.util.stream.Collectors; - -import com.cakk.domain.mysql.dto.param.shop.CakeShopParam; public class CakeShops { @@ -26,11 +23,11 @@ public List getCakeShops() { } private void validationImageCountMaxCount(List cakeShops, final int maxCount) { - cakeShops.forEach(cakeShop -> { + for (T cakeShop : cakeShops) { if (cakeShop.getCakeImageUrls().size() > maxCount) { cakeShop.setImageCountMaxCount(maxCount); } - }); + } } private List validationPageSize(List cakeShops, int pageSize) { @@ -38,11 +35,11 @@ private List validationPageSize(List cakeShops, int pageSize) { } private void validationEmptyCakeImage(List cakeShops) { - cakeShops.forEach(cakeShop -> { + for (T cakeShop : cakeShops) { if (cakeShop.getCakeImageUrls().contains("")) { cakeShop.setImagesEmptySet(); } - }); + } } } diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/DataSourceConfig.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/DataSourceConfig.java deleted file mode 100644 index f5043814..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/DataSourceConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.cakk.domain.mysql.config; - -import javax.sql.DataSource; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; - -@Configuration -public class DataSourceConfig { - - @Bean - @ConfigurationProperties(prefix = "storage.datasource.core") - public HikariConfig hikariConfig() { - return new HikariConfig(); - } - - @Bean - @Primary - public DataSource dataSource() { - return new HikariDataSource(hikariConfig()); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/DataSourceConfig.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/DataSourceConfig.kt new file mode 100644 index 00000000..254273b9 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/DataSourceConfig.kt @@ -0,0 +1,25 @@ +package com.cakk.domain.mysql.config + +import com.zaxxer.hikari.HikariConfig +import com.zaxxer.hikari.HikariDataSource +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Primary +import javax.sql.DataSource + +@Configuration +class DataSourceConfig { + @Bean + @ConfigurationProperties(prefix = "storage.datasource.core") + fun hikariConfig(): HikariConfig { + return HikariConfig() + } + + @Bean + @Primary + fun dataSource(): DataSource { + return HikariDataSource(hikariConfig()) + } +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JacksonConfig.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JacksonConfig.java deleted file mode 100644 index d585808d..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JacksonConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.cakk.domain.mysql.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - -@Configuration -public class JacksonConfig { - - @Bean - public ObjectMapper objectMapper() { - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - return objectMapper; - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JacksonConfig.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JacksonConfig.kt new file mode 100644 index 00000000..96635745 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JacksonConfig.kt @@ -0,0 +1,19 @@ +package com.cakk.domain.mysql.config + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.SerializationFeature +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +class JacksonConfig { + @Bean + fun objectMapper(): ObjectMapper { + val objectMapper = ObjectMapper() + objectMapper.registerModule(JavaTimeModule()) + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + return objectMapper + } +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JpaConfig.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JpaConfig.kt similarity index 61% rename from cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JpaConfig.java rename to cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JpaConfig.kt index 5aa3104b..42c15fdd 100644 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JpaConfig.java +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/JpaConfig.kt @@ -1,15 +1,14 @@ -package com.cakk.domain.mysql.config; +package com.cakk.domain.mysql.config -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.boot.autoconfigure.domain.EntityScan +import org.springframework.context.annotation.Configuration +import org.springframework.data.jpa.repository.config.EnableJpaAuditing +import org.springframework.data.jpa.repository.config.EnableJpaRepositories +import org.springframework.transaction.annotation.EnableTransactionManagement @Configuration @EnableJpaAuditing @EnableTransactionManagement @EntityScan("com.cakk.domain.mysql.entity.**") @EnableJpaRepositories("com.cakk.domain.mysql.repository.**") -public class JpaConfig { -} +class JpaConfig diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spyConfig.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spyConfig.java deleted file mode 100644 index c2df4531..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spyConfig.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.cakk.domain.mysql.config; - -import jakarta.annotation.PostConstruct; - -import org.springframework.context.annotation.Configuration; - -import com.p6spy.engine.spy.P6SpyOptions; - -@Configuration -public class P6spyConfig { - - @PostConstruct - public void setLogMessageFormat() { - P6SpyOptions.getActiveInstance().setLogMessageFormat(P6spySqlFormatterConfig.class.getName()); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spyConfig.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spyConfig.kt new file mode 100644 index 00000000..8d8ed345 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spyConfig.kt @@ -0,0 +1,14 @@ +package com.cakk.domain.mysql.config + +import com.p6spy.engine.spy.P6SpyOptions +import jakarta.annotation.PostConstruct +import org.springframework.context.annotation.Configuration + +@Configuration +class P6spyConfig { + @PostConstruct + fun setLogMessageFormat() { + P6SpyOptions.getActiveInstance().logMessageFormat = P6spySqlFormatterConfig::class.java.name + } +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spySqlFormatterConfig.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spySqlFormatterConfig.java deleted file mode 100644 index cf27953b..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spySqlFormatterConfig.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.cakk.domain.mysql.config; - -import static java.util.Arrays.*; - -import java.text.MessageFormat; -import java.util.Locale; -import java.util.Stack; -import java.util.function.Predicate; - -import org.hibernate.engine.jdbc.internal.FormatStyle; - -import com.p6spy.engine.logging.Category; -import com.p6spy.engine.spy.appender.MessageFormattingStrategy; - -public class P6spySqlFormatterConfig implements MessageFormattingStrategy { - - private static final String NEW_LINE = System.lineSeparator(); - private static final String P6SPY_FORMATTER = "P6spySqlFormatterConfig"; - private static final String PACKAGE = "com.cakk"; - private static final String CREATE = "create"; - private static final String ALTER = "alter"; - private static final String COMMENT = "comment"; - - @Override - public String formatMessage(final int connectionId, - final String now, - final long elapsed, - final String category, - final String prepared, - final String sql, - final String url) { - return sqlFormatToUpper(sql, category, getMessage(connectionId, elapsed, getStackBuilder())); - } - - @SuppressWarnings("StringBufferReplaceableByString") - private String sqlFormatToUpper(final String sql, final String category, final String message) { - if (sql.trim().isEmpty()) { - return ""; - } - - return new StringBuilder() - .append(sqlFormatToUpper(sql, category)) - .append(message) - .toString(); - } - - private String sqlFormatToUpper(final String sql, final String category) { - if (isStatementDdl(sql, category)) { - return FormatStyle.DDL - .getFormatter() - .format(sql) - .toUpperCase(Locale.ROOT) - .replace("+0900", ""); - } - return FormatStyle.BASIC - .getFormatter() - .format(sql) - .replace("+0900", ""); - } - - private boolean isStatementDdl(final String sql, final String category) { - return isStatement(category) && isDdl(sql.trim().toLowerCase(Locale.ROOT)); - } - - private boolean isStatement(final String category) { - return Category.STATEMENT.getName().equals(category); - } - - private boolean isDdl(final String lowerSql) { - return lowerSql.startsWith(CREATE) || lowerSql.startsWith(ALTER) || lowerSql.startsWith(COMMENT); - } - - private String getMessage(final int connectionId, final long elapsed, final StringBuilder callStackBuilder) { - return new StringBuilder() - .append(NEW_LINE) - .append(NEW_LINE) - .append("\t").append(String.format("Connection ID: %s", connectionId)) - .append(NEW_LINE) - .append("\t").append(String.format("Execution Time: %s ms", elapsed)) - .append(NEW_LINE) - .append(NEW_LINE) - .append("\t").append(String.format("Call Stack (number 1 is entry point): %s", callStackBuilder)) - .append(NEW_LINE) - .append(NEW_LINE) - .append("------------------------------------------------------------------------------------------------") - .toString(); - } - - private StringBuilder getStackBuilder() { - final Stack callStack = new Stack<>(); - stream(new Throwable().getStackTrace()) - .map(StackTraceElement::toString) - .filter(isExcludeWords()) - .forEach(callStack::push); - - int order = 1; - final StringBuilder callStackBuilder = new StringBuilder(); - while (!callStack.empty()) { - callStackBuilder.append(MessageFormat.format("{0}\t\t{1}. {2}", NEW_LINE, order++, callStack.pop())); - } - return callStackBuilder; - } - - private Predicate isExcludeWords() { - return charSequence -> charSequence.startsWith(PACKAGE) && !charSequence.contains(P6SPY_FORMATTER); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spySqlFormatterConfig.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spySqlFormatterConfig.kt new file mode 100644 index 00000000..3fb5f2bd --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/P6spySqlFormatterConfig.kt @@ -0,0 +1,100 @@ +package com.cakk.domain.mysql.config + +import com.p6spy.engine.logging.Category +import com.p6spy.engine.spy.appender.MessageFormattingStrategy +import org.hibernate.engine.jdbc.internal.FormatStyle +import java.text.MessageFormat +import java.util.* +import java.util.function.Predicate + +class P6spySqlFormatterConfig : MessageFormattingStrategy { + + override fun formatMessage( + connectionId: Int, + now: String, + elapsed: Long, + category: String, + prepared: String, + sql: String, + url: String + ): String { + return sqlFormatToUpper(sql, category, getMessage(connectionId, elapsed, stackBuilder)) + } + + private fun sqlFormatToUpper(sql: String, category: String, message: String): String { + return if (sql.trim { it <= ' ' }.isEmpty()) { + "" + } else StringBuilder() + .append(sqlFormatToUpper(sql, category)) + .append(message) + .toString() + } + + private fun sqlFormatToUpper(sql: String, category: String): String { + return if (isStatementDdl(sql, category)) { + FormatStyle.DDL + .formatter + .format(sql) + .uppercase() + .replace("+0900", "") + } else FormatStyle.BASIC + .formatter + .format(sql) + .replace("+0900", "") + } + + private fun isStatementDdl(sql: String, category: String): Boolean { + return isStatement(category) && isDdl(sql.trim { it <= ' ' }.lowercase()) + } + + private fun isStatement(category: String): Boolean { + return Category.STATEMENT.name == category + } + + private fun isDdl(lowerSql: String): Boolean { + return lowerSql.startsWith(CREATE) || lowerSql.startsWith(ALTER) || lowerSql.startsWith(COMMENT) + } + + private fun getMessage(connectionId: Int, elapsed: Long, callStackBuilder: StringBuilder): String { + return StringBuilder() + .append(NEW_LINE) + .append(NEW_LINE) + .append("\t").append(String.format("Connection ID: %s", connectionId)) + .append(NEW_LINE) + .append("\t").append(String.format("Execution Time: %s ms", elapsed)) + .append(NEW_LINE) + .append(NEW_LINE) + .append("\t").append(String.format("Call Stack (number 1 is entry point): %s", callStackBuilder)) + .append(NEW_LINE) + .append(NEW_LINE) + .append("------------------------------------------------------------------------------------------------") + .toString() + } + + private val stackBuilder: StringBuilder + private get() { + val callStack = Stack() + Arrays.stream(Throwable().stackTrace) + .map { obj: StackTraceElement -> obj.toString() } + .filter(isExcludeWords) + .forEach { item: String -> callStack.push(item) } + var order = 1 + val callStackBuilder = StringBuilder() + while (!callStack.empty()) { + callStackBuilder.append(MessageFormat.format("{0}\t\t{1}. {2}", NEW_LINE, order++, callStack.pop())) + } + return callStackBuilder + } + private val isExcludeWords: Predicate + private get() = Predicate { charSequence: String -> charSequence.startsWith(PACKAGE) && !charSequence.contains(P6SPY_FORMATTER) } + + companion object { + private val NEW_LINE = System.lineSeparator() + private const val P6SPY_FORMATTER = "P6spySqlFormatterConfig" + private const val PACKAGE = "com.cakk" + private const val CREATE = "create" + private const val ALTER = "alter" + private const val COMMENT = "comment" + } +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/QuerydslConfig.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/QuerydslConfig.java deleted file mode 100644 index 9c182e86..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/QuerydslConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.cakk.domain.mysql.config; - -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.querydsl.jpa.JPQLTemplates; -import com.querydsl.jpa.impl.JPAQueryFactory; - -@Configuration -public class QuerydslConfig { - - @PersistenceContext - private EntityManager entityManager; - - @Bean - public JPAQueryFactory queryFactory() { - return new JPAQueryFactory(JPQLTemplates.DEFAULT, entityManager); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/QuerydslConfig.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/QuerydslConfig.kt new file mode 100644 index 00000000..0de280c0 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/config/QuerydslConfig.kt @@ -0,0 +1,20 @@ +package com.cakk.domain.mysql.config + +import com.querydsl.jpa.JPQLTemplates +import com.querydsl.jpa.impl.JPAQueryFactory +import jakarta.persistence.EntityManager +import jakarta.persistence.PersistenceContext +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +class QuerydslConfig { + + @PersistenceContext + private val entityManager: EntityManager? = null + @Bean + fun queryFactory(): JPAQueryFactory { + return JPAQueryFactory(JPQLTemplates.DEFAULT, entityManager) + } +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/DayOfWeekConverter.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/DayOfWeekConverter.java deleted file mode 100644 index 77da6a03..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/DayOfWeekConverter.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.cakk.domain.mysql.converter; - -import java.util.stream.Stream; - -import jakarta.persistence.AttributeConverter; - -import com.cakk.common.enums.Days; -import com.cakk.common.enums.ReturnCode; -import com.cakk.common.exception.CakkException; - -public class DayOfWeekConverter implements AttributeConverter { - - @Override - public Integer convertToDatabaseColumn(final Days days) { - if (days == null) { - return null; - } - - return days.getCode(); - } - - @Override - public Days convertToEntityAttribute(final Integer code) { - if (code == null) { - return null; - } - - return Stream.of(Days.values()) - .filter(days -> days.getCode() == code) - .findFirst() - .orElseThrow(() -> new CakkException(ReturnCode.INTERNAL_SERVER_ERROR)); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/DayOfWeekConverter.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/DayOfWeekConverter.kt new file mode 100644 index 00000000..3be243de --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/DayOfWeekConverter.kt @@ -0,0 +1,24 @@ +package com.cakk.domain.mysql.converter + +import com.cakk.common.enums.Days +import com.cakk.common.enums.ReturnCode +import com.cakk.common.exception.CakkException +import jakarta.persistence.AttributeConverter +import java.util.stream.Stream + +class DayOfWeekConverter : AttributeConverter { + + override fun convertToDatabaseColumn(days: Days?): Int? { + return days?.code + } + + override fun convertToEntityAttribute(code: Int?): Days? { + return if (code == null) { + null + } else Stream.of(*Days.values()) + .filter { days: Days -> days.code == code } + .findFirst() + .orElseThrow { CakkException(ReturnCode.INTERNAL_SERVER_ERROR) } + } +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/LinkKindConverter.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/LinkKindConverter.java deleted file mode 100644 index ec54f9ed..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/LinkKindConverter.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.cakk.domain.mysql.converter; - -import java.util.stream.Stream; - -import jakarta.persistence.AttributeConverter; - -import com.cakk.common.enums.LinkKind; -import com.cakk.common.enums.ReturnCode; -import com.cakk.common.exception.CakkException; - -public class LinkKindConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(final LinkKind linkKind) { - if (linkKind == null) { - return null; - } - - return linkKind.getValue(); - } - - @Override - public LinkKind convertToEntityAttribute(final String value) { - if (value == null) { - return null; - } - - return Stream.of(LinkKind.values()) - .filter(linkKind -> linkKind.getValue().equals(value)) - .findFirst() - .orElseThrow(() -> new CakkException(ReturnCode.INTERNAL_SERVER_ERROR)); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/LinkKindConverter.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/LinkKindConverter.kt new file mode 100644 index 00000000..9bf4d2ed --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/LinkKindConverter.kt @@ -0,0 +1,24 @@ +package com.cakk.domain.mysql.converter + +import com.cakk.common.enums.LinkKind +import com.cakk.common.enums.ReturnCode +import com.cakk.common.exception.CakkException +import jakarta.persistence.AttributeConverter +import java.util.stream.Stream + +class LinkKindConverter : AttributeConverter { + + override fun convertToDatabaseColumn(linkKind: LinkKind?): String? { + return linkKind?.value + } + + override fun convertToEntityAttribute(value: String?): LinkKind? { + return if (value == null) { + null + } else Stream.of(*LinkKind.values()) + .filter { linkKind: LinkKind -> linkKind.value == value } + .findFirst() + .orElseThrow { CakkException(ReturnCode.INTERNAL_SERVER_ERROR) } + } +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/VerificationStatusConverter.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/VerificationStatusConverter.java deleted file mode 100644 index 2b7ddfb4..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/VerificationStatusConverter.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.cakk.domain.mysql.converter; - -import java.util.stream.Stream; - -import jakarta.persistence.AttributeConverter; - -import com.cakk.common.enums.ReturnCode; -import com.cakk.common.enums.VerificationStatus; -import com.cakk.common.exception.CakkException; - -public class VerificationStatusConverter implements AttributeConverter { - @Override - public Integer convertToDatabaseColumn(VerificationStatus verificationStatus) { - if (verificationStatus == null) { - return null; - } - - return verificationStatus.code; - } - - @Override - public VerificationStatus convertToEntityAttribute(Integer code) { - if (code == null) { - return null; - } - - return Stream.of(VerificationStatus.values()) - .filter(verificationStatus -> verificationStatus.code == code) - .findFirst() - .orElseThrow(() -> new CakkException(ReturnCode.INTERNAL_SERVER_ERROR)); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/VerificationStatusConverter.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/VerificationStatusConverter.kt new file mode 100644 index 00000000..db5705e8 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/converter/VerificationStatusConverter.kt @@ -0,0 +1,24 @@ +package com.cakk.domain.mysql.converter + +import com.cakk.common.enums.ReturnCode +import com.cakk.common.enums.VerificationStatus +import com.cakk.common.exception.CakkException +import jakarta.persistence.AttributeConverter +import java.util.stream.Stream + +class VerificationStatusConverter : AttributeConverter { + + override fun convertToDatabaseColumn(verificationStatus: VerificationStatus?): Int? { + return verificationStatus?.code + } + + override fun convertToEntityAttribute(code: Int?): VerificationStatus? { + return if (code == null) { + null + } else Stream.of(*VerificationStatus.values()) + .filter { verificationStatus: VerificationStatus -> verificationStatus.code == code } + .findFirst() + .orElseThrow { CakkException(ReturnCode.INTERNAL_SERVER_ERROR) } + } +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopByKeywordParam.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopByKeywordParam.java deleted file mode 100644 index 0d165cb5..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/dto/param/shop/CakeShopByKeywordParam.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.cakk.domain.mysql.dto.param.shop; - -public record CakeShopByKeywordParam( - Long cakeShopId, - String thumbnailUrl, - String cakeShopName, - String cakeShopBio -) { -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/entity/user/User.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/entity/user/User.java index 7884c6a7..15fdb2cf 100644 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/entity/user/User.java +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/entity/user/User.java @@ -23,9 +23,12 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -42,6 +45,7 @@ import com.cakk.domain.mysql.entity.shop.CakeShopLike; @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "users") @@ -88,6 +92,8 @@ public class User extends AuditEntity { private Role role; @ColumnDefault("null") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) @Column(name = "deleted_at") private LocalDateTime deletedAt; diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/BusinessInformationJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/BusinessInformationJpaRepository.java deleted file mode 100644 index 97028b13..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/BusinessInformationJpaRepository.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import com.cakk.common.enums.VerificationStatus; -import com.cakk.domain.mysql.entity.user.BusinessInformation; -import com.cakk.domain.mysql.entity.user.User; - -public interface BusinessInformationJpaRepository extends JpaRepository { - - @Query("select bi from BusinessInformation as bi join fetch bi.cakeShop " - + "where bi.cakeShop.id =:cakeShopId") - Optional findBusinessInformationWithCakeShop(@Param("cakeShopId") Long cakeShopId); - - List findAllByUser(User user); - - Boolean existsBusinessInformationByUserAndCakeShop_Id(User owner, Long cakeShopId); - - @Query("select bi from BusinessInformation as bi join fetch bi.cakeShop where bi.user =:user") - List findAllWithCakeShopByUser(User user); - - @Query("select bi from BusinessInformation as bi join fetch bi.user join fetch bi.cakeShop" - + " where bi.verificationStatus =:verificationStatus") - List findAllCakeShopBusinessOwnerCandidates(VerificationStatus verificationStatus); - - @Query("select bi from BusinessInformation as bi join fetch bi.user join fetch bi.cakeShop" - + " where bi.user.id =:userId") - Optional findBusinessInformationByUserId(final Long userId); -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/BusinessInformationJpaRepository.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/BusinessInformationJpaRepository.kt new file mode 100644 index 00000000..3e2d2140 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/BusinessInformationJpaRepository.kt @@ -0,0 +1,32 @@ +package com.cakk.domain.mysql.repository.jpa + +import com.cakk.common.enums.VerificationStatus +import com.cakk.domain.mysql.entity.user.BusinessInformation +import com.cakk.domain.mysql.entity.user.User +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.query.Param +import java.util.* + +interface BusinessInformationJpaRepository : JpaRepository { + + @Query("select bi from BusinessInformation as bi join fetch bi.cakeShop " + + "where bi.cakeShop.id =:cakeShopId") + fun findBusinessInformationWithCakeShop(@Param("cakeShopId") cakeShopId: Long): BusinessInformation? + + fun findAllByUser(user: User): List + + fun existsBusinessInformationByUserAndCakeShop_Id(owner: User, cakeShopId: Long): Boolean + + @Query("select bi from BusinessInformation as bi join fetch bi.cakeShop where bi.user =:user") + fun findAllWithCakeShopByUser(user: User): List + + @Query("select bi from BusinessInformation as bi join fetch bi.user join fetch bi.cakeShop" + + " where bi.verificationStatus =:verificationStatus") + fun findAllCakeShopBusinessOwnerCandidates(verificationStatus: VerificationStatus): List + + @Query("select bi from BusinessInformation as bi join fetch bi.user join fetch bi.cakeShop" + + " where bi.user.id =:userId") + fun findBusinessInformationByUserId(userId: Long): BusinessInformation? +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeCategoryJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeCategoryJpaRepository.java deleted file mode 100644 index edc4fe0f..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeCategoryJpaRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.cakk.domain.mysql.entity.cake.CakeCategory; - -public interface CakeCategoryJpaRepository extends JpaRepository { - - Optional findByCakeId(Long cakeId); -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeCategoryJpaRepository.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeCategoryJpaRepository.kt new file mode 100644 index 00000000..45e43560 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeCategoryJpaRepository.kt @@ -0,0 +1,11 @@ +package com.cakk.domain.mysql.repository.jpa + +import com.cakk.domain.mysql.entity.cake.CakeCategory +import org.springframework.data.jpa.repository.JpaRepository +import java.util.* + +interface CakeCategoryJpaRepository : JpaRepository { + + fun findByCakeId(cakeId: Long?): CakeCategory? +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeHeartJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeHeartJpaRepository.java deleted file mode 100644 index 2dfc1d8a..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeHeartJpaRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.cakk.domain.mysql.entity.cake.Cake; -import com.cakk.domain.mysql.entity.cake.CakeHeart; -import com.cakk.domain.mysql.entity.user.User; - -public interface CakeHeartJpaRepository extends JpaRepository { - - List findAllByUser(User user); - - Optional findByUserAndCake(User user, Cake cake); - - boolean existsByUserAndCake(User user, Cake cake); -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeHeartJpaRepository.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeHeartJpaRepository.kt new file mode 100644 index 00000000..abf4112a --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeHeartJpaRepository.kt @@ -0,0 +1,15 @@ +package com.cakk.domain.mysql.repository.jpa + +import com.cakk.domain.mysql.entity.cake.Cake +import com.cakk.domain.mysql.entity.cake.CakeHeart +import com.cakk.domain.mysql.entity.user.User +import org.springframework.data.jpa.repository.JpaRepository +import java.util.* + +interface CakeHeartJpaRepository : JpaRepository { + + fun findAllByUser(user: User): List + fun findByUserAndCake(user: User, cake: Cake): CakeHeart? + fun existsByUserAndCake(user: User, cake: Cake): Boolean +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeJpaRepository.java deleted file mode 100644 index ee891465..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeJpaRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.cakk.domain.mysql.entity.cake.Cake; - -public interface CakeJpaRepository extends JpaRepository { -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeJpaRepository.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeJpaRepository.kt new file mode 100644 index 00000000..2adff33b --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeJpaRepository.kt @@ -0,0 +1,6 @@ +package com.cakk.domain.mysql.repository.jpa + +import com.cakk.domain.mysql.entity.cake.Cake +import org.springframework.data.jpa.repository.JpaRepository + +interface CakeJpaRepository : JpaRepository diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopHeartJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopHeartJpaRepository.java deleted file mode 100644 index d084b767..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopHeartJpaRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.cakk.domain.mysql.entity.shop.CakeShop; -import com.cakk.domain.mysql.entity.shop.CakeShopHeart; -import com.cakk.domain.mysql.entity.user.User; - -public interface CakeShopHeartJpaRepository extends JpaRepository { - - List findAllByUser(User user); - - Optional findByUserAndCakeShop(User user, CakeShop cakeShop); - - boolean existsByUserAndCakeShop(User user, CakeShop cakeShop); -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopJpaRepository.java deleted file mode 100644 index 81423746..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopJpaRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.cakk.domain.mysql.entity.shop.CakeShop; - -public interface CakeShopJpaRepository extends JpaRepository { -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopJpaRepository.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopJpaRepository.kt new file mode 100644 index 00000000..1ce0ee92 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopJpaRepository.kt @@ -0,0 +1,6 @@ +package com.cakk.domain.mysql.repository.jpa + +import com.cakk.domain.mysql.entity.shop.CakeShop +import org.springframework.data.jpa.repository.JpaRepository + +interface CakeShopJpaRepository : JpaRepository diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopLikeJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopLikeJpaRepository.java deleted file mode 100644 index 86c22d00..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopLikeJpaRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.cakk.domain.mysql.entity.shop.CakeShopLike; -import com.cakk.domain.mysql.entity.user.User; - -public interface CakeShopLikeJpaRepository extends JpaRepository { - - int countByCakeShopIdAndUser(Long cakeShopId, User user); -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopLinkJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopLinkJpaRepository.java deleted file mode 100644 index 4005368d..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopLinkJpaRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.cakk.domain.mysql.entity.shop.CakeShopLink; - -public interface CakeShopLinkJpaRepository extends JpaRepository { - - List findAllByCakeShopId(Long cakeShopId); -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopLinkJpaRepository.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopLinkJpaRepository.kt new file mode 100644 index 00000000..61db8abb --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopLinkJpaRepository.kt @@ -0,0 +1,10 @@ +package com.cakk.domain.mysql.repository.jpa + +import com.cakk.domain.mysql.entity.shop.CakeShopLink +import org.springframework.data.jpa.repository.JpaRepository + +interface CakeShopLinkJpaRepository : JpaRepository { + + fun findAllByCakeShopId(cakeShopId: Long): List +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopOperationJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopOperationJpaRepository.java deleted file mode 100644 index 2eecfc08..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopOperationJpaRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.cakk.domain.mysql.entity.shop.CakeShopOperation; - -public interface CakeShopOperationJpaRepository extends JpaRepository { - - List findAllByCakeShopId(Long cakeShopId); -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopOperationJpaRepository.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopOperationJpaRepository.kt new file mode 100644 index 00000000..8b494520 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/CakeShopOperationJpaRepository.kt @@ -0,0 +1,10 @@ +package com.cakk.domain.mysql.repository.jpa + +import com.cakk.domain.mysql.entity.shop.CakeShopOperation +import org.springframework.data.jpa.repository.JpaRepository + +interface CakeShopOperationJpaRepository : JpaRepository { + + fun findAllByCakeShopId(cakeShopId: Long): List +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/TagJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/TagJpaRepository.java deleted file mode 100644 index 7186df2e..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/TagJpaRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.cakk.domain.mysql.entity.cake.Tag; - -@Repository -public interface TagJpaRepository extends JpaRepository { - - Optional findTagByTagName(String tagName); - - List findTagsByTagNameIsIn(List tagNames); -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/TagJpaRepository.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/TagJpaRepository.kt new file mode 100644 index 00000000..eaf1c2f5 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/TagJpaRepository.kt @@ -0,0 +1,14 @@ +package com.cakk.domain.mysql.repository.jpa + +import com.cakk.domain.mysql.entity.cake.Tag +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository +import java.util.* + +@Repository +interface TagJpaRepository : JpaRepository { + + fun findTagByTagName(tagName: String?): Tag? + fun findTagsByTagNameIsIn(tagNames: List): List +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserJpaRepository.java deleted file mode 100644 index 25db239e..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserJpaRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.cakk.domain.mysql.entity.user.User; - -public interface UserJpaRepository extends JpaRepository { - - Optional findByProviderId(String providerId); -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserJpaRepository.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserJpaRepository.kt new file mode 100644 index 00000000..489b63ee --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserJpaRepository.kt @@ -0,0 +1,11 @@ +package com.cakk.domain.mysql.repository.jpa + +import com.cakk.domain.mysql.entity.user.User +import org.springframework.data.jpa.repository.JpaRepository +import java.util.* + +interface UserJpaRepository : JpaRepository { + + fun findByProviderId(providerId: String): User? +} + diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserWithdrawalJpaRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserWithdrawalJpaRepository.java deleted file mode 100644 index fc78d3d3..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserWithdrawalJpaRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.cakk.domain.mysql.repository.jpa; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.cakk.domain.mysql.entity.user.UserWithdrawal; - -public interface UserWithdrawalJpaRepository extends JpaRepository { -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserWithdrawalJpaRepository.kt b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserWithdrawalJpaRepository.kt new file mode 100644 index 00000000..0d6fc7da --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/jpa/UserWithdrawalJpaRepository.kt @@ -0,0 +1,6 @@ +package com.cakk.domain.mysql.repository.jpa + +import com.cakk.domain.mysql.entity.user.UserWithdrawal +import org.springframework.data.jpa.repository.JpaRepository + +interface UserWithdrawalJpaRepository : JpaRepository diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/query/CakeShopHeartQueryRepository.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/query/CakeShopHeartQueryRepository.java index 35f63602..c56f39c1 100644 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/query/CakeShopHeartQueryRepository.java +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/query/CakeShopHeartQueryRepository.java @@ -58,14 +58,14 @@ public List searchAllByCursorAndHeart(final List findAllWithCakeShopByUser(final User owner) { - return businessInformationJpaRepository.findAllWithCakeShopByUser(owner); - } - - public List findAllCakeShopBusinessOwnerCandidates() { - return businessInformationJpaRepository.findAllCakeShopBusinessOwnerCandidates(VerificationStatus.PENDING); - } - - public BusinessInformation findByUserId(final Long userId) { - return businessInformationJpaRepository.findBusinessInformationByUserId(userId) - .orElseThrow(() -> new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeCategoryReader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeCategoryReader.java deleted file mode 100644 index 98eb5615..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeCategoryReader.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.cakk.domain.mysql.repository.reader; - -import lombok.RequiredArgsConstructor; - -import com.cakk.common.enums.ReturnCode; -import com.cakk.common.exception.CakkException; -import com.cakk.domain.mysql.annotation.Reader; -import com.cakk.domain.mysql.entity.cake.CakeCategory; -import com.cakk.domain.mysql.repository.jpa.CakeCategoryJpaRepository; - -@Reader -@RequiredArgsConstructor -public class CakeCategoryReader { - - private final CakeCategoryJpaRepository cakeCategoryJpaRepository; - - public CakeCategory findByCakeId(final Long cakeId) { - return cakeCategoryJpaRepository.findByCakeId(cakeId).orElseThrow(() -> new CakkException(ReturnCode.NOT_EXIST_CAKE_CATEGORY)); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeHeartReader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeHeartReader.java deleted file mode 100644 index 8fe90668..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeHeartReader.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.cakk.domain.mysql.repository.reader; - -import java.util.List; - -import lombok.RequiredArgsConstructor; - -import com.cakk.domain.mysql.annotation.Reader; -import com.cakk.domain.mysql.dto.param.like.HeartCakeImageResponseParam; -import com.cakk.domain.mysql.repository.jpa.CakeHeartJpaRepository; -import com.cakk.domain.mysql.repository.query.CakeHeartQueryRepository; - -@RequiredArgsConstructor -@Reader -public class CakeHeartReader { - - private final CakeHeartJpaRepository cakeHeartJpaRepository; - private final CakeHeartQueryRepository cakeHeartQueryRepository; - - public List searchCakeImagesByCursorAndHeart( - final Long cakeHeartId, - final Long userId, - final int pageSize - ) { - return cakeHeartQueryRepository.searchCakeImagesByCursorAndHeart(cakeHeartId, userId, pageSize); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeReader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeReader.java deleted file mode 100644 index 36251eb0..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeReader.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.cakk.domain.mysql.repository.reader; - -import static java.util.Objects.*; - -import java.util.List; - -import lombok.RequiredArgsConstructor; - -import com.cakk.common.enums.CakeDesignCategory; -import com.cakk.common.enums.ReturnCode; -import com.cakk.common.exception.CakkException; -import com.cakk.domain.mysql.annotation.Reader; -import com.cakk.domain.mysql.dto.param.cake.CakeDetailParam; -import com.cakk.domain.mysql.dto.param.cake.CakeImageResponseParam; -import com.cakk.domain.mysql.dto.param.cake.CakeSearchParam; -import com.cakk.domain.mysql.entity.cake.Cake; -import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.jpa.CakeJpaRepository; -import com.cakk.domain.mysql.repository.query.CakeQueryRepository; - -@Reader -@RequiredArgsConstructor -public class CakeReader { - - private final CakeJpaRepository cakeJpaRepository; - private final CakeQueryRepository cakeQueryRepository; - - public Cake findById(final Long cakeId) { - return cakeJpaRepository.findById(cakeId).orElseThrow(() -> new CakkException(ReturnCode.NOT_EXIST_CAKE)); - } - - public Cake findByIdWithHeart(final Long cakeId) { - final Cake cake = cakeQueryRepository.searchByIdWithHeart(cakeId); - - if (isNull(cake)) { - throw new CakkException(ReturnCode.NOT_EXIST_CAKE); - } - - return cake; - } - - public List searchCakeImagesByCursorAndCategory( - final Long cakeId, - final CakeDesignCategory category, - final int pageSize - ) { - return cakeQueryRepository.searchCakeImagesByCursorAndCategory(cakeId, category, pageSize); - } - - public List searchCakeImagesByCursorAndCakeShopId( - final Long cakeId, - final Long cakeShopId, - final int pageSize - ) { - return cakeQueryRepository.searchCakeImagesByCursorAndCakeShopId(cakeId, cakeShopId, pageSize); - } - - public List searchCakeImagesByCursorAndSearchKeyword(final CakeSearchParam param) { - return cakeQueryRepository.searchCakeImagesByCursorAndSearchKeyword( - param.cakeId(), - param.keyword(), - param.location(), - param.pageSize() - ); - } - - public List searchCakeImagesByCakeIds(final List cakeIds) { - return cakeQueryRepository.searchCakeImagesByCakeIds(cakeIds); - } - - public Cake findWithCakeTagsAndCakeCategories(final Long cakeId, final User owner) { - return cakeQueryRepository.searchWithCakeTagsAndCakeCategories(cakeId, owner) - .orElseThrow(() -> new CakkException(ReturnCode.NOT_CAKE_SHOP_OWNER)); - } - - public CakeDetailParam searchCakeDetailById(final Long cakeId) { - final CakeDetailParam param = cakeQueryRepository.searchCakeDetailById(cakeId); - - if (isNull(param)) { - throw new CakkException(ReturnCode.NOT_EXIST_CAKE); - } - return param; - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopHeartReader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopHeartReader.java deleted file mode 100644 index f1a8a4f3..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopHeartReader.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.cakk.domain.mysql.repository.reader; - -import java.util.List; - -import lombok.RequiredArgsConstructor; - -import com.cakk.domain.mysql.annotation.Reader; -import com.cakk.domain.mysql.dto.param.like.HeartCakeShopResponseParam; -import com.cakk.domain.mysql.entity.shop.CakeShop; -import com.cakk.domain.mysql.entity.shop.CakeShopHeart; -import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.jpa.CakeShopHeartJpaRepository; -import com.cakk.domain.mysql.repository.query.CakeShopHeartQueryRepository; - -@Reader -@RequiredArgsConstructor -public class CakeShopHeartReader { - - private final CakeShopHeartQueryRepository cakeShopHeartQueryRepository; - private final CakeShopHeartJpaRepository cakeShopHeartJpaRepository; - - public List searchAllByCursorAndHeart( - final Long cakeShopHeartId, - final Long userId, - final int pageSize - ) { - final List cakeShopHeartIds = cakeShopHeartQueryRepository.searchIdsByCursorAndHeart(cakeShopHeartId, userId, pageSize); - - return cakeShopHeartQueryRepository.searchAllByCursorAndHeart(cakeShopHeartIds); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopLinkReader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopLinkReader.java deleted file mode 100644 index b910dc0c..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopLinkReader.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.cakk.domain.mysql.repository.reader; - -import java.util.List; - -import lombok.RequiredArgsConstructor; - -import com.cakk.domain.mysql.annotation.Reader; -import com.cakk.domain.mysql.entity.shop.CakeShopLink; -import com.cakk.domain.mysql.repository.jpa.CakeShopLinkJpaRepository; - -@Reader -@RequiredArgsConstructor -public class CakeShopLinkReader { - - private final CakeShopLinkJpaRepository cakeShopLinkJpaRepository; - - public List findAllByCakeShopId(final Long cakeShopId) { - return cakeShopLinkJpaRepository.findAllByCakeShopId(cakeShopId); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopOperationReader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopOperationReader.java deleted file mode 100644 index 4b444261..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopOperationReader.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.cakk.domain.mysql.repository.reader; - -import java.util.List; - -import lombok.RequiredArgsConstructor; - -import com.cakk.domain.mysql.annotation.Reader; -import com.cakk.domain.mysql.entity.shop.CakeShopOperation; -import com.cakk.domain.mysql.repository.jpa.CakeShopOperationJpaRepository; - -@Reader -@RequiredArgsConstructor -public class CakeShopOperationReader { - - private final CakeShopOperationJpaRepository cakeShopOperationJpaRepository; - - public List findAllByCakeShopId(Long cakeShopId) { - return cakeShopOperationJpaRepository.findAllByCakeShopId(cakeShopId); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopReader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopReader.java deleted file mode 100644 index dd89849a..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/CakeShopReader.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.cakk.domain.mysql.repository.reader; - -import static java.util.Objects.*; - -import java.util.List; - -import org.locationtech.jts.geom.Point; - -import lombok.RequiredArgsConstructor; - -import com.cakk.common.enums.ReturnCode; -import com.cakk.common.exception.CakkException; -import com.cakk.domain.mysql.annotation.Reader; -import com.cakk.domain.mysql.dto.param.shop.CakeShopByLocationParam; -import com.cakk.domain.mysql.dto.param.shop.CakeShopDetailParam; -import com.cakk.domain.mysql.dto.param.shop.CakeShopInfoParam; -import com.cakk.domain.mysql.dto.param.shop.CakeShopSearchParam; -import com.cakk.domain.mysql.dto.param.shop.CakeShopSimpleParam; -import com.cakk.domain.mysql.entity.shop.CakeShop; -import com.cakk.domain.mysql.entity.user.BusinessInformation; -import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.jpa.BusinessInformationJpaRepository; -import com.cakk.domain.mysql.repository.jpa.CakeShopJpaRepository; -import com.cakk.domain.mysql.repository.query.CakeShopQueryRepository; - -@Reader -@RequiredArgsConstructor -public class CakeShopReader { - - private final CakeShopJpaRepository cakeShopJpaRepository; - private final CakeShopQueryRepository cakeShopQueryRepository; - private final BusinessInformationJpaRepository businessInformationJpaRepository; - - public CakeShop findById(final Long cakeShopId) { - return cakeShopJpaRepository.findById(cakeShopId).orElseThrow(() -> new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)); - } - - public CakeShop findByIdWithHeart(final Long cakeShopId) { - final CakeShop cakeShop = cakeShopQueryRepository.searchByIdWithHeart(cakeShopId); - - if (isNull(cakeShop)) { - throw new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP); - } - - return cakeShop; - } - - public CakeShop findByIdWithLike(final Long cakeShopId) { - final CakeShop cakeShop = cakeShopQueryRepository.searchByIdWithLike(cakeShopId); - - if (isNull(cakeShop)) { - throw new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP); - } - - return cakeShop; - } - - public CakeShopSimpleParam searchSimpleById(final Long cakeShopId) { - final CakeShopSimpleParam response = cakeShopQueryRepository.searchSimpleById(cakeShopId); - - if (isNull(response)) { - throw new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP); - } - - return response; - } - - public CakeShopDetailParam searchDetailById(final Long cakeShopId) { - final CakeShopDetailParam response = cakeShopQueryRepository.searchDetailById(cakeShopId); - - if (isNull(response)) { - throw new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP); - } - - return response; - } - - public CakeShopInfoParam searchInfoById(final Long cakeShopId) { - final CakeShopInfoParam response = cakeShopQueryRepository.searchInfoById(cakeShopId); - - if (isNull(response)) { - throw new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP); - } - - return response; - } - - public BusinessInformation findBusinessInformationWithShop(final Long cakeShopId) { - return businessInformationJpaRepository.findBusinessInformationWithCakeShop(cakeShopId) - .orElseThrow(() -> new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)); - } - - public BusinessInformation findBusinessInformationByCakeShopId(final Long cakeShopId) { - return businessInformationJpaRepository.findBusinessInformationWithCakeShop(cakeShopId) - .orElseThrow(() -> new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)); - } - - public List searchShopByLocationBased(final Point point, final Double distance) { - return cakeShopQueryRepository.findShopsByLocationBased(point, distance); - } - - public List searchShopBySearch(final CakeShopSearchParam param) { - return cakeShopQueryRepository.searchByKeywordWithLocation( - param.cakeShopId(), - param.keyword(), - param.location(), - param.pageSize() - ); - } - - public CakeShop searchWithShopLinks(final User owner, final Long cakeShopId) { - return cakeShopQueryRepository.searchWithShopLinks(owner, cakeShopId) - .orElseThrow(() -> new CakkException(ReturnCode.NOT_CAKE_SHOP_OWNER)); - } - - public CakeShop searchByIdAndOwner(final Long cakeShopId, final User owner) { - return cakeShopQueryRepository.searchWithBusinessInformationAndOwnerById(owner, cakeShopId) - .orElseThrow(() -> new CakkException(ReturnCode.NOT_CAKE_SHOP_OWNER)); - } - - public CakeShop searchWithOperations(final User owner, final Long cakeShopId) { - return cakeShopQueryRepository.searchWithOperations(owner, cakeShopId) - .orElseThrow(() -> new CakkException(ReturnCode.NOT_CAKE_SHOP_OWNER)); - } - - public List searchShopsByShopIds(final List shopIds) { - return cakeShopQueryRepository.searchByShopIds(shopIds); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/TagReader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/TagReader.java deleted file mode 100644 index 042aebc8..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/TagReader.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.cakk.domain.mysql.repository.reader; - -import java.util.List; - -import lombok.RequiredArgsConstructor; - -import com.cakk.domain.mysql.annotation.Reader; -import com.cakk.domain.mysql.entity.cake.Tag; -import com.cakk.domain.mysql.mapper.TagMapper; -import com.cakk.domain.mysql.repository.jpa.TagJpaRepository; - -@Reader -@RequiredArgsConstructor -public class TagReader { - - private final TagJpaRepository tagJpaRepository; - - public List getTagsByTagName(final List tagNames) { - List tags = tagJpaRepository.findTagsByTagNameIsIn(tagNames); - - return tagNames.stream() - .map(tagName -> tags - .stream() - .filter(tag -> tag.getTagName().equals(tagName)) - .findAny() - .orElse(tagJpaRepository.save(TagMapper.supplyTagBy(tagName)))) - .toList(); - } -} diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/UserReader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/UserReader.java deleted file mode 100644 index 8bc4dd7f..00000000 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/UserReader.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.cakk.domain.mysql.repository.reader; - -import static java.util.Objects.*; - -import java.util.List; - -import lombok.RequiredArgsConstructor; - -import com.cakk.common.enums.ReturnCode; -import com.cakk.common.exception.CakkException; -import com.cakk.domain.mysql.annotation.Reader; -import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.repository.jpa.UserJpaRepository; -import com.cakk.domain.mysql.repository.query.UserQueryRepository; - -@Reader -@RequiredArgsConstructor -public class UserReader { - - private final UserJpaRepository userJpaRepository; - private final UserQueryRepository userQueryRepository; - - public User findByUserId(final Long userId) { - return userJpaRepository.findById(userId).orElseThrow(() -> new CakkException(ReturnCode.NOT_EXIST_USER)); - } - - public User findByProviderId(final String providerId) { - return userJpaRepository.findByProviderId(providerId).orElseThrow(() -> new CakkException(ReturnCode.NOT_EXIST_USER)); - } - - public User findByIdWithAll(final Long userId) { - final User user = userQueryRepository.searchByIdWithAll(userId); - - if (isNull(user)) { - throw new CakkException(ReturnCode.NOT_EXIST_USER); - } - - return user; - } - - public List findAll() { - return userJpaRepository.findAll(); - } -} diff --git a/cakk-domain/mysql/src/test/java/com/cakk/domain/base/DomainTest.java b/cakk-domain/mysql/src/test/java/com/cakk/domain/base/DomainTest.java deleted file mode 100644 index 6c61d86e..00000000 --- a/cakk-domain/mysql/src/test/java/com/cakk/domain/base/DomainTest.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.cakk.domain.base; - -import org.locationtech.jts.geom.Coordinate; -import org.locationtech.jts.geom.GeometryFactory; -import org.locationtech.jts.geom.Point; -import org.locationtech.jts.geom.PrecisionModel; - -import net.jqwik.api.Arbitraries; - -import com.navercorp.fixturemonkey.FixtureMonkey; -import com.navercorp.fixturemonkey.api.introspector.BuilderArbitraryIntrospector; -import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector; -import com.navercorp.fixturemonkey.api.introspector.FieldReflectionArbitraryIntrospector; -import com.navercorp.fixturemonkey.customizer.Values; -import com.navercorp.fixturemonkey.jakarta.validation.plugin.JakartaValidationPlugin; - -import com.cakk.common.enums.Role; -import com.cakk.common.enums.VerificationStatus; -import com.cakk.domain.mysql.bo.user.DefaultVerificationPolicy; -import com.cakk.domain.mysql.bo.user.VerificationPolicy; -import com.cakk.domain.mysql.dto.param.user.CertificationParam; -import com.cakk.domain.mysql.entity.cake.Cake; -import com.cakk.domain.mysql.entity.shop.CakeShop; -import com.cakk.domain.mysql.entity.user.BusinessInformation; -import com.cakk.domain.mysql.entity.user.User; - -public abstract class DomainTest { - - private static final int SPATIAL_REFERENCE_IDENTIFIER_NUMBER = 4326; - - private static final GeometryFactory geometryFactory = new GeometryFactory( - new PrecisionModel(), - SPATIAL_REFERENCE_IDENTIFIER_NUMBER - ); - - protected final FixtureMonkey getReflectionMonkey() { - return FixtureMonkey.builder() - .plugin(new JakartaValidationPlugin()) - .objectIntrospector(FieldReflectionArbitraryIntrospector.INSTANCE) - .build(); - } - - protected final FixtureMonkey getConstructorMonkey() { - return FixtureMonkey.builder() - .plugin(new JakartaValidationPlugin()) - .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE) - .build(); - } - - protected final FixtureMonkey getBuilderMonkey() { - return FixtureMonkey.builder() - .plugin(new JakartaValidationPlugin()) - .objectIntrospector(BuilderArbitraryIntrospector.INSTANCE) - .build(); - } - - protected static Point supplyPointBy(Double latitude, Double longitude) { - return geometryFactory.createPoint(new Coordinate(longitude, latitude)); - } - - protected User getUserFixture(Role role) { - return getConstructorMonkey().giveMeBuilder(User.class) - .set("id", Arbitraries.longs().greaterOrEqual(10)) - .set("email", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(50)) - .set("role", role) - .sample(); - } - - protected VerificationPolicy getVerificationPolicy() { - return new DefaultVerificationPolicy(); - } - - protected CakeShop getCakeShopFixture() { - return getConstructorMonkey().giveMeBuilder(CakeShop.class) - .set("shopName", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(30)) - .set("shopBio", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(40)) - .set("shopDescription", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(500)) - .set("likeCount", 0) - .set("heartCount", 0) - .set("location", supplyPointBy( - Arbitraries.doubles().between(-90, 90).sample(), - Arbitraries.doubles().between(-180, 180).sample()) - ) - .sample(); - } - - protected BusinessInformation getBusinessInformationFixtureWithCakeShop(VerificationStatus verificationStatus) { - return getConstructorMonkey().giveMeBuilder(BusinessInformation.class) - .set("businessNumber", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(20)) - .set("cakeShop", Values.just(getCakeShopFixture())) - .set("verificationStatus", verificationStatus) - .setNull("user") - .sample(); - } - - protected CertificationParam getCertificationParamFixtureWithUser(User user) { - return getConstructorMonkey().giveMeBuilder(CertificationParam.class) - .set("businessRegistrationImageUrl", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(20)) - .set("idCardImageUrl", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(20)) - .set("cakeShopId", Arbitraries.longs().greaterOrEqual(0)) - .set("emergencyContact", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(20)) - .set("message", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(20)) - .set("user", user) - .sample(); - } - - protected Cake getCakeFixture() { - return getConstructorMonkey().giveMeBuilder(Cake.class) - .set("cakeImageUrl", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(50)) - .set("cakeShop", Values.just(getCakeShopFixture())) - .sample(); - } -} diff --git a/cakk-domain/mysql/src/test/java/com/cakk/domain/base/DomainTest.kt b/cakk-domain/mysql/src/test/java/com/cakk/domain/base/DomainTest.kt new file mode 100644 index 00000000..b2f171e3 --- /dev/null +++ b/cakk-domain/mysql/src/test/java/com/cakk/domain/base/DomainTest.kt @@ -0,0 +1,103 @@ +package com.cakk.domain.base + +import com.cakk.common.enums.Role +import com.cakk.common.enums.VerificationStatus +import com.cakk.domain.mysql.bo.user.DefaultVerificationPolicy +import com.cakk.domain.mysql.bo.user.VerificationPolicy +import com.cakk.domain.mysql.dto.param.user.CertificationParam +import com.cakk.domain.mysql.entity.cake.Cake +import com.cakk.domain.mysql.entity.shop.CakeShop +import com.cakk.domain.mysql.entity.user.BusinessInformation +import com.cakk.domain.mysql.entity.user.User +import com.navercorp.fixturemonkey.FixtureMonkey +import com.navercorp.fixturemonkey.api.introspector.BuilderArbitraryIntrospector +import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector +import com.navercorp.fixturemonkey.api.introspector.FieldReflectionArbitraryIntrospector +import com.navercorp.fixturemonkey.customizer.Values +import com.navercorp.fixturemonkey.jakarta.validation.plugin.JakartaValidationPlugin +import net.jqwik.api.Arbitraries +import org.locationtech.jts.geom.Coordinate +import org.locationtech.jts.geom.GeometryFactory +import org.locationtech.jts.geom.Point +import org.locationtech.jts.geom.PrecisionModel + +abstract class DomainTest { + + protected val reflectionMonkey: FixtureMonkey + protected get() = FixtureMonkey.builder() + .plugin(JakartaValidationPlugin()) + .objectIntrospector(FieldReflectionArbitraryIntrospector.INSTANCE) + .build() + protected val constructorMonkey: FixtureMonkey + protected get() = FixtureMonkey.builder() + .plugin(JakartaValidationPlugin()) + .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE) + .build() + protected val builderMonkey: FixtureMonkey + protected get() = FixtureMonkey.builder() + .plugin(JakartaValidationPlugin()) + .objectIntrospector(BuilderArbitraryIntrospector.INSTANCE) + .build() + + protected fun getUserFixture(role: Role?): User { + return constructorMonkey.giveMeBuilder(User::class.java) + .set("id", Arbitraries.longs().greaterOrEqual(10)) + .set("email", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(50)) + .set("role", role) + .sample() + } + + protected val verificationPolicy: VerificationPolicy + protected get() = DefaultVerificationPolicy() + protected val cakeShopFixture: CakeShop + protected get() = constructorMonkey.giveMeBuilder(CakeShop::class.java) + .set("shopName", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(30)) + .set("shopBio", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(40)) + .set("shopDescription", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(500)) + .set("likeCount", 0) + .set("heartCount", 0) + .set("location", supplyPointBy( + Arbitraries.doubles().between(-90.0, 90.0).sample(), + Arbitraries.doubles().between(-180.0, 180.0).sample()) + ) + .sample() + + protected fun getBusinessInformationFixtureWithCakeShop(verificationStatus: VerificationStatus?): BusinessInformation { + return constructorMonkey.giveMeBuilder(BusinessInformation::class.java) + .set("businessNumber", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(20)) + .set("cakeShop", Values.just(cakeShopFixture)) + .set("verificationStatus", verificationStatus) + .setNull("user") + .sample() + } + + protected fun getCertificationParamFixtureWithUser(user: User?): CertificationParam { + return constructorMonkey.giveMeBuilder(CertificationParam::class.java) + .set("businessRegistrationImageUrl", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(20)) + .set("idCardImageUrl", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(20)) + .set("cakeShopId", Arbitraries.longs().greaterOrEqual(0)) + .set("emergencyContact", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(20)) + .set("message", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(20)) + .set("user", user) + .sample() + } + + protected val cakeFixture: Cake + protected get() = constructorMonkey.giveMeBuilder(Cake::class.java) + .set("cakeImageUrl", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(50)) + .set("cakeShop", Values.just(cakeShopFixture)) + .sample() + + companion object { + private const val SPATIAL_REFERENCE_IDENTIFIER_NUMBER = 4326 + private val geometryFactory = GeometryFactory( + PrecisionModel(), + SPATIAL_REFERENCE_IDENTIFIER_NUMBER + ) + + protected fun supplyPointBy(latitude: Double?, longitude: Double?): Point { + return geometryFactory.createPoint(Coordinate(longitude!!, latitude!!)) + } + } +} + diff --git a/cakk-domain/mysql/src/test/java/com/cakk/domain/base/FacadeTest.java b/cakk-domain/mysql/src/test/java/com/cakk/domain/base/FacadeTest.java deleted file mode 100644 index 9d8942ac..00000000 --- a/cakk-domain/mysql/src/test/java/com/cakk/domain/base/FacadeTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.cakk.domain.base; - -import java.time.LocalDate; - -import org.junit.jupiter.api.extension.ExtendWith; -import org.locationtech.jts.geom.Coordinate; -import org.locationtech.jts.geom.GeometryFactory; -import org.locationtech.jts.geom.Point; -import org.locationtech.jts.geom.PrecisionModel; -import org.mockito.junit.jupiter.MockitoExtension; - -import net.jqwik.api.Arbitraries; - -import com.navercorp.fixturemonkey.FixtureMonkey; -import com.navercorp.fixturemonkey.api.introspector.BuilderArbitraryIntrospector; -import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector; -import com.navercorp.fixturemonkey.api.introspector.FieldReflectionArbitraryIntrospector; -import com.navercorp.fixturemonkey.customizer.Values; -import com.navercorp.fixturemonkey.jakarta.validation.plugin.JakartaValidationPlugin; - -import com.cakk.common.enums.Provider; -import com.cakk.common.enums.Role; -import com.cakk.domain.mysql.entity.cake.Cake; -import com.cakk.domain.mysql.entity.shop.CakeShop; -import com.cakk.domain.mysql.entity.user.User; - -@ExtendWith(MockitoExtension.class) -public abstract class FacadeTest { - - private static final int SPATIAL_REFERENCE_IDENTIFIER_NUMBER = 4326; - - private static final GeometryFactory geometryFactory = new GeometryFactory( - new PrecisionModel(), - SPATIAL_REFERENCE_IDENTIFIER_NUMBER - ); - - protected final FixtureMonkey getConstructorMonkey() { - return FixtureMonkey.builder() - .plugin(new JakartaValidationPlugin()) - .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE) - .build(); - } - - protected final FixtureMonkey getReflectionMonkey() { - return FixtureMonkey.builder() - .plugin(new JakartaValidationPlugin()) - .objectIntrospector(FieldReflectionArbitraryIntrospector.INSTANCE) - .build(); - } - - protected final FixtureMonkey getBuilderMonkey() { - return FixtureMonkey.builder() - .plugin(new JakartaValidationPlugin()) - .objectIntrospector(BuilderArbitraryIntrospector.INSTANCE) - .build(); - } - - protected User getUserFixture(final Role role) { - return getConstructorMonkey().giveMeBuilder(User.class) - .set("id", Arbitraries.longs().greaterOrEqual(10)) - .set("provider", Arbitraries.of(Provider.class)) - .set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) - .set("email", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) - .set("nickname", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) - .set("birthday", LocalDate.now()) - .set("role", role) - .sample(); - } - - protected Cake getCakeFixture() { - return getConstructorMonkey().giveMeBuilder(Cake.class) - .set("cakeImageUrl", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(50)) - .set("cakeShop", Values.just(getCakeShopFixture())) - .sample(); - } - - protected CakeShop getCakeShopFixture() { - return getConstructorMonkey().giveMeBuilder(CakeShop.class) - .set("shopName", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(30)) - .set("shopBio", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(40)) - .set("shopDescription", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(500)) - .set("likeCount", 0) - .set("heartCount", 0) - .set("location", supplyPointBy( - Arbitraries.doubles().between(-90, 90).sample(), - Arbitraries.doubles().between(-180, 180).sample()) - ) - .sample(); - } - - public static Point supplyPointBy(Double latitude, Double longitude) { - return geometryFactory.createPoint(new Coordinate(longitude, latitude)); - } -} diff --git a/cakk-domain/mysql/src/test/java/com/cakk/domain/base/FacadeTest.kt b/cakk-domain/mysql/src/test/java/com/cakk/domain/base/FacadeTest.kt new file mode 100644 index 00000000..468db72d --- /dev/null +++ b/cakk-domain/mysql/src/test/java/com/cakk/domain/base/FacadeTest.kt @@ -0,0 +1,88 @@ +package com.cakk.domain.base + +import com.cakk.common.enums.Provider +import com.cakk.common.enums.Role +import com.cakk.domain.mysql.entity.cake.Cake +import com.cakk.domain.mysql.entity.shop.CakeShop +import com.cakk.domain.mysql.entity.user.User +import com.navercorp.fixturemonkey.FixtureMonkey +import com.navercorp.fixturemonkey.api.introspector.BuilderArbitraryIntrospector +import com.navercorp.fixturemonkey.api.introspector.ConstructorPropertiesArbitraryIntrospector +import com.navercorp.fixturemonkey.api.introspector.FieldReflectionArbitraryIntrospector +import com.navercorp.fixturemonkey.customizer.Values +import com.navercorp.fixturemonkey.jakarta.validation.plugin.JakartaValidationPlugin +import net.jqwik.api.Arbitraries +import org.junit.jupiter.api.extension.ExtendWith +import org.locationtech.jts.geom.Coordinate +import org.locationtech.jts.geom.GeometryFactory +import org.locationtech.jts.geom.Point +import org.locationtech.jts.geom.PrecisionModel +import org.mockito.junit.jupiter.MockitoExtension +import java.time.LocalDate + +@ExtendWith(MockitoExtension::class) +abstract class FacadeTest { + + private fun constructorMonkey(): FixtureMonkey { + return FixtureMonkey.builder() + .plugin(JakartaValidationPlugin()) + .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE) + .build() + } + protected fun reflectionMonkey(): FixtureMonkey { + return FixtureMonkey.builder() + .plugin(JakartaValidationPlugin()) + .objectIntrospector(FieldReflectionArbitraryIntrospector.INSTANCE) + .build() + } + + protected fun builderMonkey(): FixtureMonkey { + return FixtureMonkey.builder() + .plugin(JakartaValidationPlugin()) + .objectIntrospector(BuilderArbitraryIntrospector.INSTANCE) + .build() + } + + protected fun getUserFixture(role: Role?): User { + return constructorMonkey().giveMeBuilder(User::class.java) + .set("id", Arbitraries.longs().greaterOrEqual(10)) + .set("provider", Arbitraries.of(Provider::class.java)) + .set("providerId", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) + .set("email", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) + .set("nickname", Arbitraries.strings().withCharRange('a', 'z').ofMinLength(1).ofMaxLength(50)) + .set("birthday", LocalDate.now()) + .set("role", role) + .sample() + } + + protected val cakeFixture: Cake + protected get() = constructorMonkey().giveMeBuilder(Cake::class.java) + .set("cakeImageUrl", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(50)) + .set("cakeShop", Values.just(cakeShopFixture)) + .sample() + protected val cakeShopFixture: CakeShop + protected get() = constructorMonkey().giveMeBuilder(CakeShop::class.java) + .set("shopName", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(30)) + .set("shopBio", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(40)) + .set("shopDescription", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(500)) + .set("likeCount", 0) + .set("heartCount", 0) + .set("location", supplyPointBy( + Arbitraries.doubles().between(-90.0, 90.0).sample(), + Arbitraries.doubles().between(-180.0, 180.0).sample()) + ) + .sample() + + companion object { + private const val SPATIAL_REFERENCE_IDENTIFIER_NUMBER = 4326 + private val geometryFactory = GeometryFactory( + PrecisionModel(), + SPATIAL_REFERENCE_IDENTIFIER_NUMBER + ) + + fun supplyPointBy(latitude: Double?, longitude: Double?): Point { + return geometryFactory.createPoint(Coordinate(longitude!!, latitude!!)) + } + } +} + diff --git a/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/BusinessInformationTest.java b/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/BusinessInformationTest.java deleted file mode 100644 index 6406ca7b..00000000 --- a/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/BusinessInformationTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.cakk.domain.entity.user; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import net.jqwik.api.Arbitraries; - -import com.navercorp.fixturemonkey.customizer.Values; - -import com.cakk.common.enums.Role; -import com.cakk.common.enums.VerificationStatus; -import com.cakk.domain.base.DomainTest; -import com.cakk.domain.mysql.bo.user.VerificationPolicy; -import com.cakk.domain.mysql.dto.param.user.CertificationParam; -import com.cakk.domain.mysql.entity.user.BusinessInformation; -import com.cakk.domain.mysql.entity.user.User; -import com.cakk.domain.mysql.event.shop.CertificationEvent; - - -class BusinessInformationTest extends DomainTest { - - private BusinessInformation getBusinessInformationFixtureWithUser(VerificationStatus verificationStatus, Role role) { - return getConstructorMonkey().giveMeBuilder(BusinessInformation.class) - .setNotNull("businessNumber") - .set("businessNumber", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(20)) - .set("cakeShop", getCakeShopFixture()) - .set("verificationStatus", verificationStatus) - .set("user", Values.just(getUserFixture(role))) - .sample(); - } - - @Test - @DisplayName("사장님 인증되지 않은 케이크 샵이 존재할 때, 가게 정보와 함께 서비스에 인증요청을 한다") - void registerCertificationInformation1() { - //given - BusinessInformation businessInformation = getBusinessInformationFixtureWithCakeShop(VerificationStatus.UNREQUESTED); - User user = getUserFixture(Role.USER); - CertificationParam param = getCertificationParamFixtureWithUser(user); - String shopName = businessInformation.getCakeShop().getShopName(); - - //when - CertificationEvent certificationEvent = businessInformation.registerCertificationInformation(param); - - //then - assertThat(businessInformation.getVerificationStatus()).isEqualTo(VerificationStatus.PENDING); - assertThat(businessInformation.getBusinessRegistrationImageUrl()).isEqualTo(param.businessRegistrationImageUrl()); - assertThat(businessInformation.getIdCardImageUrl()).isEqualTo(param.idCardImageUrl()); - assertThat(businessInformation.getEmergencyContact()).isEqualTo(param.emergencyContact()); - assertThat(certificationEvent.shopName()).isEqualTo(shopName); - } - - @Test - @DisplayName("사용자는 케이크샵의 주인으로 승격된다") - void promotedByBusinessOwner() { - //given - BusinessInformation businessInformation = getBusinessInformationFixtureWithCakeShop(VerificationStatus.PENDING); - VerificationPolicy verificationPolicy = getVerificationPolicy(); - User user = getUserFixture(Role.USER); - - //when - businessInformation.updateBusinessOwner(verificationPolicy, user); - - //then - assertThat(businessInformation.getUser()).isNotNull(); - assertThat(businessInformation.getUser().getRole()).isEqualTo(Role.USER); - assertThat(businessInformation.getVerificationStatus()).isEqualTo(VerificationStatus.APPROVED); - } - - @Test - @DisplayName("예비 사장님 여부 검사에서 인증 요청 상태라면, True를 반환한다") - void isPendingVerificationTrue() { - //given - BusinessInformation businessInformation = getBusinessInformationFixtureWithUser(VerificationStatus.PENDING, Role.USER); - VerificationPolicy verificationPolicy = getVerificationPolicy(); - - //then - assertThat(businessInformation.isBusinessOwnerCandidate(verificationPolicy)).isTrue(); - } - - @Test - @DisplayName("예비 사장님 여부 검사에서 인증 완료 상태라면, False를 반환한다") - void isPendingVerificationFalse1() { - //given - BusinessInformation businessInformation = getBusinessInformationFixtureWithUser(VerificationStatus.APPROVED, Role.USER); - VerificationPolicy verificationPolicy = getVerificationPolicy(); - - //then - assertThat(businessInformation.isBusinessOwnerCandidate(verificationPolicy)).isFalse(); - } - - @Test - @DisplayName("예비 사장님 여부 검사에서 인증 완료 상태라면, False를 반환한다") - void isPendingVerificationFalse2() { - //given - BusinessInformation businessInformation = getBusinessInformationFixtureWithUser(VerificationStatus.APPROVED, Role.USER); - VerificationPolicy verificationPolicy = getVerificationPolicy(); - - //then - assertThat(businessInformation.isBusinessOwnerCandidate(verificationPolicy)).isFalse(); - } - - @Test - @DisplayName("예비 사장님 여부 검사에서 인증 요청 상태도 아니라면, False를 반환한다") - void isPendingVerificationFalse3() { - //given - BusinessInformation businessInformation = getBusinessInformationFixtureWithUser(VerificationStatus.UNREQUESTED, Role.USER); - VerificationPolicy verificationPolicy = getVerificationPolicy(); - - //then - assertThat(businessInformation.isBusinessOwnerCandidate(verificationPolicy)).isFalse(); - } -} - diff --git a/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/BusinessInformationTest.kt b/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/BusinessInformationTest.kt new file mode 100644 index 00000000..2317228d --- /dev/null +++ b/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/BusinessInformationTest.kt @@ -0,0 +1,106 @@ +package com.cakk.domain.entity.user + +import com.cakk.common.enums.Role +import com.cakk.common.enums.VerificationStatus +import com.cakk.domain.base.DomainTest +import com.cakk.domain.mysql.entity.user.BusinessInformation +import com.navercorp.fixturemonkey.customizer.Values +import net.jqwik.api.Arbitraries +import org.assertj.core.api.Assertions +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class BusinessInformationTest : DomainTest() { + + private fun getBusinessInformationFixtureWithUser(verificationStatus: VerificationStatus, role: Role): BusinessInformation { + return constructorMonkey.giveMeBuilder(BusinessInformation::class.java) + .setNotNull("businessNumber") + .set("businessNumber", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(20)) + .set("cakeShop", cakeShopFixture) + .set("verificationStatus", verificationStatus) + .set("user", Values.just(getUserFixture(role))) + .sample() + } + + @Test + @DisplayName("사장님 인증되지 않은 케이크 샵이 존재할 때, 가게 정보와 함께 서비스에 인증요청을 한다") + fun registerCertificationInformation1() { + //given + val businessInformation = getBusinessInformationFixtureWithCakeShop(VerificationStatus.UNREQUESTED) + val user = getUserFixture(Role.USER) + val param = getCertificationParamFixtureWithUser(user) + val shopName = businessInformation.cakeShop.shopName + + //when + val certificationEvent = businessInformation.registerCertificationInformation(param) + + //then + Assertions.assertThat(businessInformation.verificationStatus).isEqualTo(VerificationStatus.PENDING) + Assertions.assertThat(businessInformation.businessRegistrationImageUrl).isEqualTo(param.businessRegistrationImageUrl) + Assertions.assertThat(businessInformation.idCardImageUrl).isEqualTo(param.idCardImageUrl) + Assertions.assertThat(businessInformation.emergencyContact).isEqualTo(param.emergencyContact) + Assertions.assertThat(certificationEvent.shopName).isEqualTo(shopName) + } + + @Test + @DisplayName("사용자는 케이크샵의 주인으로 승격된다") + fun promotedByBusinessOwner() { + //given + val businessInformation = getBusinessInformationFixtureWithCakeShop(VerificationStatus.PENDING) + val verificationPolicy = verificationPolicy + val user = getUserFixture(Role.USER) + + //when + businessInformation.updateBusinessOwner(verificationPolicy, user) + + //then + Assertions.assertThat(businessInformation.user).isNotNull + Assertions.assertThat(businessInformation.user.role).isEqualTo(Role.USER) + Assertions.assertThat(businessInformation.verificationStatus).isEqualTo(VerificationStatus.APPROVED) + } + + @DisplayName("예비 사장님 여부 검사에서 인증 요청 상태라면, True를 반환한다") + @Test + fun isPendingVerificationTrue() { + //given + val businessInformation = getBusinessInformationFixtureWithUser(VerificationStatus.PENDING, Role.USER) + val verificationPolicy = verificationPolicy + + //then + Assertions.assertThat(businessInformation.isBusinessOwnerCandidate(verificationPolicy)).isTrue + } + + @DisplayName("예비 사장님 여부 검사에서 인증 완료 상태라면, False를 반환한다") + @Test + fun isPendingVerificationFalse1() { + //given + val businessInformation = getBusinessInformationFixtureWithUser(VerificationStatus.APPROVED, Role.USER) + val verificationPolicy = verificationPolicy + + //then + Assertions.assertThat(businessInformation.isBusinessOwnerCandidate(verificationPolicy)).isFalse + } + + @DisplayName("예비 사장님 여부 검사에서 인증 완료 상태라면, False를 반환한다") + @Test + fun isPendingVerificationFalse2() { + //given + val businessInformation = getBusinessInformationFixtureWithUser(VerificationStatus.APPROVED, Role.USER) + val verificationPolicy = verificationPolicy + + //then + Assertions.assertThat(businessInformation.isBusinessOwnerCandidate(verificationPolicy)).isFalse + } + + @DisplayName("예비 사장님 여부 검사에서 인증 요청 상태도 아니라면, False를 반환한다") + @Test + fun isPendingVerificationFalse3() { + //given + val businessInformation = getBusinessInformationFixtureWithUser(VerificationStatus.UNREQUESTED, Role.USER) + val verificationPolicy = verificationPolicy + + //then + Assertions.assertThat(businessInformation.isBusinessOwnerCandidate(verificationPolicy)).isFalse + } +} + diff --git a/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/VerificationPolicyTest.java b/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/VerificationPolicyTest.java deleted file mode 100644 index 383e0849..00000000 --- a/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/VerificationPolicyTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.cakk.domain.entity.user; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import com.cakk.common.enums.Role; -import com.cakk.common.enums.VerificationStatus; -import com.cakk.common.exception.CakkException; -import com.cakk.domain.base.DomainTest; -import com.cakk.domain.mysql.bo.user.VerificationPolicy; -import com.cakk.domain.mysql.dto.param.user.CertificationParam; -import com.cakk.domain.mysql.entity.user.BusinessInformation; -import com.cakk.domain.mysql.entity.user.User; - -public class VerificationPolicyTest extends DomainTest { - - @Test - @DisplayName("인증 정책은 사용자를 케이크샵 주인으로 승격시켜준다") - void approveToBusinessOwner() { - VerificationPolicy verificationPolicy = getVerificationPolicy(); - - VerificationStatus verificationStatus = verificationPolicy.approveToBusinessOwner(VerificationStatus.PENDING); - - assertThat(verificationStatus).isEqualTo(VerificationStatus.APPROVED); - } - - @Test - @DisplayName("인증 정책은 사용자의 권한이 BUSINESS_OWNER가 아니고 인증 진행중이라면 케이크샵 주인 후보임을 알려준다") - void isCandidate() { - VerificationPolicy verificationPolicy = getVerificationPolicy(); - - assertThat(verificationPolicy.isCandidate(VerificationStatus.PENDING)).isTrue(); - } - - @Test - @DisplayName("사장님 인증된 케이크 샵이 존재할 때, 인증 요청에 실패한다") - void registerCertificationInformation2() { - //given - VerificationPolicy verificationPolicy = getVerificationPolicy(); - BusinessInformation businessInformation = getBusinessInformationFixtureWithCakeShop(VerificationStatus.APPROVED); - User user = getUserFixture(Role.USER); - CertificationParam param = getCertificationParamFixtureWithUser(user); - - //when, then - Assertions.assertThrowsExactly(CakkException.class, - () -> verificationPolicy.requestCertificationBusinessOwner(businessInformation, param)); - } - - @Test - @DisplayName("사장님 인증 요청이 진행중일 때, 인증 요청에 실패한다") - void registerCertificationInformation3() { - //given - VerificationPolicy verificationPolicy = getVerificationPolicy(); - BusinessInformation businessInformation = getBusinessInformationFixtureWithCakeShop(VerificationStatus.PENDING); - User user = getUserFixture(Role.USER); - CertificationParam param = getCertificationParamFixtureWithUser(user); - - //when, then - Assertions.assertThrowsExactly(CakkException.class, - () -> verificationPolicy.requestCertificationBusinessOwner(businessInformation, param)); - } - - @Test - @DisplayName("사장님 인증 요청이 거절 됐을 때, 인증 요청에 실패한다") - void registerCertificationInformation4() { - //given - VerificationPolicy verificationPolicy = getVerificationPolicy(); - BusinessInformation businessInformation = getBusinessInformationFixtureWithCakeShop(VerificationStatus.REJECTED); - User user = getUserFixture(Role.USER); - CertificationParam param = getCertificationParamFixtureWithUser(user); - - //when, then - Assertions.assertThrowsExactly(CakkException.class, - () -> verificationPolicy.requestCertificationBusinessOwner(businessInformation, param)); - } -} - diff --git a/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/VerificationPolicyTest.kt b/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/VerificationPolicyTest.kt new file mode 100644 index 00000000..db4148c1 --- /dev/null +++ b/cakk-domain/mysql/src/test/java/com/cakk/domain/entity/user/VerificationPolicyTest.kt @@ -0,0 +1,71 @@ +package com.cakk.domain.entity.user + +import com.cakk.common.enums.Role +import com.cakk.common.enums.VerificationStatus +import com.cakk.common.exception.CakkException +import com.cakk.domain.base.DomainTest +import org.assertj.core.api.Assertions +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +class VerificationPolicyTest : DomainTest() { + + @Test + @DisplayName("인증 정책은 사용자를 케이크샵 주인으로 승격시켜준다") + fun approveToBusinessOwner() { + val verificationPolicy = verificationPolicy + val verificationStatus = verificationPolicy.approveToBusinessOwner(VerificationStatus.PENDING) + Assertions.assertThat(verificationStatus).isEqualTo(VerificationStatus.APPROVED) + } + + @get:DisplayName("인증 정책은 사용자의 권한이 BUSINESS_OWNER가 아니고 인증 진행중이라면 케이크샵 주인 후보임을 알려준다") + @get:Test + val isCandidate: Unit + get() { + val verificationPolicy = verificationPolicy + Assertions.assertThat(verificationPolicy.isCandidate(VerificationStatus.PENDING)).isTrue + } + + @Test + @DisplayName("사장님 인증된 케이크 샵이 존재할 때, 인증 요청에 실패한다") + fun registerCertificationInformation2() { + //given + val verificationPolicy = verificationPolicy + val businessInformation = getBusinessInformationFixtureWithCakeShop(VerificationStatus.APPROVED) + val user = getUserFixture(Role.USER) + val param = getCertificationParamFixtureWithUser(user) + + //when, then + org.junit.jupiter.api.Assertions.assertThrowsExactly(CakkException::class.java + ) { verificationPolicy.requestCertificationBusinessOwner(businessInformation, param) } + } + + @Test + @DisplayName("사장님 인증 요청이 진행중일 때, 인증 요청에 실패한다") + fun registerCertificationInformation3() { + //given + val verificationPolicy = verificationPolicy + val businessInformation = getBusinessInformationFixtureWithCakeShop(VerificationStatus.PENDING) + val user = getUserFixture(Role.USER) + val param = getCertificationParamFixtureWithUser(user) + + //when, then + org.junit.jupiter.api.Assertions.assertThrowsExactly(CakkException::class.java + ) { verificationPolicy.requestCertificationBusinessOwner(businessInformation, param) } + } + + @Test + @DisplayName("사장님 인증 요청이 거절 됐을 때, 인증 요청에 실패한다") + fun registerCertificationInformation4() { + //given + val verificationPolicy = verificationPolicy + val businessInformation = getBusinessInformationFixtureWithCakeShop(VerificationStatus.REJECTED) + val user = getUserFixture(Role.USER) + val param = getCertificationParamFixtureWithUser(user) + + //when, then + org.junit.jupiter.api.Assertions.assertThrowsExactly(CakkException::class.java + ) { verificationPolicy.requestCertificationBusinessOwner(businessInformation, param) } + } +} + diff --git a/cakk-domain/redis/build.gradle b/cakk-domain/redis/build.gradle.kts similarity index 52% rename from cakk-domain/redis/build.gradle rename to cakk-domain/redis/build.gradle.kts index b379b26f..7dba6c1c 100644 --- a/cakk-domain/redis/build.gradle +++ b/cakk-domain/redis/build.gradle.kts @@ -1,16 +1,16 @@ description = "redis module" dependencies { - implementation project(':cakk-common') + implementation(project(":cakk-common")) - implementation('org.springframework.boot:spring-boot-starter-data-redis') + implementation("org.springframework.boot:spring-boot-starter-data-redis") implementation("org.redisson:redisson-spring-boot-starter:3.31.0") } -bootJar { +tasks.bootJar { enabled = false } -jar { +tasks.jar { enabled = true }