From 8be2ec9319b1873355b6652fa726dca1bf8cb90c Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 1 Feb 2024 19:48:59 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC=20-=20=EC=82=AD=EC=A0=9C=20API=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/CategoryContentRepository.kt | 9 +++++++++ .../content/category/CategoryController.kt | 17 ++++++++++++++--- .../content/category/CategoryRepository.kt | 12 ++++++++++++ .../content/category/CategoryService.kt | 10 ++++++++++ 4 files changed, 45 insertions(+), 3 deletions(-) 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) + } }