package com.suno.android.common_db.database.entities import androidx.room.ColumnInfo import androidx.room.Embedded import androidx.room.Entity import androidx.room.PrimaryKey import androidx.room.TypeConverter import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json @Serializable data class MentionEntity( @SerialName("start") val start: Int, @SerialName("end") val end: Int, @SerialName("handle") val handle: String, @SerialName("display_name") val displayName: String, ) @Serializable data class CaptionMentionsEntity( @SerialName("user_mentions") val userMentions: List? = null, ) class CaptionMentionConverters { private val json = Json { ignoreUnknownKeys = true } @TypeConverter fun fromCaptionMentions( captionMentions: CaptionMentionsEntity?, ): String? = captionMentions?.let { json.encodeToString(CaptionMentionsEntity.serializer(), it) } @TypeConverter fun toCaptionMentions( jsonString: String?, ): CaptionMentionsEntity? = jsonString?.let { json.decodeFromString(CaptionMentionsEntity.serializer(), it) } } @Entity(tableName = "Clips") data class LocalClipEntity( @PrimaryKey @ColumnInfo("clip_id") val clipId: String, @ColumnInfo("audio_url") val audioUrl: String?, @ColumnInfo("avatar_image_url") val avatarImageUrl: String?, @ColumnInfo("created_at") val createdAt: String, @ColumnInfo("display_name") val displayName: String?, @ColumnInfo("display_tags") val displayTags: String?, @ColumnInfo("handle") val handle: String?, @ColumnInfo("image_large_url") val imageLargeUrl: String?, @ColumnInfo("image_url") val imageUrl: String?, @ColumnInfo("video_cover_url") val videoCoverUrl: String?, @ColumnInfo("preview_url") val previewUrl: String?, @ColumnInfo("is_handle_updated") val isHandleUpdated: Boolean?, @ColumnInfo("is_liked") val isLiked: Boolean?, @ColumnInfo("is_public") val isPublic: Boolean?, @ColumnInfo("is_trashed") val isTrashed: Boolean?, @ColumnInfo("is_video_pending") val isVideoPending: Boolean?, @ColumnInfo("major_model_version") val majorModelVersion: String?, @Embedded(prefix = "clip_metadata_") val metadata: LocalClipMetadataEntity, @ColumnInfo("model_name") val modelName: String?, @ColumnInfo("play_count") val playCount: Int?, @Embedded(prefix = "clip_reaction_") val reaction: LocalReactionEntity?, @ColumnInfo("status") val status: String, @ColumnInfo("title") val title: String?, @ColumnInfo("upvote_count") val upvoteCount: Int?, @ColumnInfo("user_id") val userId: String?, @ColumnInfo("video_url") val videoUrl: String?, @ColumnInfo("comment_count") val commentCount: Int?, @ColumnInfo("caption") val caption: String?, @ColumnInfo("caption_mentions") val captionMentions: CaptionMentionsEntity?, @ColumnInfo("download_disabled_reason") val downloadDisabledReason: String?, @ColumnInfo("can_remix") val canRemix: Boolean?, @ColumnInfo("is_remix") val isRemix: Boolean?, @ColumnInfo("remix_task") val remixTask: String?, )