core/features/posts/common/src/commonMain/kotlin/dev/inmo/postssystem/features/posts/common/Post.kt

62 lines
1.4 KiB
Kotlin
Raw Normal View History

2021-12-05 13:00:38 +00:00
package dev.inmo.postssystem.features.posts.common
import com.soywiz.klock.DateTime
import dev.inmo.postssystem.features.common.common.DateTimeSerializer
import dev.inmo.postssystem.features.content.common.Content
2021-12-05 13:00:38 +00:00
import dev.inmo.postssystem.features.content.common.ContentId
import kotlinx.serialization.Polymorphic
2021-12-05 13:00:38 +00:00
import kotlinx.serialization.Serializable
import kotlin.jvm.JvmInline
/**
* Identifier of [RegisteredPost] in system
*/
@Serializable
@JvmInline
value class PostId(val long: Long) {
override fun toString(): String = long.toString()
}
typealias ContentIds = List<ContentId>
/**
* Base interface for creating of new post
*
* @see NewPost
* @see RegisteredPost
*/
@Serializable
2022-05-18 17:41:07 +00:00
sealed interface Post {
val content: ContentIds
2021-12-05 13:00:38 +00:00
}
/**
* This type of [Post] should be used in case you wish to register new post in system
*/
@Serializable
data class NewPost(
override val content: ContentIds
2022-05-18 17:41:07 +00:00
) : Post
2021-12-05 13:00:38 +00:00
/**
* Registered [Post]
*/
@Serializable
data class RegisteredPost(
val id: PostId,
override val content: ContentIds,
@Serializable(DateTimeSerializer::class)
val creationDate: DateTime
2022-05-18 17:41:07 +00:00
) : Post
@Serializable
data class PostWithContent(
val post: Post,
2022-05-18 17:41:07 +00:00
val content: List<@Polymorphic Content>
)
@Serializable
data class RegisteredPostWithContent(
val post: RegisteredPost,
val content: List<@Polymorphic Content>
)