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 = client.createStandardWebsocketFlow( "$baseUrl/$postCreatedFlowRoute", deserializer = RegisteredPost.serializer() ) override val postDeletedFlow: Flow = client.createStandardWebsocketFlow( "$baseUrl/$postDeletedFlowRoute", deserializer = RegisteredPost.serializer() ) override val postUpdatedFlow: Flow = 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() ) }