From 09cba1ffebd959e74b22997b528fc2b6acefd966 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 1 Jun 2026 13:49:03 +0900 Subject: [PATCH] =?UTF-8?q?feat(home):=20=ED=99=88=20=EC=B6=94=EC=B2=9C=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9=20=EC=9D=91=EB=8B=B5=20DTO=EB=A5=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/HomeRecommendationPageResponse.kt | 8 ++ .../home/dto/HomeRecommendationResponse.kt | 100 ++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/dto/HomeRecommendationPageResponse.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/api/home/dto/HomeRecommendationResponse.kt 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 +)