크리에이터 관리자 API
- 시리즈 수정/삭제 API 추가
This commit is contained in:
		| @@ -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), "시리즈가 수정되었습니다.") | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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<Series, Long>, 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() | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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<SeriesPublishedDaysOfWeek>?, | ||||
|     val genreId: Long?, | ||||
|     val isAdult: Boolean?, | ||||
|     val isActive: Boolean?, | ||||
|     val writer: String?, | ||||
|     val studio: String? | ||||
| ) | ||||
| @@ -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]) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user