From 3b008155e1f78e7d54db8e533451ee852bf8e840 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 16 Apr 2024 23:13:05 +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=20API=20-=20=EC=8B=9C=EB=A6=AC?= =?UTF-8?q?=EC=A6=88=20=EC=88=98=EC=A0=95/=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 --- .../CreatorAdminContentSeriesController.kt | 15 ++++ .../CreatorAdminContentSeriesRepository.kt | 17 +++- .../CreatorAdminContentSeriesService.kt | 80 +++++++++++++++++++ .../content/series/ModifySeriesRequest.kt | 13 +++ .../creator/admin/content/series/Series.kt | 6 ++ 5 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/ModifySeriesRequest.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesController.kt index c288fdb..9f6fc90 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesController.kt @@ -3,9 +3,11 @@ package kr.co.vividnext.sodalive.creator.admin.content.series import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.Member +import org.springframework.lang.Nullable import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestPart import org.springframework.web.bind.annotation.RestController @@ -25,4 +27,17 @@ class CreatorAdminContentSeriesController(private val service: CreatorAdminConte ApiResponse.ok(service.createSeries(image, requestString, member), "시리즈가 생성되었습니다.") } + + @PutMapping + fun modifySeries( + @Nullable + @RequestPart("image") + image: MultipartFile?, + @RequestPart("request") requestString: String, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.modifySeries(image, requestString, member), "시리즈가 수정되었습니다.") + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesRepository.kt index 262ef25..0c06767 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesRepository.kt @@ -1,12 +1,25 @@ package kr.co.vividnext.sodalive.creator.admin.content.series import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.creator.admin.content.series.QSeries.series import org.springframework.data.jpa.repository.JpaRepository interface CreatorAdminContentSeriesRepository : JpaRepository, CreatorAdminContentSeriesQueryRepository -interface CreatorAdminContentSeriesQueryRepository +interface CreatorAdminContentSeriesQueryRepository { + fun findByIdAndCreatorId(id: Long, creatorId: Long): Series? +} class CreatorAdminContentSeriesQueryRepositoryImpl( private val queryFactory: JPAQueryFactory -) : CreatorAdminContentSeriesQueryRepository +) : CreatorAdminContentSeriesQueryRepository { + override fun findByIdAndCreatorId(id: Long, creatorId: Long): Series? { + return queryFactory + .selectFrom(series) + .where( + series.id.eq(id) + .and(series.member.id.eq(creatorId)) + ) + .fetchFirst() + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt index d7f5bcd..3721d12 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt @@ -35,6 +35,7 @@ class CreatorAdminContentSeriesService( val series = request.toSeries() val genre = genreRepository.findActiveSeriesGenreById(request.genreId) series.genre = genre + series.member = member repository.save(series) val keywords = request.keyword @@ -76,4 +77,83 @@ class CreatorAdminContentSeriesService( series.coverImage = coverImagePath } + + @Transactional + fun modifySeries(coverImage: MultipartFile?, requestString: String, member: Member) { + val request = objectMapper.readValue(requestString, ModifySeriesRequest::class.java) + + if ( + coverImage == null && + request.title == null && + request.introduction == null && + request.publishedDaysOfWeek == null && + request.genreId == null && + request.isAdult == null && + request.writer == null && + request.studio == null + ) { + throw SodaException("변경사항이 없습니다.") + } + + val series = repository.findByIdAndCreatorId(id = request.seriesId, creatorId = member.id!!) + ?: throw SodaException("잘못된 접근입니다.") + + if (coverImage != null) { + val metadata = ObjectMetadata() + metadata.contentLength = coverImage.size + + // 커버 이미지 파일명 생성 + val coverImageFileName = generateFileName(prefix = "${series.id}-cover") + // 커버 이미지 업로드 + val coverImagePath = s3Uploader.upload( + inputStream = coverImage.inputStream, + bucket = coverImageBucket, + filePath = "series_cover/${series.id}/$coverImageFileName", + metadata = metadata + ) + + series.coverImage = coverImagePath + } + + if (request.title != null) { + series.title = request.title + } + + if (request.introduction != null) { + series.introduction = request.introduction + } + + if (request.publishedDaysOfWeek != null) { + if ( + request.publishedDaysOfWeek.contains(SeriesPublishedDaysOfWeek.RANDOM) && + request.publishedDaysOfWeek.size > 1 + ) { + throw SodaException("랜덤과 연재요일 동시에 선택할 수 없습니다.") + } + + series.publishedDaysOfWeek.toMutableSet().clear() + series.publishedDaysOfWeek.toMutableSet().addAll(request.publishedDaysOfWeek) + } + + if (request.genreId != null) { + val genre = genreRepository.findActiveSeriesGenreById(request.genreId) + series.genre = genre + } + + if (request.isAdult != null) { + series.isAdult = request.isAdult + } + + if (request.isActive != null) { + series.isActive = request.isActive + } + + if (request.writer != null) { + series.writer = request.writer + } + + if (request.studio != null) { + series.studio = request.studio + } + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/ModifySeriesRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/ModifySeriesRequest.kt new file mode 100644 index 0000000..4057c55 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/ModifySeriesRequest.kt @@ -0,0 +1,13 @@ +package kr.co.vividnext.sodalive.creator.admin.content.series + +data class ModifySeriesRequest( + val seriesId: Long, + val title: String?, + val introduction: String?, + val publishedDaysOfWeek: Set?, + val genreId: Long?, + val isAdult: Boolean?, + val isActive: Boolean?, + val writer: String?, + val studio: String? +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/Series.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/Series.kt index 3590f5a..504a180 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/Series.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/Series.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.creator.admin.content.series import kr.co.vividnext.sodalive.admin.content.series.genre.SeriesGenre import kr.co.vividnext.sodalive.common.BaseEntity import kr.co.vividnext.sodalive.creator.admin.content.series.keyword.SeriesKeyword +import kr.co.vividnext.sodalive.member.Member import javax.persistence.CascadeType import javax.persistence.CollectionTable import javax.persistence.Column @@ -12,6 +13,7 @@ import javax.persistence.EnumType import javax.persistence.Enumerated import javax.persistence.FetchType import javax.persistence.JoinColumn +import javax.persistence.ManyToOne import javax.persistence.OneToMany import javax.persistence.OneToOne @@ -43,6 +45,10 @@ data class Series( @JoinColumn(name = "genre_id", nullable = false) var genre: SeriesGenre? = null + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + var member: Member? = null + var coverImage: String? = null @OneToMany(mappedBy = "series", cascade = [CascadeType.ALL])