From f49203cafc63a10226e8b155ec2c45d45cc85713 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 23 Aug 2023 21:38:04 +0900 Subject: [PATCH] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EB=B3=80=EA=B2=BD=20=EC=9A=94=EC=B2=AD=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/CreatorAdminContentController.kt | 9 +++--- .../content/CreatorAdminContentRepository.kt | 15 +++++++++ .../content/CreatorAdminContentService.kt | 31 +++++++++++++++---- .../UpdateCreatorAdminContentRequest.kt | 10 ++++++ 4 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/UpdateCreatorAdminContentRequest.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentController.kt index 90e77b4..f19e973 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentController.kt @@ -1,6 +1,5 @@ package kr.co.vividnext.sodalive.creator.admin.content -import kr.co.vividnext.sodalive.admin.content.UpdateAdminContentRequest import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.Member @@ -9,10 +8,11 @@ import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PutMapping -import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RequestPart import org.springframework.web.bind.annotation.RestController +import org.springframework.web.multipart.MultipartFile @RestController @PreAuthorize("hasRole('CREATOR')") @@ -41,11 +41,12 @@ class CreatorAdminContentController(private val service: CreatorAdminContentServ @PutMapping fun modifyAudioContent( - @RequestBody request: UpdateAdminContentRequest, + @RequestPart("coverImage", required = false) coverImage: MultipartFile? = null, + @RequestPart("request") requestString: String, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? ) = run { if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.updateAudioContent(request, member)) + ApiResponse.ok(service.updateAudioContent(coverImage, requestString, member)) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentRepository.kt index a04ee3a..be9a34f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentRepository.kt @@ -9,6 +9,7 @@ import kr.co.vividnext.sodalive.content.QAudioContent.audioContent import kr.co.vividnext.sodalive.content.hashtag.QAudioContentHashTag.audioContentHashTag import kr.co.vividnext.sodalive.content.hashtag.QHashTag.hashTag import kr.co.vividnext.sodalive.content.theme.QAudioContentTheme.audioContentTheme +import kr.co.vividnext.sodalive.member.QMember.member import org.springframework.data.jpa.repository.JpaRepository import java.time.LocalDateTime @@ -24,6 +25,8 @@ interface CreatorAdminAudioContentQueryRepository { ): List fun getHashTagList(audioContentId: Long): List + + fun getAudioContent(memberId: Long, audioContentId: Long): AudioContent? } class CreatorAdminAudioContentQueryRepositoryImpl( @@ -107,6 +110,18 @@ class CreatorAdminAudioContentQueryRepositoryImpl( .fetch() } + override fun getAudioContent(memberId: Long, audioContentId: Long): AudioContent? { + return queryFactory + .selectFrom(audioContent) + .innerJoin(audioContent.member, member) + .where( + member.id.eq(memberId) + .and(audioContent.id.eq(audioContentId)) + ) + .orderBy(audioContent.id.desc()) + .fetchFirst() + } + private fun formattedDateExpression( dateTime: DateTimePath, format: String = "%Y-%m-%d" diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentService.kt index bb2ddc4..9646bdb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentService.kt @@ -1,19 +1,27 @@ package kr.co.vividnext.sodalive.creator.admin.content -import kr.co.vividnext.sodalive.admin.content.UpdateAdminContentRequest +import com.amazonaws.services.s3.model.ObjectMetadata +import com.fasterxml.jackson.databind.ObjectMapper import kr.co.vividnext.sodalive.aws.cloudfront.AudioContentCloudFront +import kr.co.vividnext.sodalive.aws.s3.S3Uploader import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.utils.generateFileName import org.springframework.beans.factory.annotation.Value import org.springframework.data.domain.Pageable -import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional +import org.springframework.web.multipart.MultipartFile @Service class CreatorAdminContentService( private val repository: CreatorAdminContentRepository, private val audioContentCloudFront: AudioContentCloudFront, + private val objectMapper: ObjectMapper, + private val s3Uploader: S3Uploader, + + @Value("\${cloud.aws.s3.bucket}") + private val bucket: String, @Value("\${cloud.aws.cloud-front.host}") private val coverImageHost: String @@ -90,12 +98,23 @@ class CreatorAdminContentService( } @Transactional - fun updateAudioContent(request: UpdateAdminContentRequest, member: Member) { - val audioContent = repository.findByIdOrNull(id = request.id) + fun updateAudioContent(coverImage: MultipartFile?, requestString: String, member: Member) { + val request = objectMapper.readValue(requestString, UpdateCreatorAdminContentRequest::class.java) + val audioContent = repository.getAudioContent(memberId = member.id!!, audioContentId = request.id) ?: throw SodaException("잘못된 콘텐츠 입니다.") - if (request.isDefaultCoverImage) { - audioContent.coverImage = "profile/default_profile.png" + if (coverImage != null) { + val metadata = ObjectMetadata() + metadata.contentLength = coverImage.size + + val fileName = generateFileName() + val imagePath = s3Uploader.upload( + inputStream = coverImage.inputStream, + bucket = bucket, + filePath = "audio_content_cover/${request.id}/$fileName", + metadata = metadata + ) + audioContent.coverImage = imagePath } if (request.isActive != null) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/UpdateCreatorAdminContentRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/UpdateCreatorAdminContentRequest.kt new file mode 100644 index 0000000..b1f85e1 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/UpdateCreatorAdminContentRequest.kt @@ -0,0 +1,10 @@ +package kr.co.vividnext.sodalive.creator.admin.content + +data class UpdateCreatorAdminContentRequest( + val id: Long, + val title: String?, + val detail: String?, + val isAdult: Boolean?, + val isActive: Boolean?, + val isCommentAvailable: Boolean? +)