diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryContentRepository.kt index af49a35..e560d60 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryContentRepository.kt @@ -8,6 +8,7 @@ interface CategoryContentRepository : JpaRepository, Cate interface CategoryContentQueryRepository { fun findByContentIdAndCategoryId(contentId: Long, categoryId: Long): CategoryContent? + fun deleteByCategoryId(categoryId: Long) } class CategoryContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : CategoryContentQueryRepository { @@ -20,4 +21,12 @@ class CategoryContentQueryRepositoryImpl(private val queryFactory: JPAQueryFacto ) .fetchFirst() } + + override fun deleteByCategoryId(categoryId: Long) { + queryFactory + .update(categoryContent) + .set(categoryContent.isActive, false) + .where(categoryContent.category.id.eq(categoryId)) + .execute() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryController.kt index 331944d..724408e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryController.kt @@ -5,6 +5,8 @@ import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.Member import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.core.annotation.AuthenticationPrincipal +import org.springframework.web.bind.annotation.DeleteMapping +import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping @@ -21,8 +23,17 @@ class CategoryController(private val service: CategoryService) { ) = run { if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok( - service.createCategory(request = request, member = member) - ) + ApiResponse.ok(service.createCategory(request = request, member = member)) + } + + @DeleteMapping("/{id}") + @PreAuthorize("hasRole('CREATOR')") + fun deleteCategory( + @PathVariable("id") categoryId: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.deleteCategory(categoryId = categoryId, member = member)) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryRepository.kt index 24bab28..c3b3c2f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryRepository.kt @@ -8,6 +8,8 @@ interface CategoryRepository : JpaRepository, CategoryQueryRepos interface CategoryQueryRepository { fun findByTitleAndMemberId(title: String, memberId: Long): Category? + + fun findByIdAndMemberId(categoryId: Long, memberId: Long): Category? } class CategoryQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : CategoryQueryRepository { @@ -20,4 +22,14 @@ class CategoryQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : C ) .fetchFirst() } + + override fun findByIdAndMemberId(categoryId: Long, memberId: Long): Category? { + return queryFactory + .selectFrom(category) + .where( + category.id.eq(categoryId) + .and(category.member.id.eq(memberId)) + ) + .fetchFirst() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryService.kt index 414e6b3..7b44133 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryService.kt @@ -1,5 +1,6 @@ package kr.co.vividnext.sodalive.content.category +import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.content.AudioContentRepository import kr.co.vividnext.sodalive.member.Member import org.springframework.stereotype.Service @@ -37,4 +38,13 @@ class CategoryService( categoryContent.isActive = true } } + + @Transactional + fun deleteCategory(categoryId: Long, member: Member) { + val category = repository.findByIdAndMemberId(categoryId = categoryId, memberId = member.id!!) + ?: throw SodaException("잘못된 요청입니다.") + category.isActive = false + + categoryContentRepository.deleteByCategoryId(categoryId = categoryId) + } }