크리에이터 관리자 - 콘텐츠 변경 요청 데이터 변경
This commit is contained in:
		| @@ -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)) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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<GetCreatorAdminContentListItem> | ||||
|  | ||||
|     fun getHashTagList(audioContentId: Long): List<String> | ||||
|  | ||||
|     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<LocalDateTime>, | ||||
|         format: String = "%Y-%m-%d" | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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? | ||||
| ) | ||||
		Reference in New Issue
	
	Block a user