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 29ae73d9..c02913b6 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 @@ -23,14 +23,15 @@ import com.cakk.domain.mysql.dto.param.cake.CakeImageResponseParam; import com.cakk.domain.mysql.dto.param.cake.CakeUpdateParam; import com.cakk.domain.mysql.entity.cake.Cake; +import com.cakk.domain.mysql.entity.cake.CakeCategory; 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.facade.cake.CakeManagerFacade; 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.mysql.repository.writer.CakeWriter; -import com.cakk.domain.mysql.repository.writer.TagWriter; import com.cakk.domain.redis.repository.CakeViewsRedisRepository; @Transactional(readOnly = true) @@ -41,10 +42,9 @@ public class CakeService { private final CakeReader cakeReader; private final CakeWriter cakeWriter; private final TagReader tagReader; - private final TagWriter tagWriter; private final CakeShopReader cakeShopReader; private final CakeViewsRedisRepository cakeViewsRedisRepository; - + private final CakeManagerFacade cakeManagerFacade; private final ApplicationEventPublisher publisher; public CakeImageListResponse findCakeImagesByCursorAndCategory(final CakeSearchByCategoryRequest dto) { @@ -92,37 +92,28 @@ public CakeDetailResponse findCakeDetailById(Long cakeId) { @Transactional public void createCake(CakeCreateParam param) { - CakeShop cakeShop = cakeShopReader.searchByIdAndOwner(param.cakeShopId(), param.owner()); - Cake cake = param.cake(); - List tags = param.tagNames() - .stream() - .map(tagName -> tagReader.findByTagName(tagName).orElseGet(() -> tagWriter.saveTag(tagName))) - .toList(); - - cake.registerTags(tags); - cake.registerCategories(param.cakeCategories()); - cakeShop.registerCake(cake); + final CakeShop cakeShop = cakeShopReader.searchByIdAndOwner(param.cakeShopId(), param.owner()); + final Cake cake = param.cake(); + final List tags = tagReader.getTagsByTagName(param.tagNames()); + final List cakeCategories = param.cakeCategories(); + + cakeManagerFacade.createCake(cakeShop, cake, tags, cakeCategories); } @Transactional public void updateCake(CakeUpdateParam param) { final Cake cake = cakeReader.findWithCakeTagsAndCakeCategories(param.cakeId(), param.owner()); - List tags = param.tagNames() - .stream() - .map(tagName -> tagReader.findByTagName(tagName).orElseGet(() -> tagWriter.saveTag(tagName))) - .toList(); - - cake.updateCakeImageUrl(param.cakeImageUrl()); - cake.updateCakeCategories(param.cakeCategories()); - cake.updateCakeTags(tags); + final List tags = tagReader.getTagsByTagName(param.tagNames()); + final String cakeImageUrl = param.cakeImageUrl(); + final List cakeCategories = param.cakeCategories(); + + cakeManagerFacade.updateCake(cake, cakeImageUrl, tags, cakeCategories); } @Transactional public void deleteCake(User owner, Long cakeId) { final Cake cake = cakeReader.findWithCakeTagsAndCakeCategories(cakeId, owner); - cake.removeCakeCategories(); - cake.removeCakeTags(); cakeWriter.deleteCake(cake); } } 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 b67a1b19..aaea47ed 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 @@ -121,7 +121,7 @@ public CakeShopByMineResponse getMyBusinessId(final User user) { return ShopMapper.supplyCakeShopByMineResponseBy(result); } - @Transactional(readOnly = true) + @Transactional public void requestCertificationBusinessOwner(final CertificationParam param) { final BusinessInformation businessInformation = cakeShopReader.findBusinessInformationByCakeShopId(param.cakeShopId()); final CertificationEvent certificationEvent = verificationPolicy diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/annotation/DomainFacade.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/annotation/DomainFacade.java index 3c07ddb4..b3ecb7e4 100644 --- a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/annotation/DomainFacade.java +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/annotation/DomainFacade.java @@ -8,28 +8,26 @@ import org.springframework.core.annotation.AliasFor; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; /** * Indicates that an annotated class is a "Service" (e.g. a domain service object). * - *

This annotation serves as a specialization of {@link Service @Service}, + *

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 Service */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented -@Service +@Component public @interface DomainFacade { /** - * Alias for {@link Service#value}. + * Alias for {@link Component#value}. */ - @AliasFor(annotation = Service.class) + @AliasFor(annotation = Component.class) String value() default ""; } diff --git a/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/facade/cake/CakeManagerFacade.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/facade/cake/CakeManagerFacade.java new file mode 100644 index 00000000..31850123 --- /dev/null +++ b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/facade/cake/CakeManagerFacade.java @@ -0,0 +1,25 @@ +package com.cakk.domain.mysql.facade.cake; + +import java.util.List; + +import com.cakk.domain.mysql.annotation.DomainFacade; +import com.cakk.domain.mysql.entity.cake.Cake; +import com.cakk.domain.mysql.entity.cake.CakeCategory; +import com.cakk.domain.mysql.entity.cake.Tag; +import com.cakk.domain.mysql.entity.shop.CakeShop; + +@DomainFacade +public class CakeManagerFacade { + + public void createCake(CakeShop cakeShop, Cake cake, List tags, List cakeCategories) { + cake.registerTags(tags); + cake.registerCategories(cakeCategories); + cakeShop.registerCake(cake); + } + + public void updateCake(Cake cake, String cakeImageUrl, List tags, List cakeCategories) { + cake.updateCakeImageUrl(cakeImageUrl); + cake.updateCakeCategories(cakeCategories); + cake.updateCakeTags(tags); + } +} 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 index 1e402b19..7186df2e 100644 --- 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 @@ -1,5 +1,6 @@ package com.cakk.domain.mysql.repository.jpa; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; @@ -11,4 +12,6 @@ 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/reader/TagReader.java b/cakk-domain/mysql/src/main/java/com/cakk/domain/mysql/repository/reader/TagReader.java index 9eab6f0b..1d14bd7f 100644 --- 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 @@ -1,11 +1,13 @@ package com.cakk.domain.mysql.repository.reader; +import java.util.List; import java.util.Optional; 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 @@ -17,4 +19,16 @@ public class TagReader { public Optional findByTagName(final String tagName) { return tagJpaRepository.findTagByTagName(tagName); } + + 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(); + } }