package dev.inmo.postssystem.core.ktor.client.post import dev.inmo.postssystem.core.content.ContentId import dev.inmo.postssystem.core.ktor.* import dev.inmo.postssystem.core.post.PostId import dev.inmo.postssystem.core.post.RegisteredPost import dev.inmo.postssystem.core.post.repo.ReadPostsRepo import com.soywiz.klock.DateTime import dev.inmo.micro_utils.ktor.client.uniget import dev.inmo.micro_utils.ktor.common.asFromToUrlPart import dev.inmo.micro_utils.ktor.common.buildStandardUrl import dev.inmo.micro_utils.pagination.* import io.ktor.client.HttpClient import kotlinx.serialization.builtins.nullable class ReadPostsRepoKtorClient( private val baseUrl: String, private val client: HttpClient = HttpClient() ) : ReadPostsRepo { override suspend fun getPostsIds(): Set = client.uniget( buildStandardUrl(baseUrl, getPostsIdsRoute), postIdsSerializer ) override suspend fun getPostById(id: PostId): RegisteredPost? = client.uniget( buildStandardUrl(baseUrl, "$getPostByIdRoute/$id"), RegisteredPost.serializer().nullable ) override suspend fun getPostsByContent(id: ContentId): List = client.uniget( buildStandardUrl(baseUrl, "$getPostsByContentRoute/$id"), registeredPostsListSerializer ) override suspend fun getPostsByCreatingDates( from: DateTime, to: DateTime, pagination: Pagination ): PaginationResult = client.uniget( buildStandardUrl( baseUrl, getPostsByCreatingDatesRoute, (from to to).asFromToUrlPart + pagination.asUrlQueryParts ), registeredPostsPaginationResultSerializer ) override suspend fun getPostsByPagination(pagination: Pagination): PaginationResult = client.uniget( buildStandardUrl( baseUrl, getPostsByCreatingDatesRoute, pagination.asUrlQueryParts ), registeredPostsPaginationResultSerializer ) }