From 3898214303a52bce074b7bf8e1cf9c078e2c26c5 Mon Sep 17 00:00:00 2001 From: Jimin Lim <50178026+jimin3263@users.noreply.github.com> Date: Mon, 29 Jul 2024 11:26:16 +0900 Subject: [PATCH] =?UTF-8?q?[Feat=20#40]=20=EC=BB=A8=ED=85=90=EC=B8=A0=20?= =?UTF-8?q?=EC=B9=B4=EC=9A=B4=ED=8A=B8=20=EC=B9=BC=EB=9F=BC=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#41)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 오탈자 수정 * feat: 컨텐츠 카운트 칼럼 추가 --- .../{ContenAdapter.kt => ContentAdapter.kt} | 6 +++++- .../content/persist/ContentRepository.kt | 2 ++ ...tenAdapterTest.kt => ContentAdapterTest.kt} | 4 ++-- .../category/port/service/CategoryService.kt | 18 ++++++++++++------ .../com/pokit/content/port/out/ContentPort.kt | 2 ++ .../com/pokit/category/model/Category.kt | 1 + 6 files changed, 24 insertions(+), 9 deletions(-) rename adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/impl/{ContenAdapter.kt => ContentAdapter.kt} (86%) rename adapters/out-persistence/src/test/kotlin/com/pokit/out/persistence/content/impl/{ContenAdapterTest.kt => ContentAdapterTest.kt} (97%) diff --git a/adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/impl/ContenAdapter.kt b/adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/impl/ContentAdapter.kt similarity index 86% rename from adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/impl/ContenAdapter.kt rename to adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/impl/ContentAdapter.kt index c29d36da..f609ca5b 100644 --- a/adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/impl/ContenAdapter.kt +++ b/adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/impl/ContentAdapter.kt @@ -9,7 +9,7 @@ import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Repository @Repository -class ContenAdapter( +class ContentAdapter( private val contentRepository: ContentRepository ) : ContentPort { override fun loadByUserIdAndId(userId: Long, id: Long) = contentRepository.findByUserIdAndIdAndDeleted(userId, id) @@ -24,4 +24,8 @@ class ContenAdapter( contentRepository.findByIdOrNull(content.id) ?.delete() } + + override fun fetchContentCountByCategoryId(categoryId: Long): Int = + contentRepository.countByCategoryId(categoryId) + } diff --git a/adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/persist/ContentRepository.kt b/adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/persist/ContentRepository.kt index 5fb06e0d..0edf8cdc 100644 --- a/adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/persist/ContentRepository.kt +++ b/adapters/out-persistence/src/main/kotlin/com/pokit/out/persistence/content/persist/ContentRepository.kt @@ -17,4 +17,6 @@ interface ContentRepository : JpaRepository { @Param("userId") userId: Long, @Param("id") id: Long ): ContentEntity? + + fun countByCategoryId(id: Long): Int } diff --git a/adapters/out-persistence/src/test/kotlin/com/pokit/out/persistence/content/impl/ContenAdapterTest.kt b/adapters/out-persistence/src/test/kotlin/com/pokit/out/persistence/content/impl/ContentAdapterTest.kt similarity index 97% rename from adapters/out-persistence/src/test/kotlin/com/pokit/out/persistence/content/impl/ContenAdapterTest.kt rename to adapters/out-persistence/src/test/kotlin/com/pokit/out/persistence/content/impl/ContentAdapterTest.kt index cdb26f7c..73450269 100644 --- a/adapters/out-persistence/src/test/kotlin/com/pokit/out/persistence/content/impl/ContenAdapterTest.kt +++ b/adapters/out-persistence/src/test/kotlin/com/pokit/out/persistence/content/impl/ContentAdapterTest.kt @@ -23,8 +23,8 @@ import org.springframework.test.context.ContextConfiguration @DataJpaTest(includeFilters = [ComponentScan.Filter(Repository::class)]) @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) @ContextConfiguration(initializers = [TestContainerSupport::class]) -class ContenAdapterTest( - @Autowired private val contentAdapter: ContenAdapter, +class ContentAdapterTest( + @Autowired private val contentAdapter: ContentAdapter, @Autowired private val contentRepository: ContentRepository, @Autowired private val userRepository: UserRepository, @Autowired private val categoryRepository: CategoryRepository, diff --git a/application/src/main/kotlin/com/pokit/category/port/service/CategoryService.kt b/application/src/main/kotlin/com/pokit/category/port/service/CategoryService.kt index c5517a2d..8180352e 100644 --- a/application/src/main/kotlin/com/pokit/category/port/service/CategoryService.kt +++ b/application/src/main/kotlin/com/pokit/category/port/service/CategoryService.kt @@ -11,6 +11,7 @@ import com.pokit.category.port.out.CategoryPort import com.pokit.common.exception.AlreadyExistsException import com.pokit.common.exception.InvalidRequestException import com.pokit.common.exception.NotFoundCustomException +import com.pokit.content.port.out.ContentPort import org.springframework.data.domain.Pageable import org.springframework.data.domain.Slice import org.springframework.data.domain.SliceImpl @@ -21,7 +22,8 @@ import org.springframework.transaction.annotation.Transactional @Transactional(readOnly = true) class CategoryService( private val categoryPort: CategoryPort, - private val categoryImagePort: CategoryImagePort + private val categoryImagePort: CategoryImagePort, + private val contentPort: ContentPort ) : CategoryUseCase { companion object { private const val MAX_CATEGORY_COUNT = 30 @@ -77,18 +79,22 @@ class CategoryService( categoryPort.countByUserId(userId) override fun getCategories(userId: Long, pageable: Pageable, filterUncategorized: Boolean): Slice { - val categories = categoryPort.loadAllByUserId(userId, pageable) + val categoriesSlice = categoryPort.loadAllByUserId(userId, pageable) + + val categories = categoriesSlice.content.map { category -> + val contentCount = contentPort.fetchContentCountByCategoryId(category.categoryId) + category.copy(contentCount = contentCount) + } val filteredCategories = if (filterUncategorized) { - categories.content.filter { it.categoryName != UNCATEGORIZED.displayName } + categories.filter { it.categoryName != UNCATEGORIZED.displayName } } else { - categories.content + categories } - return SliceImpl(filteredCategories, pageable, categories.hasNext()) + return SliceImpl(filteredCategories, pageable, categoriesSlice.hasNext()) } - override fun getAllCategoryImages(): List = categoryImagePort.loadAll() diff --git a/application/src/main/kotlin/com/pokit/content/port/out/ContentPort.kt b/application/src/main/kotlin/com/pokit/content/port/out/ContentPort.kt index bd2bb3eb..8a448a00 100644 --- a/application/src/main/kotlin/com/pokit/content/port/out/ContentPort.kt +++ b/application/src/main/kotlin/com/pokit/content/port/out/ContentPort.kt @@ -8,4 +8,6 @@ interface ContentPort { fun persist(content: Content): Content fun delete(content: Content) + + fun fetchContentCountByCategoryId(categoryId: Long): Int } diff --git a/domain/src/main/kotlin/com/pokit/category/model/Category.kt b/domain/src/main/kotlin/com/pokit/category/model/Category.kt index 13512c85..26406fe2 100644 --- a/domain/src/main/kotlin/com/pokit/category/model/Category.kt +++ b/domain/src/main/kotlin/com/pokit/category/model/Category.kt @@ -5,6 +5,7 @@ data class Category( val userId: Long, var categoryName: String, var categoryImage: CategoryImage, + var contentCount: Int = 0, ) { fun update(categoryName: String, categoryImage: CategoryImage) { this.categoryName = categoryName