diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/dto/HomeRecommendationPageResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/dto/HomeRecommendationPageResponse.kt new file mode 100644 index 00000000..b064290f --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/dto/HomeRecommendationPageResponse.kt @@ -0,0 +1,8 @@ +package kr.co.vividnext.sodalive.v2.api.home.dto + +data class HomeRecommendationPageResponse( + val items: List, + val page: Int, + val size: Int, + val hasNext: Boolean +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/dto/HomeRecommendationResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/dto/HomeRecommendationResponse.kt new file mode 100644 index 00000000..e6a57799 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/dto/HomeRecommendationResponse.kt @@ -0,0 +1,100 @@ +package kr.co.vividnext.sodalive.v2.api.home.dto + +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.ZoneOffset +import java.time.format.DateTimeFormatter + +private val KST_ZONE: ZoneId = ZoneId.of("Asia/Seoul") + +internal fun LocalDateTime.toUtcIso(): String { + val instant = this.atZone(KST_ZONE).withZoneSameInstant(ZoneOffset.UTC).toInstant() + return DateTimeFormatter.ISO_INSTANT.format(instant) +} + +internal fun imageUrl(cloudFrontHost: String, path: String?): String? { + return if (path.isNullOrBlank()) null else "$cloudFrontHost/$path" +} + +data class HomeRecommendationResponse( + val lives: List, + val banners: List, + val recentlyActiveCreators: List, + val recentDebutCreators: List, + val firstAudioContents: List, + val aiCharacters: List, + val genreCreators: List, + val cheerCreators: List, + val popularCommunities: List +) + +data class HomeLiveItem( + val liveRoomId: Long, + val creatorId: Long, + val creatorNickname: String, + val creatorProfileImage: String?, + val title: String, + val coverImage: String?, + val beginDateTime: String, + val channelName: String +) + +data class HomeBannerItem( + val bannerId: Long, + val type: String, + val thumbnailImage: String?, + val eventId: Long?, + val creatorId: Long?, + val seriesId: Long?, + val link: String? +) + +data class HomeActiveCreatorItem( + val creatorId: Long, + val creatorNickname: String, + val creatorProfileImage: String?, + val activityType: String, + val activityAt: String, + val targetId: Long? +) + +data class HomeCreatorItem( + val creatorId: Long, + val creatorNickname: String, + val creatorProfileImage: String? +) + +data class HomeFirstAudioContentItem( + val contentId: Long, + val creatorId: Long, + val creatorNickname: String, + val creatorProfileImage: String?, + val title: String, + val coverImage: String?, + val releaseDate: String +) + +data class HomeAiCharacterItem( + val characterId: Long, + val name: String, + val description: String, + val totalChatCount: Long, + val originalWorkTitle: String? +) + +data class HomeGenreCreatorGroupItem( + val genreId: Long, + val genreName: String, + val creators: List +) + +data class HomePopularCommunityItem( + val communityId: Long, + val creatorId: Long, + val creatorNickname: String, + val creatorProfileImage: String?, + val content: String, + val createdAt: String, + val likeCount: Long, + val commentCount: Long +)