add ktor standard realisation of crud repo
This commit is contained in:
parent
fbae8cac93
commit
14d6915282
@ -18,19 +18,18 @@ class ReadPostsRepoKtorClient(
|
|||||||
private val baseUrl: String,
|
private val baseUrl: String,
|
||||||
private val client: HttpClient = HttpClient()
|
private val client: HttpClient = HttpClient()
|
||||||
) : ReadPostsRepo {
|
) : ReadPostsRepo {
|
||||||
override suspend fun getPostsIds(): Set<PostId> = client.get<ByteArray>(
|
override suspend fun getPostsIds(): Set<PostId> = client.uniget(
|
||||||
"$baseUrl/$getPostsIdsRoute"
|
buildStandardUrl(baseUrl, getPostsIdsRoute),
|
||||||
).let {
|
postIdsSerializer
|
||||||
standardKtorSerialFormat.decodeFromByteArray(postIdsSerializer, it)
|
)
|
||||||
}
|
|
||||||
|
|
||||||
override suspend fun getPostById(id: PostId): RegisteredPost? = client.uniget(
|
override suspend fun getPostById(id: PostId): RegisteredPost? = client.uniget(
|
||||||
"$baseUrl/$getPostByIdRoute/$id",
|
buildStandardUrl(baseUrl, "$getPostByIdRoute/$id"),
|
||||||
RegisteredPost.serializer().nullable
|
RegisteredPost.serializer().nullable
|
||||||
)
|
)
|
||||||
|
|
||||||
override suspend fun getPostsByContent(id: ContentId): List<RegisteredPost> = client.uniget(
|
override suspend fun getPostsByContent(id: ContentId): List<RegisteredPost> = client.uniget(
|
||||||
"$baseUrl/$getPostsByContentRoute/$id",
|
buildStandardUrl(baseUrl, "$getPostsByContentRoute/$id"),
|
||||||
registeredPostsListSerializer
|
registeredPostsListSerializer
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -39,14 +38,18 @@ class ReadPostsRepoKtorClient(
|
|||||||
to: DateTime,
|
to: DateTime,
|
||||||
pagination: Pagination
|
pagination: Pagination
|
||||||
): PaginationResult<RegisteredPost> = client.uniget(
|
): PaginationResult<RegisteredPost> = client.uniget(
|
||||||
"$baseUrl/$getPostsByCreatingDatesRoute".includeQueryParams(
|
buildStandardUrl(
|
||||||
|
baseUrl,
|
||||||
|
getPostsByCreatingDatesRoute,
|
||||||
(from to to).asFromToUrlPart + pagination.asUrlQueryParts
|
(from to to).asFromToUrlPart + pagination.asUrlQueryParts
|
||||||
),
|
),
|
||||||
registeredPostsPaginationResultSerializer
|
registeredPostsPaginationResultSerializer
|
||||||
)
|
)
|
||||||
|
|
||||||
override suspend fun getPostsByPagination(pagination: Pagination): PaginationResult<RegisteredPost> = client.uniget(
|
override suspend fun getPostsByPagination(pagination: Pagination): PaginationResult<RegisteredPost> = client.uniget(
|
||||||
"$baseUrl/$getPostsByPaginationRoute".includeQueryParams(
|
buildStandardUrl(
|
||||||
|
baseUrl,
|
||||||
|
getPostsByCreatingDatesRoute,
|
||||||
pagination.asUrlQueryParts
|
pagination.asUrlQueryParts
|
||||||
),
|
),
|
||||||
registeredPostsPaginationResultSerializer
|
registeredPostsPaginationResultSerializer
|
||||||
|
@ -13,7 +13,7 @@ import kotlinx.coroutines.flow.channelFlow
|
|||||||
* @param checkReconnection This lambda will be called when it is required to reconnect to websocket to establish
|
* @param checkReconnection This lambda will be called when it is required to reconnect to websocket to establish
|
||||||
* connection. Must return true in case if must be reconnected. By default always reconnecting
|
* connection. Must return true in case if must be reconnected. By default always reconnecting
|
||||||
*/
|
*/
|
||||||
inline fun <reified T> HttpClient.createStandardWebsocketFlow(
|
inline fun <T> HttpClient.createStandardWebsocketFlow(
|
||||||
url: String,
|
url: String,
|
||||||
crossinline checkReconnection: (Throwable?) -> Boolean = { true },
|
crossinline checkReconnection: (Throwable?) -> Boolean = { true },
|
||||||
crossinline conversation: suspend (ByteArray) -> T
|
crossinline conversation: suspend (ByteArray) -> T
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
package com.insanusmokrassar.postssystem.ktor
|
||||||
|
|
||||||
|
fun buildStandardUrl(
|
||||||
|
basePart: String,
|
||||||
|
subpart: String,
|
||||||
|
parameters: QueryParams = emptyMap()
|
||||||
|
) = "$basePart/$subpart".includeQueryParams(
|
||||||
|
parameters
|
||||||
|
)
|
@ -4,6 +4,8 @@ String[] includes = [
|
|||||||
':utils:common',
|
':utils:common',
|
||||||
':utils:repos',
|
':utils:repos',
|
||||||
':utils:repos:common',
|
':utils:repos:common',
|
||||||
|
':utils:repos:ktor:common',
|
||||||
|
':utils:repos:ktor:client',
|
||||||
':utils:repos:exposed',
|
':utils:repos:exposed',
|
||||||
|
|
||||||
':exposed:commons',
|
':exposed:commons',
|
||||||
|
74
utils/repos/ktor/client/build.gradle
Normal file
74
utils/repos/ktor/client/build.gradle
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
|
||||||
|
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$gradle_bintray_plugin_version"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id "org.jetbrains.kotlin.multiplatform" version "$kotlin_version"
|
||||||
|
id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version"
|
||||||
|
}
|
||||||
|
|
||||||
|
project.version = "$core_version"
|
||||||
|
project.group = "com.insanusmokrassar"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
mavenCentral()
|
||||||
|
maven { url "https://kotlin.bintray.com/kotlinx" }
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
jvm()
|
||||||
|
js (BOTH) {
|
||||||
|
browser()
|
||||||
|
nodejs()
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
commonMain {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('stdlib')
|
||||||
|
|
||||||
|
api projectByName("postssystem.utils.repos.ktor.common")
|
||||||
|
api projectByName("postssystem.ktor.client")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
commonTest {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('test-common')
|
||||||
|
implementation kotlin('test-annotations-common')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jvmMain {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('stdlib-jdk8')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jvmTest {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('test-junit')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jsMain {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('stdlib-js')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jsTest {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('test-js')
|
||||||
|
implementation kotlin('test-junit')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
package com.insanusmokrassar.postssystem.utils.repos.ktor.client
|
||||||
|
|
||||||
|
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.PaginationResult
|
||||||
|
import com.insanusmokrassar.postssystem.utils.repos.ReadStandardCRUDRepo
|
||||||
|
import com.insanusmokrassar.postssystem.utils.repos.ktor.common.*
|
||||||
|
import io.ktor.client.HttpClient
|
||||||
|
import kotlinx.serialization.KSerializer
|
||||||
|
import kotlinx.serialization.builtins.serializer
|
||||||
|
import kotlinx.serialization.encodeToHexString
|
||||||
|
|
||||||
|
class KtorReadStandardCrudRepo<ObjectType, IdType> (
|
||||||
|
private val baseUrl: String,
|
||||||
|
private val client: HttpClient = HttpClient(),
|
||||||
|
private val objectsSerializer: KSerializer<ObjectType>,
|
||||||
|
private val objectsSerializerNullable: KSerializer<ObjectType?>,
|
||||||
|
private val idsSerializer: KSerializer<IdType>
|
||||||
|
) : ReadStandardCRUDRepo<ObjectType, IdType> {
|
||||||
|
private val paginationResultSerializer = PaginationResult.serializer(objectsSerializer)
|
||||||
|
|
||||||
|
override suspend fun getByPagination(pagination: Pagination): PaginationResult<ObjectType> = client.uniget(
|
||||||
|
buildStandardUrl(baseUrl, getByPaginationRouting, pagination.asUrlQueryParts),
|
||||||
|
paginationResultSerializer
|
||||||
|
)
|
||||||
|
|
||||||
|
override suspend fun getById(id: IdType): ObjectType? = client.uniget(
|
||||||
|
buildStandardUrl(
|
||||||
|
baseUrl,
|
||||||
|
getByIdRouting,
|
||||||
|
mapOf(
|
||||||
|
"id" to standardKtorSerialFormat.encodeToHexString(idsSerializer, id)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
objectsSerializerNullable
|
||||||
|
)
|
||||||
|
|
||||||
|
override suspend fun contains(id: IdType): Boolean = client.uniget(
|
||||||
|
buildStandardUrl(
|
||||||
|
baseUrl,
|
||||||
|
containsRouting,
|
||||||
|
mapOf(
|
||||||
|
"id" to standardKtorSerialFormat.encodeToHexString(idsSerializer, id)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
Boolean.serializer()
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.insanusmokrassar.postssystem.utils.repos.ktor.client
|
||||||
|
|
||||||
|
import com.insanusmokrassar.postssystem.utils.repos.*
|
||||||
|
import io.ktor.client.HttpClient
|
||||||
|
import kotlinx.serialization.KSerializer
|
||||||
|
|
||||||
|
class KtorStandardCrudRepo<ObjectType, IdType, InputValue> (
|
||||||
|
baseUrl: String,
|
||||||
|
baseSubpart: String,
|
||||||
|
client: HttpClient,
|
||||||
|
objectsSerializer: KSerializer<ObjectType>,
|
||||||
|
objectsNullableSerializer: KSerializer<ObjectType?>,
|
||||||
|
inputsSerializer: KSerializer<InputValue>,
|
||||||
|
idsSerializer: KSerializer<IdType>
|
||||||
|
) : StandardCRUDRepo<ObjectType, IdType, InputValue>,
|
||||||
|
ReadStandardCRUDRepo<ObjectType, IdType> by KtorReadStandardCrudRepo(
|
||||||
|
"$baseUrl/$baseSubpart",
|
||||||
|
client,
|
||||||
|
objectsSerializer,
|
||||||
|
objectsNullableSerializer,
|
||||||
|
idsSerializer
|
||||||
|
),
|
||||||
|
WriteStandardCRUDRepo<ObjectType, IdType, InputValue> by KtorWriteStandardCrudRepo(
|
||||||
|
"$baseUrl/$baseSubpart",
|
||||||
|
client,
|
||||||
|
objectsSerializer,
|
||||||
|
objectsNullableSerializer,
|
||||||
|
inputsSerializer,
|
||||||
|
idsSerializer
|
||||||
|
)
|
@ -0,0 +1,67 @@
|
|||||||
|
package com.insanusmokrassar.postssystem.utils.repos.ktor.client
|
||||||
|
|
||||||
|
import com.insanusmokrassar.postssystem.ktor.*
|
||||||
|
import com.insanusmokrassar.postssystem.ktor.client.*
|
||||||
|
import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination
|
||||||
|
import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult
|
||||||
|
import com.insanusmokrassar.postssystem.utils.repos.*
|
||||||
|
import com.insanusmokrassar.postssystem.utils.repos.ktor.common.*
|
||||||
|
import io.ktor.client.HttpClient
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.serialization.KSerializer
|
||||||
|
import kotlinx.serialization.builtins.*
|
||||||
|
import kotlinx.serialization.encodeToHexString
|
||||||
|
|
||||||
|
class KtorWriteStandardCrudRepo<ObjectType, IdType, InputValue> (
|
||||||
|
private val baseUrl: String,
|
||||||
|
private val client: HttpClient = HttpClient(),
|
||||||
|
private val objectsSerializer: KSerializer<ObjectType>,
|
||||||
|
private val objectsNullableSerializer: KSerializer<ObjectType?>,
|
||||||
|
private val inputsSerializer: KSerializer<InputValue>,
|
||||||
|
private val idsSerializer: KSerializer<IdType>
|
||||||
|
) : WriteStandardCRUDRepo<ObjectType, IdType, InputValue> {
|
||||||
|
private val listObjectsSerializer = ListSerializer(objectsSerializer)
|
||||||
|
private val listInputSerializer = ListSerializer(inputsSerializer)
|
||||||
|
private val listIdsSerializer = ListSerializer(idsSerializer)
|
||||||
|
private val inputUpdateSerializer = TemporalInputObjectForUpdate.serializer(
|
||||||
|
idsSerializer,
|
||||||
|
inputsSerializer
|
||||||
|
)
|
||||||
|
private val listInputUpdateSerializer = ListSerializer(inputUpdateSerializer)
|
||||||
|
|
||||||
|
override val newObjectsFlow: Flow<ObjectType> = client.createStandardWebsocketFlow(
|
||||||
|
buildStandardUrl(baseUrl, newObjectsFlowRouting)
|
||||||
|
) { standardKtorSerialFormat.decodeFromByteArray(objectsSerializer, it) }
|
||||||
|
override val updatedObjectsFlow: Flow<ObjectType> = client.createStandardWebsocketFlow(
|
||||||
|
buildStandardUrl(baseUrl, updatedObjectsFlowRouting)
|
||||||
|
) { standardKtorSerialFormat.decodeFromByteArray(objectsSerializer, it) }
|
||||||
|
override val deletedObjectsIdsFlow: Flow<IdType> = client.createStandardWebsocketFlow(
|
||||||
|
buildStandardUrl(baseUrl, deletedObjectsIdsFlowRouting)
|
||||||
|
) { standardKtorSerialFormat.decodeFromByteArray(idsSerializer, it) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
override suspend fun create(vararg values: InputValue): List<ObjectType> = client.unipost(
|
||||||
|
buildStandardUrl(baseUrl, createRouting),
|
||||||
|
BodyPair(listInputSerializer, values.toList()),
|
||||||
|
listObjectsSerializer
|
||||||
|
)
|
||||||
|
|
||||||
|
override suspend fun update(id: IdType, value: InputValue): ObjectType? = client.unipost(
|
||||||
|
buildStandardUrl(baseUrl, updateRouting),
|
||||||
|
BodyPair(inputUpdateSerializer, TemporalInputObjectForUpdate(id, value)),
|
||||||
|
objectsNullableSerializer
|
||||||
|
)
|
||||||
|
|
||||||
|
override suspend fun update(vararg values: UpdatedValuePair<IdType, InputValue>): List<ObjectType> = client.unipost(
|
||||||
|
buildStandardUrl(baseUrl, updateManyRouting),
|
||||||
|
BodyPair(listInputUpdateSerializer, values.map { TemporalInputObjectForUpdate(it.first, it.second) }),
|
||||||
|
listObjectsSerializer
|
||||||
|
)
|
||||||
|
|
||||||
|
override suspend fun deleteById(vararg ids: IdType) = client.unipost(
|
||||||
|
buildStandardUrl(baseUrl, deleteByIdRouting),
|
||||||
|
BodyPair(listIdsSerializer, ids.toList()),
|
||||||
|
Unit.serializer()
|
||||||
|
)
|
||||||
|
}
|
74
utils/repos/ktor/common/build.gradle
Normal file
74
utils/repos/ktor/common/build.gradle
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
|
||||||
|
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$gradle_bintray_plugin_version"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id "org.jetbrains.kotlin.multiplatform" version "$kotlin_version"
|
||||||
|
id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version"
|
||||||
|
}
|
||||||
|
|
||||||
|
project.version = "$core_version"
|
||||||
|
project.group = "com.insanusmokrassar"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
mavenCentral()
|
||||||
|
maven { url "https://kotlin.bintray.com/kotlinx" }
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
jvm()
|
||||||
|
js (BOTH) {
|
||||||
|
browser()
|
||||||
|
nodejs()
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
commonMain {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('stdlib')
|
||||||
|
|
||||||
|
api projectByName("postssystem.utils.repos.common")
|
||||||
|
api projectByName("postssystem.ktor.common")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
commonTest {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('test-common')
|
||||||
|
implementation kotlin('test-annotations-common')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jvmMain {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('stdlib-jdk8')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jvmTest {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('test-junit')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jsMain {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('stdlib-js')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jsTest {
|
||||||
|
dependencies {
|
||||||
|
implementation kotlin('test-js')
|
||||||
|
implementation kotlin('test-junit')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package com.insanusmokrassar.postssystem.utils.repos.ktor.common
|
||||||
|
|
||||||
|
const val getByPaginationRouting = "getByPagination"
|
||||||
|
const val getByIdRouting = "getById"
|
||||||
|
const val containsRouting = "contains"
|
||||||
|
const val getAllRouting = "getAll"
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.insanusmokrassar.postssystem.utils.repos.ktor.common
|
||||||
|
|
||||||
|
const val newObjectsFlowRouting = "newObjectsFlow"
|
||||||
|
const val updatedObjectsFlowRouting = "updatedObjectsFlow"
|
||||||
|
const val deletedObjectsIdsFlowRouting = "deletedObjectsIdsFlow"
|
||||||
|
|
||||||
|
const val createRouting = "create"
|
||||||
|
const val updateRouting = "update"
|
||||||
|
const val updateManyRouting = "updateMany"
|
||||||
|
const val deleteByIdRouting = "deleteById"
|
@ -0,0 +1,9 @@
|
|||||||
|
package com.insanusmokrassar.postssystem.utils.repos.ktor.common
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class TemporalInputObjectForUpdate<IdType, InputValue>(
|
||||||
|
val id: IdType,
|
||||||
|
val input: InputValue
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user