core/core/ktor/client/src/commonMain/kotlin/dev/inmo/postssystem/core/ktor/client/post/WritePostsRepoKtorClient.kt

50 lines
1.8 KiB
Kotlin

package dev.inmo.postssystem.core.ktor.client.post
import dev.inmo.postssystem.core.ktor.*
import dev.inmo.postssystem.core.post.*
import dev.inmo.postssystem.core.post.repo.WritePostsRepo
import dev.inmo.micro_utils.ktor.client.*
import io.ktor.client.HttpClient
import io.ktor.client.features.websocket.WebSockets
import kotlinx.coroutines.flow.Flow
import kotlinx.serialization.builtins.nullable
import kotlinx.serialization.builtins.serializer
class WritePostsRepoKtorClient (
private val baseUrl: String,
private val client: HttpClient = HttpClient {
install(WebSockets)
}
) : WritePostsRepo {
override val postCreatedFlow: Flow<RegisteredPost> = client.createStandardWebsocketFlow(
"$baseUrl/$postCreatedFlowRoute",
deserializer = RegisteredPost.serializer()
)
override val postDeletedFlow: Flow<RegisteredPost> = client.createStandardWebsocketFlow(
"$baseUrl/$postDeletedFlowRoute",
deserializer = RegisteredPost.serializer()
)
override val postUpdatedFlow: Flow<RegisteredPost> = client.createStandardWebsocketFlow(
"$baseUrl/$postUpdatedFlowRoute",
deserializer = RegisteredPost.serializer()
)
override suspend fun createPost(post: Post): RegisteredPost? = client.unipost(
"$baseUrl/$createPostRoute",
BodyPair(Post.serializer(), post),
RegisteredPost.serializer().nullable
)
override suspend fun deletePost(id: PostId): Boolean = client.unipost(
"$baseUrl/$deletePostRoute",
BodyPair(PostId.serializer(), id),
Boolean.serializer()
)
override suspend fun updatePostContent(postId: PostId, post: Post): Boolean = client.unipost(
"$baseUrl/$updatePostContentRoute",
BodyPair(UpdatePostObject.serializer(), UpdatePostObject(postId, post)),
Boolean.serializer()
)
}