parent
55badb6206
commit
05e714fff1
|
@ -0,0 +1,40 @@
|
||||||
|
package kr.co.vividnext.sodalive.admin.content.series.recommend
|
||||||
|
|
||||||
|
import kr.co.vividnext.sodalive.common.ApiResponse
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping
|
||||||
|
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('ADMIN')")
|
||||||
|
@RequestMapping("/admin/audio-content/series/recommend")
|
||||||
|
class AdminRecommendSeriesController(private val service: AdminRecommendSeriesService) {
|
||||||
|
@GetMapping
|
||||||
|
fun getRecommendSeriesList(@RequestParam isFree: Boolean) = ApiResponse.ok(
|
||||||
|
service.getRecommendSeriesList(isFree = isFree)
|
||||||
|
)
|
||||||
|
|
||||||
|
@PostMapping
|
||||||
|
fun createRecommendSeries(
|
||||||
|
@RequestPart("image") image: MultipartFile,
|
||||||
|
@RequestPart("request") requestString: String
|
||||||
|
) = ApiResponse.ok(service.createRecommendSeries(image, requestString))
|
||||||
|
|
||||||
|
@PutMapping
|
||||||
|
fun modifyRecommendSeries(
|
||||||
|
@RequestPart("image", required = false) image: MultipartFile? = null,
|
||||||
|
@RequestPart("request") requestString: String
|
||||||
|
) = ApiResponse.ok(service.updateRecommendSeries(image, requestString))
|
||||||
|
|
||||||
|
@PutMapping("/orders")
|
||||||
|
fun updateRecommendSeriesOrders(
|
||||||
|
@RequestBody request: UpdateRecommendSeriesOrdersRequest
|
||||||
|
) = ApiResponse.ok(service.updateRecommendSeriesOrders(request.ids))
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package kr.co.vividnext.sodalive.admin.content.series.recommend
|
||||||
|
|
||||||
|
import com.querydsl.jpa.impl.JPAQueryFactory
|
||||||
|
import kr.co.vividnext.sodalive.content.main.tab.QRecommendSeries.recommendSeries
|
||||||
|
import kr.co.vividnext.sodalive.content.main.tab.RecommendSeries
|
||||||
|
import kr.co.vividnext.sodalive.creator.admin.content.series.QSeries.series
|
||||||
|
import org.springframework.beans.factory.annotation.Value
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository
|
||||||
|
|
||||||
|
interface AdminRecommendSeriesRepository :
|
||||||
|
JpaRepository<RecommendSeries, Long>,
|
||||||
|
AdminRecommendSeriesQueryRepository
|
||||||
|
|
||||||
|
interface AdminRecommendSeriesQueryRepository {
|
||||||
|
fun getRecommendSeriesList(isFree: Boolean): List<GetAdminRecommendSeriesListResponse>
|
||||||
|
}
|
||||||
|
|
||||||
|
class AdminRecommendSeriesQueryRepositoryImpl(
|
||||||
|
private val queryFactory: JPAQueryFactory,
|
||||||
|
|
||||||
|
@Value("\${cloud.aws.cloud-front.host}")
|
||||||
|
private val imageHost: String
|
||||||
|
) : AdminRecommendSeriesQueryRepository {
|
||||||
|
override fun getRecommendSeriesList(isFree: Boolean): List<GetAdminRecommendSeriesListResponse> {
|
||||||
|
return queryFactory
|
||||||
|
.select(
|
||||||
|
QGetAdminRecommendSeriesListResponse(
|
||||||
|
recommendSeries.id,
|
||||||
|
series.id,
|
||||||
|
series.title,
|
||||||
|
recommendSeries.imagePath.prepend("/").prepend(imageHost)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.from(recommendSeries)
|
||||||
|
.innerJoin(recommendSeries.series, series)
|
||||||
|
.where(
|
||||||
|
recommendSeries.isActive.isTrue
|
||||||
|
.and(series.isActive.isTrue)
|
||||||
|
.and(recommendSeries.isFree.eq(isFree))
|
||||||
|
)
|
||||||
|
.fetch()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
package kr.co.vividnext.sodalive.admin.content.series.recommend
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
|
import kr.co.vividnext.sodalive.admin.content.series.AdminContentSeriesRepository
|
||||||
|
import kr.co.vividnext.sodalive.aws.s3.S3Uploader
|
||||||
|
import kr.co.vividnext.sodalive.common.SodaException
|
||||||
|
import kr.co.vividnext.sodalive.content.main.tab.RecommendSeries
|
||||||
|
import kr.co.vividnext.sodalive.utils.generateFileName
|
||||||
|
import org.springframework.beans.factory.annotation.Value
|
||||||
|
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 AdminRecommendSeriesService(
|
||||||
|
private val s3Uploader: S3Uploader,
|
||||||
|
private val repository: AdminRecommendSeriesRepository,
|
||||||
|
private val seriesRepository: AdminContentSeriesRepository,
|
||||||
|
private val objectMapper: ObjectMapper,
|
||||||
|
|
||||||
|
@Value("\${cloud.aws.s3.bucket}")
|
||||||
|
private val bucket: String
|
||||||
|
) {
|
||||||
|
fun getRecommendSeriesList(isFree: Boolean): List<GetAdminRecommendSeriesListResponse> {
|
||||||
|
return repository.getRecommendSeriesList(isFree = isFree)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
fun createRecommendSeries(image: MultipartFile, requestString: String) {
|
||||||
|
val request = objectMapper.readValue(requestString, CreateRecommendSeriesRequest::class.java)
|
||||||
|
val series = seriesRepository.findByIdOrNull(request.seriesId)
|
||||||
|
?: throw SodaException("잘못된 요청입니다.")
|
||||||
|
|
||||||
|
val recommendSeries = RecommendSeries(isFree = request.isFree)
|
||||||
|
recommendSeries.series = series
|
||||||
|
repository.save(recommendSeries)
|
||||||
|
|
||||||
|
val fileName = generateFileName()
|
||||||
|
val imagePath = s3Uploader.upload(
|
||||||
|
inputStream = image.inputStream,
|
||||||
|
bucket = bucket,
|
||||||
|
filePath = "recommend_series/${recommendSeries.id}/$fileName"
|
||||||
|
)
|
||||||
|
recommendSeries.imagePath = imagePath
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
fun updateRecommendSeries(image: MultipartFile?, requestString: String) {
|
||||||
|
val request = objectMapper.readValue(requestString, UpdateRecommendSeriesRequest::class.java)
|
||||||
|
val recommendSeries = repository.findByIdOrNull(request.id)
|
||||||
|
?: throw SodaException("잘못된 요청입니다.")
|
||||||
|
|
||||||
|
if (image != null) {
|
||||||
|
val fileName = generateFileName()
|
||||||
|
val imagePath = s3Uploader.upload(
|
||||||
|
inputStream = image.inputStream,
|
||||||
|
bucket = bucket,
|
||||||
|
filePath = "recommend_series/${recommendSeries.id}/$fileName"
|
||||||
|
)
|
||||||
|
recommendSeries.imagePath = imagePath
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request.isActive != null) {
|
||||||
|
recommendSeries.isActive = request.isActive
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request.seriesId != null) {
|
||||||
|
val series = seriesRepository.findByIdOrNull(request.seriesId)
|
||||||
|
|
||||||
|
if (series != null) {
|
||||||
|
recommendSeries.series = series
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
fun updateRecommendSeriesOrders(ids: List<Long>) {
|
||||||
|
for (index in ids.indices) {
|
||||||
|
val recommendSeries = repository.findByIdOrNull(ids[index])
|
||||||
|
|
||||||
|
if (recommendSeries != null) {
|
||||||
|
recommendSeries.orders = index + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package kr.co.vividnext.sodalive.admin.content.series.recommend
|
||||||
|
|
||||||
|
data class CreateRecommendSeriesRequest(
|
||||||
|
val seriesId: Long,
|
||||||
|
val isFree: Boolean
|
||||||
|
)
|
|
@ -0,0 +1,10 @@
|
||||||
|
package kr.co.vividnext.sodalive.admin.content.series.recommend
|
||||||
|
|
||||||
|
import com.querydsl.core.annotations.QueryProjection
|
||||||
|
|
||||||
|
data class GetAdminRecommendSeriesListResponse @QueryProjection constructor(
|
||||||
|
val id: Long,
|
||||||
|
val seriesId: Long,
|
||||||
|
val seriesTitle: String,
|
||||||
|
val imageUrl: String
|
||||||
|
)
|
|
@ -0,0 +1,5 @@
|
||||||
|
package kr.co.vividnext.sodalive.admin.content.series.recommend
|
||||||
|
|
||||||
|
data class UpdateRecommendSeriesOrdersRequest(
|
||||||
|
val ids: List<Long>
|
||||||
|
)
|
|
@ -0,0 +1,7 @@
|
||||||
|
package kr.co.vividnext.sodalive.admin.content.series.recommend
|
||||||
|
|
||||||
|
data class UpdateRecommendSeriesRequest(
|
||||||
|
val id: Long,
|
||||||
|
val seriesId: Long?,
|
||||||
|
val isActive: Boolean?
|
||||||
|
)
|
|
@ -0,0 +1,28 @@
|
||||||
|
package kr.co.vividnext.sodalive.content.main.tab
|
||||||
|
|
||||||
|
import kr.co.vividnext.sodalive.common.BaseEntity
|
||||||
|
import kr.co.vividnext.sodalive.creator.admin.content.series.Series
|
||||||
|
import javax.persistence.Column
|
||||||
|
import javax.persistence.Entity
|
||||||
|
import javax.persistence.FetchType
|
||||||
|
import javax.persistence.JoinColumn
|
||||||
|
import javax.persistence.ManyToOne
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
data class RecommendSeries(
|
||||||
|
@Column(nullable = false)
|
||||||
|
var imagePath: String = "",
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
var orders: Int = 1,
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
var isFree: Boolean = false,
|
||||||
|
|
||||||
|
@Column(nullable = false)
|
||||||
|
var isActive: Boolean = true
|
||||||
|
) : BaseEntity() {
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "series_id", nullable = false)
|
||||||
|
var series: Series? = null
|
||||||
|
}
|
Loading…
Reference in New Issue