feat(audio-recommendation): 오디오 추천 응답 변환을 추가한다

This commit is contained in:
2026-06-23 16:13:59 +09:00
parent 45d2d616e0
commit 33b3d3e41b
3 changed files with 193 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
package kr.co.vividnext.sodalive.v2.api.audio.recommendation.application
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.v2.api.audio.recommendation.dto.AudioRecommendationsResponse
import kr.co.vividnext.sodalive.v2.audio.recommendation.application.AudioRecommendationQueryService
import org.springframework.stereotype.Component
@Component
class AudioRecommendationFacade(
private val queryService: AudioRecommendationQueryService
) {
fun getRecommendations(member: Member?): AudioRecommendationsResponse {
return AudioRecommendationsResponse.from(queryService.getRecommendations(member))
}
}

View File

@@ -0,0 +1,99 @@
package kr.co.vividnext.sodalive.v2.api.audio.recommendation.dto
import com.fasterxml.jackson.annotation.JsonProperty
import kr.co.vividnext.sodalive.v2.api.common.dto.RecommendationBannerResponse
import kr.co.vividnext.sodalive.v2.audio.recommendation.domain.AudioCard
import kr.co.vividnext.sodalive.v2.audio.recommendation.domain.AudioRecommendations
import kr.co.vividnext.sodalive.v2.audio.recommendation.domain.CommentedAudio
import kr.co.vividnext.sodalive.v2.audio.recommendation.domain.OriginalSeries
data class AudioRecommendationsResponse(
val banners: List<RecommendationBannerResponse>,
val originalSeries: List<OriginalSeriesResponse>,
val latestAudios: List<AudioCardResponse>,
val newAndHotAudios: List<AudioCardResponse>,
val freeAudios: List<AudioCardResponse>,
val pointAudios: List<AudioCardResponse>,
val mostCommentedAudios: List<CommentedAudioResponse>,
val recommendedAudios: List<AudioCardResponse>
) {
companion object {
fun from(recommendations: AudioRecommendations): AudioRecommendationsResponse {
return AudioRecommendationsResponse(
banners = recommendations.banners.map(RecommendationBannerResponse::from),
originalSeries = recommendations.originalSeries.map(OriginalSeriesResponse::from),
latestAudios = recommendations.latestAudios.map(AudioCardResponse::from),
newAndHotAudios = recommendations.newAndHotAudios.map(AudioCardResponse::from),
freeAudios = recommendations.freeAudios.map(AudioCardResponse::from),
pointAudios = recommendations.pointAudios.map(AudioCardResponse::from),
mostCommentedAudios = recommendations.mostCommentedAudios.map(CommentedAudioResponse::from),
recommendedAudios = recommendations.recommendedAudios.map(AudioCardResponse::from)
)
}
}
}
data class OriginalSeriesResponse(
val seriesId: Long,
val coverImageUrl: String?
) {
companion object {
fun from(series: OriginalSeries): OriginalSeriesResponse {
return OriginalSeriesResponse(series.seriesId, series.coverImageUrl)
}
}
}
data class AudioCardResponse(
val audioContentId: Long,
val title: String,
val duration: String?,
val imageUrl: String?,
val price: Int,
@JsonProperty("isAdult")
val isAdult: Boolean,
@JsonProperty("isPointAvailable")
val isPointAvailable: Boolean,
@JsonProperty("isFirstContent")
val isFirstContent: Boolean,
@JsonProperty("isOriginalSeries")
val isOriginalSeries: Boolean,
val creatorNickname: String
) {
companion object {
fun from(audio: AudioCard): AudioCardResponse {
return AudioCardResponse(
audioContentId = audio.audioContentId,
title = audio.title,
duration = audio.duration,
imageUrl = audio.imageUrl,
price = audio.price,
isAdult = audio.isAdult,
isPointAvailable = audio.isPointAvailable,
isFirstContent = audio.isFirstContent,
isOriginalSeries = audio.isOriginalSeries,
creatorNickname = audio.creatorNickname
)
}
}
}
data class CommentedAudioResponse(
val audioContentId: Long,
val title: String,
val imageUrl: String?,
val latestComment: String,
val latestCommentWriterProfileImageUrl: String
) {
companion object {
fun from(audio: CommentedAudio): CommentedAudioResponse {
return CommentedAudioResponse(
audioContentId = audio.audioContentId,
title = audio.title,
imageUrl = audio.imageUrl,
latestComment = audio.latestComment,
latestCommentWriterProfileImageUrl = audio.latestCommentWriterProfileImageUrl
)
}
}
}