diff --git a/src/main/java/clap/server/adapter/outbound/persistense/CategoryPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/CategoryPersistenceAdapter.java index e99883db..c34d1539 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/CategoryPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/CategoryPersistenceAdapter.java @@ -50,10 +50,17 @@ public List findSubCategory() { } @Override - public boolean existsByNameOrCode(String name, String code) { - return categoryRepository.existsByNameOrCodeAndIsDeletedFalse(name, code); + public boolean existsMainCategoryByNameOrCode(String name, String code) { + return categoryRepository.existsByNameOrCodeAndMainCategoryIsNullAndIsDeletedFalse(name, code); } + @Override + public boolean existsSubCategoryByNameOrCode(Category category, String name, String code) { + CategoryEntity categoryEntity = categoryPersistenceMapper.toEntity(category); + return categoryRepository.existsByMainCategoryAndIsDeletedFalseAndNameOrCode(categoryEntity, name, code); + } + + @Override public void save(final Category category) { categoryRepository.save(categoryPersistenceMapper.toEntity(category)); diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/CategoryRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/CategoryRepository.java index 5cdcc2b1..b2cdf46c 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/CategoryRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/CategoryRepository.java @@ -1,6 +1,8 @@ package clap.server.adapter.outbound.persistense.repository.task; import clap.server.adapter.outbound.persistense.entity.task.CategoryEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -12,5 +14,9 @@ public interface CategoryRepository extends JpaRepository List findByIsDeletedFalseAndMainCategoryIsNull(); List findByIsDeletedFalseAndMainCategoryIsNotNull(); - boolean existsByNameOrCodeAndIsDeletedFalse(String name, String code); + @Query("SELECT CASE WHEN COUNT(c) > 0 THEN true ELSE false END FROM CategoryEntity c WHERE c.mainCategory IS NULL AND c.isDeleted = false AND (c.name = :name OR c.code = :code)") + boolean existsByNameOrCodeAndMainCategoryIsNullAndIsDeletedFalse(@Param("name") String name, @Param("code") String code); + + @Query("SELECT CASE WHEN COUNT(c) > 0 THEN true ELSE false END FROM CategoryEntity c WHERE c.mainCategory = :mainCategory AND c.isDeleted = false AND (c.name = :name OR c.code = :code)") + boolean existsByMainCategoryAndIsDeletedFalseAndNameOrCode(@Param("mainCategory")CategoryEntity mainCategory, @Param("name") String name, @Param("code") String code); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/outbound/task/LoadCategoryPort.java b/src/main/java/clap/server/application/port/outbound/task/LoadCategoryPort.java index 2533e8ff..9349f583 100644 --- a/src/main/java/clap/server/application/port/outbound/task/LoadCategoryPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/LoadCategoryPort.java @@ -12,5 +12,7 @@ public interface LoadCategoryPort { List findMainCategory(); List findSubCategory(); - boolean existsByNameOrCode(String name, String code); + boolean existsMainCategoryByNameOrCode(String name, String code); + + boolean existsSubCategoryByNameOrCode(Category category, String name, String code); } diff --git a/src/main/java/clap/server/application/service/admin/AddCategoryService.java b/src/main/java/clap/server/application/service/admin/AddCategoryService.java index 4b934dc4..ff2476cb 100644 --- a/src/main/java/clap/server/application/service/admin/AddCategoryService.java +++ b/src/main/java/clap/server/application/service/admin/AddCategoryService.java @@ -29,7 +29,7 @@ public class AddCategoryService implements AddMainCategoryUsecase, AddSubCategor @Transactional public void addMainCategory(Long adminId, String code, String name) { Optional activeMember = loadMemberPort.findActiveMemberById(adminId); - if (loadCategoryPort.existsByNameOrCode(name, code)) throw new ApplicationException(CATEGORY_DUPLICATE); + if (loadCategoryPort.existsMainCategoryByNameOrCode(name, code)) throw new ApplicationException(CATEGORY_DUPLICATE); Category mainCategory = Category.createMainCategory( activeMember.orElseThrow(() -> new ApplicationException(ACTIVE_MEMBER_NOT_FOUND)), code, name); @@ -39,13 +39,11 @@ public void addMainCategory(Long adminId, String code, String name) { @Override @Transactional public void addSubCategory(Long adminId, Long mainCategoryId, String code, String name, String descriptionExample) { - Optional activeMember = loadMemberPort.findActiveMemberById(adminId); - Optional mainCategory = loadCategoryPort.findById(mainCategoryId); - if (loadCategoryPort.existsByNameOrCode(name, code)) throw new ApplicationException(CATEGORY_DUPLICATE); - Category subCategory = Category.createSubCategory( - activeMember.orElseThrow(() -> new ApplicationException(ACTIVE_MEMBER_NOT_FOUND)), - mainCategory.orElseThrow(() -> new ApplicationException(CATEGORY_NOT_FOUND)), - code, name, descriptionExample); + Member activeMember = loadMemberPort.findActiveMemberById(adminId).orElseThrow(() -> new ApplicationException(ACTIVE_MEMBER_NOT_FOUND)); + Category mainCategory = loadCategoryPort.findById(mainCategoryId).orElseThrow(() -> new ApplicationException(CATEGORY_NOT_FOUND)); + + if (loadCategoryPort.existsSubCategoryByNameOrCode(mainCategory, name, code)) throw new ApplicationException(CATEGORY_DUPLICATE); + Category subCategory = Category.createSubCategory(activeMember, mainCategory,code, name, descriptionExample); commandCategoryPort.save(subCategory); } } \ No newline at end of file diff --git a/src/main/java/clap/server/application/service/admin/UpdateCategoryService.java b/src/main/java/clap/server/application/service/admin/UpdateCategoryService.java index cae97710..4c06415b 100644 --- a/src/main/java/clap/server/application/service/admin/UpdateCategoryService.java +++ b/src/main/java/clap/server/application/service/admin/UpdateCategoryService.java @@ -26,9 +26,15 @@ public class UpdateCategoryService implements UpdateCategoryUsecase { @Transactional public void updateCategory(Long adminId, Long categoryId, String name, String code, String descriptionExample) { Member admin = loadMemberPort.findActiveMemberById(adminId).orElseThrow(() -> new ApplicationException(ACTIVE_MEMBER_NOT_FOUND)); - if (loadCategoryPort.existsByNameOrCode(name, code)) throw new ApplicationException(CATEGORY_DUPLICATE); - Category category = loadCategoryPort.findById(categoryId) - .orElseThrow(() -> new ApplicationException(CATEGORY_NOT_FOUND)); + Category category = loadCategoryPort.findById(categoryId).orElseThrow(() -> new ApplicationException(CATEGORY_NOT_FOUND)); + boolean isDuplicate; + if (category.getMainCategory() == null) { + isDuplicate = loadCategoryPort.existsMainCategoryByNameOrCode(name, code); + } else { + isDuplicate = loadCategoryPort.existsSubCategoryByNameOrCode(category.getMainCategory(), name, code); + } + if (isDuplicate) throw new ApplicationException(CATEGORY_DUPLICATE); + category.updateCategory(admin, name, code, descriptionExample); commandCategoryPort.save(category); }