add unified way to make post and get requests from client

This commit is contained in:
InsanusMokrassar 2020-08-14 18:05:58 +06:00
parent 8c3a48db99
commit 6d6bed2eb0
5 changed files with 81 additions and 65 deletions

View File

@ -5,6 +5,7 @@ import com.insanusmokrassar.postssystem.core.content.RegisteredContent
import com.insanusmokrassar.postssystem.core.content.api.ReadContentRepo import com.insanusmokrassar.postssystem.core.content.api.ReadContentRepo
import com.insanusmokrassar.postssystem.core.ktor.* import com.insanusmokrassar.postssystem.core.ktor.*
import com.insanusmokrassar.postssystem.ktor.* import com.insanusmokrassar.postssystem.ktor.*
import com.insanusmokrassar.postssystem.ktor.client.uniget
import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination
import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
@ -21,17 +22,13 @@ class ReadContentRepoKtorClient(
standardKtorSerialFormat.load(contentIdsSerializer, it) standardKtorSerialFormat.load(contentIdsSerializer, it)
} }
override suspend fun getContentById(id: ContentId): RegisteredContent? = client.get<ByteArray>( override suspend fun getContentById(id: ContentId): RegisteredContent? = client.uniget(
"$baseUrl/$getContentByIdRoute/$id" "$baseUrl/$getContentByIdRoute/$id",
).let { RegisteredContent.serializer().nullable
standardKtorSerialFormat.load(RegisteredContent.serializer().nullable, it) )
}
override suspend fun getContentByPagination(pagination: Pagination): PaginationResult<RegisteredContent> = client.get<ByteArray>( override suspend fun getContentByPagination(pagination: Pagination): PaginationResult<RegisteredContent> = client.uniget(
"$baseUrl/$getContentByPaginationRoute".includeQueryParams( "$baseUrl/$getContentByPaginationRoute".includeQueryParams(pagination.asUrlQueryParts),
pagination.asUrlQueryParts registeredContentPaginationResultSerializer
) )
).let {
standardKtorSerialFormat.load(registeredContentPaginationResultSerializer, it)
}
} }

View File

@ -3,7 +3,7 @@ package com.insanusmokrassar.postssystem.core.ktor.client.content
import com.insanusmokrassar.postssystem.core.content.* import com.insanusmokrassar.postssystem.core.content.*
import com.insanusmokrassar.postssystem.core.content.api.WriteContentRepo import com.insanusmokrassar.postssystem.core.content.api.WriteContentRepo
import com.insanusmokrassar.postssystem.core.ktor.* import com.insanusmokrassar.postssystem.core.ktor.*
import com.insanusmokrassar.postssystem.ktor.client.createStandardWebsocketFlow import com.insanusmokrassar.postssystem.ktor.client.*
import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.request.post import io.ktor.client.request.post
@ -28,17 +28,15 @@ class WriteContentRepoKtorClient(
standardKtorSerialFormat.load(RegisteredContent.serializer(), it) standardKtorSerialFormat.load(RegisteredContent.serializer(), it)
} }
override suspend fun registerContent(content: Content): RegisteredContent? = client.post<ByteArray> { override suspend fun registerContent(content: Content): RegisteredContent? = client.unipost(
url("$baseUrl/$registerContentRoute") "$baseUrl/$registerContentRoute",
body = standardKtorSerialFormat.dump(Content.serializer(), content) BodyPair(Content.serializer(), content),
}.let { RegisteredContent.serializer().nullable
standardKtorSerialFormat.load(RegisteredContent.serializer().nullable, it) )
}
override suspend fun deleteContent(id: ContentId): Boolean = client.post<ByteArray> { override suspend fun deleteContent(id: ContentId): Boolean = client.unipost(
url("$baseUrl/$deleteContentRoute") "$baseUrl/$deleteContentRoute",
body = standardKtorSerialFormat.dump(ContentId.serializer(), id) BodyPair(ContentId.serializer(), id),
}.let { Boolean.serializer()
standardKtorSerialFormat.load(Boolean.serializer(), it) )
}
} }

View File

@ -6,6 +6,7 @@ import com.insanusmokrassar.postssystem.core.post.PostId
import com.insanusmokrassar.postssystem.core.post.RegisteredPost import com.insanusmokrassar.postssystem.core.post.RegisteredPost
import com.insanusmokrassar.postssystem.core.post.repo.ReadPostsRepo import com.insanusmokrassar.postssystem.core.post.repo.ReadPostsRepo
import com.insanusmokrassar.postssystem.ktor.* import com.insanusmokrassar.postssystem.ktor.*
import com.insanusmokrassar.postssystem.ktor.client.uniget
import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination
import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult
import com.soywiz.klock.DateTime import com.soywiz.klock.DateTime
@ -23,35 +24,31 @@ class ReadPostsRepoKtorClient(
standardKtorSerialFormat.load(postIdsSerializer, it) standardKtorSerialFormat.load(postIdsSerializer, it)
} }
override suspend fun getPostById(id: PostId): RegisteredPost? = client.get<ByteArray>( override suspend fun getPostById(id: PostId): RegisteredPost? = client.uniget(
"$baseUrl/$getPostByIdRoute/$id" "$baseUrl/$getPostByIdRoute/$id",
).let { RegisteredPost.serializer().nullable
standardKtorSerialFormat.load(RegisteredPost.serializer().nullable, it) )
}
override suspend fun getPostsByContent(id: ContentId): List<RegisteredPost> = client.get<ByteArray>( override suspend fun getPostsByContent(id: ContentId): List<RegisteredPost> = client.uniget(
"$baseUrl/$getPostsByContentRoute/$id" "$baseUrl/$getPostsByContentRoute/$id",
).let { registeredPostsListSerializer
standardKtorSerialFormat.load(registeredPostsListSerializer, it) )
}
override suspend fun getPostsByCreatingDates( override suspend fun getPostsByCreatingDates(
from: DateTime, from: DateTime,
to: DateTime, to: DateTime,
pagination: Pagination pagination: Pagination
): PaginationResult<RegisteredPost> = client.get<ByteArray>( ): PaginationResult<RegisteredPost> = client.uniget(
"$baseUrl/$getPostsByCreatingDatesRoute".includeQueryParams( "$baseUrl/$getPostsByCreatingDatesRoute".includeQueryParams(
(from to to).asFromToUrlPart + pagination.asUrlQueryParts (from to to).asFromToUrlPart + pagination.asUrlQueryParts
) ),
).let { registeredPostsPaginationResultSerializer
standardKtorSerialFormat.load(registeredPostsPaginationResultSerializer, it) )
}
override suspend fun getPostsByPagination(pagination: Pagination): PaginationResult<RegisteredPost> = client.get<ByteArray>( override suspend fun getPostsByPagination(pagination: Pagination): PaginationResult<RegisteredPost> = client.uniget(
"$baseUrl/$getPostsByPaginationRoute".includeQueryParams( "$baseUrl/$getPostsByPaginationRoute".includeQueryParams(
pagination.asUrlQueryParts pagination.asUrlQueryParts
) ),
).let { registeredPostsPaginationResultSerializer
standardKtorSerialFormat.load(registeredPostsPaginationResultSerializer, it) )
}
} }

View File

@ -3,7 +3,7 @@ package com.insanusmokrassar.postssystem.core.ktor.client.post
import com.insanusmokrassar.postssystem.core.ktor.* import com.insanusmokrassar.postssystem.core.ktor.*
import com.insanusmokrassar.postssystem.core.post.* import com.insanusmokrassar.postssystem.core.post.*
import com.insanusmokrassar.postssystem.core.post.repo.WritePostsRepo import com.insanusmokrassar.postssystem.core.post.repo.WritePostsRepo
import com.insanusmokrassar.postssystem.ktor.client.createStandardWebsocketFlow import com.insanusmokrassar.postssystem.ktor.client.*
import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.features.websocket.WebSockets import io.ktor.client.features.websocket.WebSockets
@ -35,25 +35,21 @@ class WritePostsRepoKtorClient (
standardKtorSerialFormat.load(RegisteredPost.serializer(), it) standardKtorSerialFormat.load(RegisteredPost.serializer(), it)
} }
override suspend fun createPost(post: Post): RegisteredPost? = client.post<ByteArray> { override suspend fun createPost(post: Post): RegisteredPost? = client.unipost(
url("$baseUrl/$createPostRoute") "$baseUrl/$createPostRoute",
body = standardKtorSerialFormat.dump(Post.serializer(), post) BodyPair(Post.serializer(), post),
}.let { RegisteredPost.serializer().nullable
standardKtorSerialFormat.load(RegisteredPost.serializer().nullable, it) )
}
override suspend fun deletePost(id: PostId): Boolean = client.post<ByteArray> { override suspend fun deletePost(id: PostId): Boolean = client.unipost(
url("$baseUrl/$deletePostRoute") "$baseUrl/$deletePostRoute",
body = standardKtorSerialFormat.dump(PostId.serializer(), id) BodyPair(PostId.serializer(), id),
}.let { Boolean.serializer()
standardKtorSerialFormat.load(Boolean.serializer(), it) )
}
override suspend fun updatePostContent(postId: PostId, post: Post): Boolean = client.post<ByteArray> {
url("$baseUrl/$updatePostContentRoute")
body = standardKtorSerialFormat.dump(UpdatePostObject.serializer(), UpdatePostObject(postId, post))
}.let {
standardKtorSerialFormat.load(Boolean.serializer(), it)
}
override suspend fun updatePostContent(postId: PostId, post: Post): Boolean = client.unipost(
"$baseUrl/$updatePostContentRoute",
BodyPair(UpdatePostObject.serializer(), UpdatePostObject(postId, post)),
Boolean.serializer()
)
} }

View File

@ -0,0 +1,28 @@
package com.insanusmokrassar.postssystem.ktor.client
import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat
import io.ktor.client.HttpClient
import io.ktor.client.request.get
import io.ktor.client.request.post
import kotlinx.serialization.*
typealias BodyPair<T> = Pair<SerializationStrategy<T>, T>
suspend fun <ResultType> HttpClient.uniget(
url: String,
resultDeserializer: DeserializationStrategy<ResultType>
) = get<ByteArray>(
url
).let {
standardKtorSerialFormat.load(resultDeserializer, it)
}
suspend fun <BodyType, ResultType> HttpClient.unipost(
url: String,
bodyInfo: BodyPair<BodyType>,
resultDeserializer: DeserializationStrategy<ResultType>
) = post<ByteArray>(url) {
body = standardKtorSerialFormat.dump(bodyInfo.first, bodyInfo.second)
}.let {
standardKtorSerialFormat.load(resultDeserializer, it)
}