add all client realizations for core repos
This commit is contained in:
core
api
src
commonMain
kotlin
com
insanusmokrassar
postssystem
core
exposed
src
main
kotlin
com
insanusmokrassar
postssystem
core
ktor
client
src
commonMain
kotlin
com
insanusmokrassar
common
src
commonMain
kotlin
com
insanusmokrassar
postssystem
exposed/commons/src/main/kotlin/com/insanusmokrassar/postssystem/exposed/commons
ktor
client
src
commonMain
kotlin
com
insanusmokrassar
postssystem
ktor
client
common
src
commonMain
kotlin
com
insanusmokrassar
tests
src
test
kotlin
com
insanusmokrassar
postssystem
ktor
tests
markups/commons/src/commonMain/kotlin/com/insanusmokrassar/postssystem/markups/core
utils
common
src
commonMain
kotlin
com
insanusmokrassar
postssystem
utils
repos
common
src
commonMain
kotlin
com
insanusmokrassar
postssystem
exposed
src
main
kotlin
com
insanusmokrassar
postssystem
utils
repos
@ -1,9 +1,3 @@
|
||||
package com.insanusmokrassar.postssystem.core.content.api
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.content.RegisteredContent
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface ContentRepo : ReadContentRepo, WriteContentRepo {
|
||||
val contentCreatedFlow: Flow<RegisteredContent>
|
||||
val contentDeletedFlow: Flow<RegisteredContent>
|
||||
}
|
||||
interface ContentRepo : ReadContentRepo, WriteContentRepo
|
||||
|
4
core/api/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/api/ReadContentRepo.kt
4
core/api/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/api/ReadContentRepo.kt
@ -2,8 +2,8 @@ package com.insanusmokrassar.postssystem.core.content.api
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.content.ContentId
|
||||
import com.insanusmokrassar.postssystem.core.content.RegisteredContent
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.PaginationResult
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult
|
||||
|
||||
/**
|
||||
* Simple read API by different properties of [com.insanusmokrassar.postssystem.core.content.Content].
|
||||
|
4
core/api/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/api/WriteContentRepo.kt
4
core/api/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/api/WriteContentRepo.kt
@ -1,8 +1,12 @@
|
||||
package com.insanusmokrassar.postssystem.core.content.api
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.content.*
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface WriteContentRepo {
|
||||
val contentCreatedFlow: Flow<RegisteredContent>
|
||||
val contentDeletedFlow: Flow<RegisteredContent>
|
||||
|
||||
suspend fun registerContent(content: Content): RegisteredContent?
|
||||
suspend fun deleteContent(id: ContentId): Boolean
|
||||
}
|
||||
|
@ -1,7 +1,10 @@
|
||||
package com.insanusmokrassar.postssystem.core.post
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.content.ContentId
|
||||
import com.insanusmokrassar.postssystem.utils.common.UnixMillis
|
||||
import com.soywiz.klock.DateTime
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.Transient
|
||||
|
||||
typealias PostId = String
|
||||
typealias ContentIds = List<ContentId>
|
||||
@ -9,35 +12,50 @@ typealias ContentIds = List<ContentId>
|
||||
/**
|
||||
* Base interface for creating of new post. Usually, it is just [SimplePost] instance
|
||||
*/
|
||||
interface Post {
|
||||
val content: ContentIds
|
||||
@Serializable
|
||||
sealed class Post {
|
||||
abstract val content: ContentIds
|
||||
}
|
||||
|
||||
/**
|
||||
* Root entity of whole system. Can be retrieved from [com.insanusmokrassar.postssystem.core.post.repo.ReadPostsRepo] by
|
||||
* getting and created in [com.insanusmokrassar.postssystem.core.post.repo.WritePostsRepo] by inserting of [Post] instance
|
||||
* Root entity of the whole system. Can be retrieved from [com.insanusmokrassar.postssystem.core.post.repo.ReadPostsRepo]
|
||||
* by getting and created in [com.insanusmokrassar.postssystem.core.post.repo.WritePostsRepo] by inserting of [Post]
|
||||
* instance
|
||||
*/
|
||||
interface RegisteredPost : Post {
|
||||
val id: PostId
|
||||
@Serializable
|
||||
sealed class RegisteredPost : Post() {
|
||||
abstract val id: PostId
|
||||
|
||||
override val content: ContentIds
|
||||
abstract override val content: ContentIds
|
||||
|
||||
val creationDate: DateTime
|
||||
abstract val creationDate: DateTime
|
||||
}
|
||||
|
||||
/**
|
||||
* Base and currently (1st Nov 2019) single realisation of [Post]. There is [SimpleRegisteredPost] which is technically
|
||||
* is [Post] too, but it is not direct [Post] realisation
|
||||
*/
|
||||
@Serializable
|
||||
data class SimplePost(
|
||||
override val content: ContentIds
|
||||
) : Post
|
||||
) : Post()
|
||||
|
||||
/**
|
||||
* Base and currently (1st Nov 2019) single realisation of [RegisteredPost]
|
||||
*/
|
||||
@Serializable
|
||||
data class SimpleRegisteredPost(
|
||||
override val id: PostId,
|
||||
override val content: ContentIds,
|
||||
override val creationDate: DateTime = DateTime.now()
|
||||
) : RegisteredPost
|
||||
private val creationDateTimeMillis: UnixMillis
|
||||
) : RegisteredPost() {
|
||||
@Transient
|
||||
override val creationDate: DateTime = DateTime(creationDateTimeMillis)
|
||||
}
|
||||
|
||||
@Suppress("FunctionName")
|
||||
fun RegisteredPost(
|
||||
id: PostId,
|
||||
content: ContentIds,
|
||||
creationDate: DateTime
|
||||
) = SimpleRegisteredPost(id, content, creationDate.unixMillis)
|
@ -5,8 +5,7 @@ import com.insanusmokrassar.postssystem.core.post.PostId
|
||||
import com.insanusmokrassar.postssystem.core.post.RegisteredPost
|
||||
import com.insanusmokrassar.postssystem.utils.common.MAX_DATE
|
||||
import com.insanusmokrassar.postssystem.utils.common.MIN_DATE
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.PaginationResult
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.*
|
||||
import com.soywiz.klock.DateTime
|
||||
|
||||
/**
|
||||
@ -31,7 +30,11 @@ interface ReadPostsRepo {
|
||||
/**
|
||||
* @return all [RegisteredPost]s which was registered between [from] and [to]. Range will be used INCLUSIVE, line \[[from], [to]\]
|
||||
*/
|
||||
suspend fun getPostsByCreatingDates(from: DateTime = MIN_DATE, to: DateTime = MAX_DATE): List<RegisteredPost>
|
||||
suspend fun getPostsByCreatingDates(
|
||||
from: DateTime = MIN_DATE,
|
||||
to: DateTime = MAX_DATE,
|
||||
pagination: Pagination = FirstPagePagination()
|
||||
): PaginationResult<RegisteredPost>
|
||||
|
||||
/**
|
||||
* @return all posts by pages basing on their creation date
|
||||
@ -41,8 +44,10 @@ interface ReadPostsRepo {
|
||||
|
||||
suspend fun ReadPostsRepo.getPostsByCreatingDates(
|
||||
from: DateTime? = null,
|
||||
to: DateTime? = null
|
||||
to: DateTime? = null,
|
||||
pagination: Pagination = FirstPagePagination()
|
||||
) = getPostsByCreatingDates(
|
||||
from ?: MIN_DATE,
|
||||
to ?: MAX_DATE
|
||||
to ?: MAX_DATE,
|
||||
pagination
|
||||
)
|
||||
|
@ -5,7 +5,7 @@ import com.insanusmokrassar.postssystem.core.content.api.ContentRepo
|
||||
import com.insanusmokrassar.postssystem.core.exposed.content.*
|
||||
import com.insanusmokrassar.postssystem.core.generateContentId
|
||||
import com.insanusmokrassar.postssystem.exposed.commons.paginate
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.*
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.*
|
||||
import kotlinx.coroutines.channels.BroadcastChannel
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
@ -5,7 +5,7 @@ import com.insanusmokrassar.postssystem.core.generatePostId
|
||||
import com.insanusmokrassar.postssystem.core.post.*
|
||||
import com.insanusmokrassar.postssystem.core.post.repo.PostsRepo
|
||||
import com.insanusmokrassar.postssystem.exposed.commons.paginate
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.*
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.*
|
||||
import com.soywiz.klock.*
|
||||
import kotlinx.coroutines.channels.BroadcastChannel
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
@ -100,7 +100,7 @@ private class PostsRepoDatabaseTable(
|
||||
SimpleRegisteredPost(
|
||||
id,
|
||||
contentsTable.getPostContents(id),
|
||||
dateTimeFormat.parse(get(creationDateColumn)).local
|
||||
dateTimeFormat.parse(get(creationDateColumn)).local.unixMillis
|
||||
)
|
||||
}
|
||||
|
||||
@ -176,11 +176,22 @@ private class PostsRepoDatabaseTable(
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun getPostsByCreatingDates(from: DateTime, to: DateTime): List<RegisteredPost> {
|
||||
override suspend fun getPostsByCreatingDates(
|
||||
from: DateTime,
|
||||
to: DateTime,
|
||||
pagination: Pagination
|
||||
): PaginationResult<RegisteredPost> {
|
||||
return transaction(
|
||||
db = database
|
||||
) {
|
||||
select { creationDateColumn.between(from, to) }.map { it.toRegisteredPost() }
|
||||
select { creationDateColumn.between(from, to) }.paginate(
|
||||
pagination
|
||||
).map {
|
||||
it.toRegisteredPost()
|
||||
}.createPaginationResult(
|
||||
pagination,
|
||||
selectAll().count()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,38 +1,18 @@
|
||||
package com.insanusmokrassar.postssystem.core.ktor.client.content
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.content.RegisteredContent
|
||||
import com.insanusmokrassar.postssystem.core.content.api.*
|
||||
import com.insanusmokrassar.postssystem.core.ktor.contentCreatedFlowRoute
|
||||
import com.insanusmokrassar.postssystem.core.ktor.contentDeletedFlowRoute
|
||||
import com.insanusmokrassar.postssystem.ktor.client.createStandardWebsocketFlow
|
||||
import com.insanusmokrassar.postssystem.ktor.standardKtorSerializer
|
||||
import io.ktor.client.HttpClient
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import io.ktor.client.features.websocket.WebSockets
|
||||
|
||||
class ContentRepoKtorClient(
|
||||
baseUrl: String,
|
||||
client: HttpClient = HttpClient()
|
||||
) : ContentRepo,
|
||||
ReadContentRepo by ReadContentRepoKtorClient(
|
||||
baseUrl,
|
||||
client
|
||||
),
|
||||
WriteContentRepo by WriteContentRepoKtorClient(
|
||||
baseUrl,
|
||||
client
|
||||
) {
|
||||
|
||||
override val contentCreatedFlow: Flow<RegisteredContent> = createStandardWebsocketFlow(
|
||||
client,
|
||||
"$baseUrl/$contentCreatedFlowRoute"
|
||||
) {
|
||||
standardKtorSerializer.load(RegisteredContent.serializer(), it)
|
||||
client: HttpClient = HttpClient {
|
||||
install(WebSockets)
|
||||
}
|
||||
|
||||
override val contentDeletedFlow: Flow<RegisteredContent> = createStandardWebsocketFlow(
|
||||
client,
|
||||
"$baseUrl/$contentDeletedFlowRoute"
|
||||
) {
|
||||
standardKtorSerializer.load(RegisteredContent.serializer(), it)
|
||||
}
|
||||
}
|
||||
) : ContentRepo, ReadContentRepo by ReadContentRepoKtorClient(
|
||||
baseUrl,
|
||||
client
|
||||
), WriteContentRepo by WriteContentRepoKtorClient(
|
||||
baseUrl,
|
||||
client
|
||||
)
|
||||
|
@ -4,9 +4,9 @@ import com.insanusmokrassar.postssystem.core.content.ContentId
|
||||
import com.insanusmokrassar.postssystem.core.content.RegisteredContent
|
||||
import com.insanusmokrassar.postssystem.core.content.api.ReadContentRepo
|
||||
import com.insanusmokrassar.postssystem.core.ktor.*
|
||||
import com.insanusmokrassar.postssystem.ktor.standardKtorSerializer
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.PaginationResult
|
||||
import com.insanusmokrassar.postssystem.ktor.*
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.request.get
|
||||
import kotlinx.serialization.builtins.nullable
|
||||
@ -18,18 +18,20 @@ class ReadContentRepoKtorClient(
|
||||
override suspend fun getContentsIds(): Set<ContentId> = client.get<ByteArray>(
|
||||
"$baseUrl/$getContentsIdsRoute"
|
||||
).let {
|
||||
standardKtorSerializer.load(contentIdsSerializer, it)
|
||||
standardKtorSerialFormat.load(contentIdsSerializer, it)
|
||||
}
|
||||
|
||||
override suspend fun getContentById(id: ContentId): RegisteredContent? = client.get<ByteArray>(
|
||||
"$baseUrl/$getContentByIdRoute"
|
||||
"$baseUrl/$getContentByIdRoute/$id"
|
||||
).let {
|
||||
standardKtorSerializer.load(RegisteredContent.serializer().nullable, it)
|
||||
standardKtorSerialFormat.load(RegisteredContent.serializer().nullable, it)
|
||||
}
|
||||
|
||||
override suspend fun getContentByPagination(pagination: Pagination): PaginationResult<out RegisteredContent> = client.get<ByteArray>(
|
||||
"$baseUrl/$getContentByPaginationRoute"
|
||||
"$baseUrl/$getContentByPaginationRoute".includeQueryParams(
|
||||
pagination.asUrlQueryParts
|
||||
)
|
||||
).let {
|
||||
standardKtorSerializer.load(registeredContentPaginationResultSerializer, it)
|
||||
standardKtorSerialFormat.load(registeredContentPaginationResultSerializer, it)
|
||||
}
|
||||
}
|
@ -2,12 +2,13 @@ package com.insanusmokrassar.postssystem.core.ktor.client.content
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.content.*
|
||||
import com.insanusmokrassar.postssystem.core.content.api.WriteContentRepo
|
||||
import com.insanusmokrassar.postssystem.core.ktor.deleteContentRoute
|
||||
import com.insanusmokrassar.postssystem.core.ktor.registerContentRoute
|
||||
import com.insanusmokrassar.postssystem.ktor.standardKtorSerializer
|
||||
import com.insanusmokrassar.postssystem.core.ktor.*
|
||||
import com.insanusmokrassar.postssystem.ktor.client.createStandardWebsocketFlow
|
||||
import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.request.post
|
||||
import io.ktor.client.request.url
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.serialization.builtins.nullable
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
|
||||
@ -15,17 +16,31 @@ class WriteContentRepoKtorClient(
|
||||
private val baseUrl: String,
|
||||
private val client: HttpClient = HttpClient()
|
||||
) : WriteContentRepo {
|
||||
override val contentCreatedFlow: Flow<RegisteredContent> = createStandardWebsocketFlow(
|
||||
client,
|
||||
"$baseUrl/$contentCreatedFlowRoute"
|
||||
) {
|
||||
standardKtorSerialFormat.load(RegisteredContent.serializer(), it)
|
||||
}
|
||||
|
||||
override val contentDeletedFlow: Flow<RegisteredContent> = createStandardWebsocketFlow(
|
||||
client,
|
||||
"$baseUrl/$contentDeletedFlowRoute"
|
||||
) {
|
||||
standardKtorSerialFormat.load(RegisteredContent.serializer(), it)
|
||||
}
|
||||
|
||||
override suspend fun registerContent(content: Content): RegisteredContent? = client.post<ByteArray> {
|
||||
url("$baseUrl/$registerContentRoute")
|
||||
body = standardKtorSerializer.dump(Content.serializer(), content)
|
||||
body = standardKtorSerialFormat.dump(Content.serializer(), content)
|
||||
}.let {
|
||||
standardKtorSerializer.load(RegisteredContent.serializer().nullable, it)
|
||||
standardKtorSerialFormat.load(RegisteredContent.serializer().nullable, it)
|
||||
}
|
||||
|
||||
override suspend fun deleteContent(id: ContentId): Boolean = client.post<ByteArray> {
|
||||
url("$baseUrl/$deleteContentRoute")
|
||||
body = standardKtorSerializer.dump(ContentId.serializer(), id)
|
||||
body = standardKtorSerialFormat.dump(ContentId.serializer(), id)
|
||||
}.let {
|
||||
standardKtorSerializer.load(Boolean.serializer(), it)
|
||||
standardKtorSerialFormat.load(Boolean.serializer(), it)
|
||||
}
|
||||
}
|
18
core/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/ktor/client/post/PostsRepoKtorClient.kt
Normal file
18
core/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/ktor/client/post/PostsRepoKtorClient.kt
Normal file
@ -0,0 +1,18 @@
|
||||
package com.insanusmokrassar.postssystem.core.ktor.client.post
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.post.repo.*
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.features.websocket.WebSockets
|
||||
|
||||
class PostsRepoKtorClient(
|
||||
baseUrl: String,
|
||||
client: HttpClient = HttpClient {
|
||||
install(WebSockets)
|
||||
}
|
||||
) : PostsRepo, ReadPostsRepo by ReadPostsRepoKtorClient(
|
||||
baseUrl,
|
||||
client
|
||||
), WritePostsRepo by WritePostsRepoKtorClient(
|
||||
baseUrl,
|
||||
client
|
||||
)
|
57
core/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/ktor/client/post/ReadPostsRepoKtorClient.kt
Normal file
57
core/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/ktor/client/post/ReadPostsRepoKtorClient.kt
Normal file
@ -0,0 +1,57 @@
|
||||
package com.insanusmokrassar.postssystem.core.ktor.client.post
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.content.ContentId
|
||||
import com.insanusmokrassar.postssystem.core.ktor.*
|
||||
import com.insanusmokrassar.postssystem.core.post.PostId
|
||||
import com.insanusmokrassar.postssystem.core.post.RegisteredPost
|
||||
import com.insanusmokrassar.postssystem.core.post.repo.ReadPostsRepo
|
||||
import com.insanusmokrassar.postssystem.ktor.*
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult
|
||||
import com.soywiz.klock.DateTime
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.request.get
|
||||
import kotlinx.serialization.builtins.nullable
|
||||
|
||||
class ReadPostsRepoKtorClient(
|
||||
private val baseUrl: String,
|
||||
private val client: HttpClient = HttpClient()
|
||||
) : ReadPostsRepo {
|
||||
override suspend fun getPostsIds(): Set<PostId> = client.get<ByteArray>(
|
||||
"$baseUrl/$getPostsIdsRoute"
|
||||
).let {
|
||||
standardKtorSerialFormat.load(postIdsSerializer, it)
|
||||
}
|
||||
|
||||
override suspend fun getPostById(id: PostId): RegisteredPost? = client.get<ByteArray>(
|
||||
"$baseUrl/$getPostByIdRoute/$id"
|
||||
).let {
|
||||
standardKtorSerialFormat.load(RegisteredPost.serializer().nullable, it)
|
||||
}
|
||||
|
||||
override suspend fun getPostsByContent(id: ContentId): List<RegisteredPost> = client.get<ByteArray>(
|
||||
"$baseUrl/$getPostsByContentRoute/$id"
|
||||
).let {
|
||||
standardKtorSerialFormat.load(registeredPostsListSerializer, it)
|
||||
}
|
||||
|
||||
override suspend fun getPostsByCreatingDates(
|
||||
from: DateTime,
|
||||
to: DateTime,
|
||||
pagination: Pagination
|
||||
): PaginationResult<RegisteredPost> = client.get<ByteArray>(
|
||||
"$baseUrl/$getPostsByCreatingDatesRoute".includeQueryParams(
|
||||
(from to to).asFromToUrlPart + pagination.asUrlQueryParts
|
||||
)
|
||||
).let {
|
||||
standardKtorSerialFormat.load(registeredPostsPaginationResultSerializer, it)
|
||||
}
|
||||
|
||||
override suspend fun getPostsByPagination(pagination: Pagination): PaginationResult<RegisteredPost> = client.get<ByteArray>(
|
||||
"$baseUrl/$getPostsByPaginationRoute".includeQueryParams(
|
||||
pagination.asUrlQueryParts
|
||||
)
|
||||
).let {
|
||||
standardKtorSerialFormat.load(registeredPostsPaginationResultSerializer, it)
|
||||
}
|
||||
}
|
59
core/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/ktor/client/post/WritePostsRepoKtorClient.kt
Normal file
59
core/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/ktor/client/post/WritePostsRepoKtorClient.kt
Normal file
@ -0,0 +1,59 @@
|
||||
package com.insanusmokrassar.postssystem.core.ktor.client.post
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.ktor.*
|
||||
import com.insanusmokrassar.postssystem.core.post.*
|
||||
import com.insanusmokrassar.postssystem.core.post.repo.WritePostsRepo
|
||||
import com.insanusmokrassar.postssystem.ktor.client.createStandardWebsocketFlow
|
||||
import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.features.websocket.WebSockets
|
||||
import io.ktor.client.request.post
|
||||
import io.ktor.client.request.url
|
||||
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"
|
||||
) {
|
||||
standardKtorSerialFormat.load(RegisteredPost.serializer(), it)
|
||||
}
|
||||
override val postDeletedFlow: Flow<RegisteredPost> = client.createStandardWebsocketFlow(
|
||||
"$baseUrl/$postDeletedFlowRoute"
|
||||
) {
|
||||
standardKtorSerialFormat.load(RegisteredPost.serializer(), it)
|
||||
}
|
||||
override val postUpdatedFlow: Flow<RegisteredPost> = client.createStandardWebsocketFlow(
|
||||
"$baseUrl/$postUpdatedFlowRoute"
|
||||
) {
|
||||
standardKtorSerialFormat.load(RegisteredPost.serializer(), it)
|
||||
}
|
||||
|
||||
override suspend fun createPost(post: Post): RegisteredPost? = client.post<ByteArray> {
|
||||
url("$baseUrl/$createPostRoute")
|
||||
body = standardKtorSerialFormat.dump(Post.serializer(), post)
|
||||
}.let {
|
||||
standardKtorSerialFormat.load(RegisteredPost.serializer().nullable, it)
|
||||
}
|
||||
|
||||
override suspend fun deletePost(id: PostId): Boolean = client.post<ByteArray> {
|
||||
url("$baseUrl/$createPostRoute")
|
||||
body = standardKtorSerialFormat.dump(PostId.serializer(), id)
|
||||
}.let {
|
||||
standardKtorSerialFormat.load(Boolean.serializer(), it)
|
||||
}
|
||||
|
||||
override suspend fun updatePostContent(postId: PostId, post: Post): Boolean = client.post<ByteArray> {
|
||||
url("$baseUrl/$createPostRoute")
|
||||
body = standardKtorSerialFormat.dump(UpdatePostObject.serializer(), UpdatePostObject(postId, post))
|
||||
}.let {
|
||||
standardKtorSerialFormat.load(Boolean.serializer(), it)
|
||||
}
|
||||
|
||||
}
|
14
core/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/ktor/PostRoutes.kt
Normal file
14
core/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/ktor/PostRoutes.kt
Normal file
@ -0,0 +1,14 @@
|
||||
package com.insanusmokrassar.postssystem.core.ktor
|
||||
|
||||
const val getPostsIdsRoute = "getPostsIds"
|
||||
const val getPostByIdRoute = "getPostById"
|
||||
const val getPostsByContentRoute = "getPostsByContent"
|
||||
const val getPostsByCreatingDatesRoute = "getPostsByCreatingDates"
|
||||
const val getPostsByPaginationRoute = "getPostsByPagination"
|
||||
|
||||
const val postCreatedFlowRoute = "postCreatedFlow"
|
||||
const val postDeletedFlowRoute = "postDeletedFlow"
|
||||
const val postUpdatedFlowRoute = "postUpdatedFlow"
|
||||
const val createPostRoute = "createPost"
|
||||
const val deletePostRoute = "deletePost"
|
||||
const val updatePostContentRoute = "updatePostContent"
|
@ -1,8 +1,13 @@
|
||||
package com.insanusmokrassar.postssystem.core.ktor
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.content.RegisteredContent
|
||||
import com.insanusmokrassar.postssystem.core.post.RegisteredPost
|
||||
import com.insanusmokrassar.postssystem.ktor.setIdsSerializer
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.PaginationResult
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult
|
||||
import kotlinx.serialization.builtins.ListSerializer
|
||||
|
||||
val contentIdsSerializer = setIdsSerializer
|
||||
val postIdsSerializer = setIdsSerializer
|
||||
val registeredPostsListSerializer = ListSerializer(RegisteredPost.serializer())
|
||||
val registeredPostsPaginationResultSerializer = PaginationResult.serializer(RegisteredPost.serializer())
|
||||
val registeredContentPaginationResultSerializer = PaginationResult.serializer(RegisteredContent.serializer())
|
||||
|
11
core/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/ktor/UpdatePostObject.kt
Normal file
11
core/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/ktor/UpdatePostObject.kt
Normal file
@ -0,0 +1,11 @@
|
||||
package com.insanusmokrassar.postssystem.core.ktor
|
||||
|
||||
import com.insanusmokrassar.postssystem.core.post.Post
|
||||
import com.insanusmokrassar.postssystem.core.post.PostId
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class UpdatePostObject(
|
||||
val postId: PostId,
|
||||
val post: Post
|
||||
)
|
2
exposed/commons/src/main/kotlin/com/insanusmokrassar/postssystem/exposed/commons/QueryExtensions.kt
2
exposed/commons/src/main/kotlin/com/insanusmokrassar/postssystem/exposed/commons/QueryExtensions.kt
@ -1,6 +1,6 @@
|
||||
package com.insanusmokrassar.postssystem.exposed.commons
|
||||
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.*
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.*
|
||||
import org.jetbrains.exposed.sql.*
|
||||
|
||||
fun Query.paginate(with: Pagination, orderBy: Pair<Expression<*>, SortOrder>? = null) = limit(
|
||||
|
@ -62,3 +62,8 @@ inline fun <reified T> createStandardWebsocketFlow(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <reified T> HttpClient.createStandardWebsocketFlow(
|
||||
url: String,
|
||||
crossinline conversation: suspend (ByteArray) -> T
|
||||
) = createStandardWebsocketFlow(this, url, conversation)
|
||||
|
17
ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/ktor/FromToDateTimeUrl.kt
Normal file
17
ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/ktor/FromToDateTimeUrl.kt
Normal file
@ -0,0 +1,17 @@
|
||||
package com.insanusmokrassar.postssystem.ktor
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
|
||||
typealias FromToDateTime = Pair<DateTime?, DateTime?>
|
||||
|
||||
val FromToDateTime.asFromToUrlPart: QueryParams
|
||||
get() = mapOf(
|
||||
"from" to first ?.unixMillis ?.toString(),
|
||||
"to" to second ?.unixMillis ?.toString()
|
||||
)
|
||||
|
||||
val QueryParams.extractFromToDateTime: FromToDateTime
|
||||
get() = FromToDateTime(
|
||||
get("from") ?.toDoubleOrNull() ?.let { DateTime(it) },
|
||||
get("to") ?.toDoubleOrNull() ?.let { DateTime(it) }
|
||||
)
|
19
ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/ktor/PaginationInUrl.kt
Normal file
19
ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/ktor/PaginationInUrl.kt
Normal file
@ -0,0 +1,19 @@
|
||||
package com.insanusmokrassar.postssystem.ktor
|
||||
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.*
|
||||
|
||||
private val numberRegex = Regex("[\\d]{1,10}")
|
||||
private val pageRegex = Regex("page=${numberRegex.pattern}")
|
||||
private val sizeRegex = Regex("size=${numberRegex.pattern}")
|
||||
|
||||
val Pagination.asUrlQueryParts
|
||||
get() = mapOf(
|
||||
"page" to page.toString(),
|
||||
"size" to size.toString()
|
||||
)
|
||||
|
||||
val Map<String, String?>.extractPagination: Pagination
|
||||
get() = SimplePagination(
|
||||
get("page") ?.toIntOrNull() ?: 0,
|
||||
get("size") ?.toIntOrNull() ?: defaultMediumPageSize
|
||||
)
|
16
ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/ktor/QueryParamsBuilder.kt
Normal file
16
ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/ktor/QueryParamsBuilder.kt
Normal file
@ -0,0 +1,16 @@
|
||||
package com.insanusmokrassar.postssystem.ktor
|
||||
|
||||
typealias QueryParams = Map<String, String?>
|
||||
|
||||
val QueryParams.asUrlQuery: String
|
||||
get() = keys.joinToString("&") { "${it}${get(it) ?.let { value -> "=$value" }}" }
|
||||
fun String.includeQueryParams(
|
||||
queryParams: QueryParams
|
||||
): String = "$this${if (contains("?")) "&" else "?"}${queryParams.asUrlQuery}"
|
||||
|
||||
val String.parseUrlQuery: QueryParams
|
||||
get() = split("&").map {
|
||||
it.split("=").let { pair ->
|
||||
pair.first() to pair.getOrNull(1)
|
||||
}
|
||||
}.toMap()
|
@ -2,4 +2,4 @@ package com.insanusmokrassar.postssystem.ktor
|
||||
|
||||
import kotlinx.serialization.cbor.Cbor
|
||||
|
||||
val standardKtorSerializer = Cbor
|
||||
val standardKtorSerialFormat = Cbor
|
||||
|
@ -3,13 +3,9 @@ package com.insanusmokrassar.postssystem.ktor.tests
|
||||
import com.insanusmokrassar.postssystem.ktor.client.createStandardWebsocketFlow
|
||||
import com.insanusmokrassar.postssystem.ktor.server.createKtorServer
|
||||
import com.insanusmokrassar.postssystem.ktor.server.includeWebsocketHandling
|
||||
import com.insanusmokrassar.postssystem.ktor.standardKtorSerializer
|
||||
import com.insanusmokrassar.postssystem.ktor.standardKtorSerialFormat
|
||||
import io.ktor.application.install
|
||||
import io.ktor.application.log
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.http.cio.websocket.pingPeriod
|
||||
import io.ktor.http.cio.websocket.timeout
|
||||
import io.ktor.routing.route
|
||||
import io.ktor.routing.routing
|
||||
import io.ktor.websocket.WebSockets
|
||||
import kotlinx.coroutines.*
|
||||
@ -17,7 +13,6 @@ import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.flow.*
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
import org.junit.Test
|
||||
import java.time.Duration
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertNull
|
||||
|
||||
@ -33,7 +28,7 @@ class WebsocketsTest {
|
||||
install(WebSockets)
|
||||
routing {
|
||||
includeWebsocketHandling(suburl, dataFlow) {
|
||||
standardKtorSerializer.dump(Int.serializer(), it)
|
||||
standardKtorSerialFormat.dump(Int.serializer(), it)
|
||||
}
|
||||
}
|
||||
}.also {
|
||||
@ -50,7 +45,7 @@ class WebsocketsTest {
|
||||
"$serverUrl/$suburl",
|
||||
{ false } // always skip reconnection
|
||||
) {
|
||||
standardKtorSerializer.load(Int.serializer(), it)
|
||||
standardKtorSerialFormat.load(Int.serializer(), it)
|
||||
}
|
||||
|
||||
var currentlyCheckingData: Int? = null
|
||||
|
2
markups/commons/src/commonMain/kotlin/com/insanusmokrassar/postssystem/markups/core/MarkupsSystem.kt
2
markups/commons/src/commonMain/kotlin/com/insanusmokrassar/postssystem/markups/core/MarkupsSystem.kt
@ -1,8 +1,8 @@
|
||||
package com.insanusmokrassar.postssystem.markups.core
|
||||
|
||||
import com.insanusmokrassar.postssystem.markups.core.utils.*
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.*
|
||||
import com.insanusmokrassar.postssystem.utils.repos.ReadStandardCRUDRepo
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.*
|
||||
import kotlin.math.min
|
||||
|
||||
abstract class MarkupsSystem(
|
||||
|
3
utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/TimeTypeAliases.kt
Normal file
3
utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/TimeTypeAliases.kt
Normal file
@ -0,0 +1,3 @@
|
||||
package com.insanusmokrassar.postssystem.utils.common
|
||||
|
||||
typealias UnixMillis = Double
|
@ -1,4 +1,4 @@
|
||||
package com.insanusmokrassar.postssystem.utils.repos.pagination
|
||||
package com.insanusmokrassar.postssystem.utils.common.pagination
|
||||
|
||||
import kotlin.math.ceil
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.insanusmokrassar.postssystem.utils.repos.pagination
|
||||
package com.insanusmokrassar.postssystem.utils.common.pagination
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.insanusmokrassar.postssystem.utils.repos.pagination
|
||||
package com.insanusmokrassar.postssystem.utils.common.pagination
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.insanusmokrassar.postssystem.utils.repos
|
||||
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.PaginationResult
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult
|
||||
|
||||
interface OneToManyReadKeyValueRepo<Key, Value> : Repo {
|
||||
suspend fun get(k: Key, pagination: Pagination, reversed: Boolean = false): PaginationResult<Value>
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.insanusmokrassar.postssystem.utils.repos
|
||||
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.PaginationResult
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface ReadStandardCRUDRepo<ObjectType, IdType> : Repo {
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.insanusmokrassar.postssystem.utils.repos
|
||||
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.PaginationResult
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.Pagination
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.PaginationResult
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface StandardReadKeyValueRepo<Key, Value> : Repo {
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.insanusmokrassar.postssystem.utils.repos.exposed
|
||||
|
||||
import com.insanusmokrassar.postssystem.exposed.commons.paginate
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.*
|
||||
import com.insanusmokrassar.postssystem.utils.repos.ReadStandardCRUDRepo
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.*
|
||||
import org.jetbrains.exposed.sql.*
|
||||
import org.jetbrains.exposed.sql.transactions.transaction
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.insanusmokrassar.postssystem.utils.repos.exposed.keyvalue
|
||||
|
||||
import com.insanusmokrassar.postssystem.exposed.commons.paginate
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.*
|
||||
import com.insanusmokrassar.postssystem.utils.repos.StandardReadKeyValueRepo
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.*
|
||||
import org.jetbrains.exposed.sql.*
|
||||
import org.jetbrains.exposed.sql.transactions.transaction
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.insanusmokrassar.budgetmanager.core.utils.repo.onetomany
|
||||
|
||||
import com.insanusmokrassar.postssystem.exposed.commons.paginate
|
||||
import com.insanusmokrassar.postssystem.utils.common.pagination.*
|
||||
import com.insanusmokrassar.postssystem.utils.repos.OneToManyReadKeyValueRepo
|
||||
import com.insanusmokrassar.postssystem.utils.repos.pagination.*
|
||||
import org.jetbrains.exposed.sql.*
|
||||
import org.jetbrains.exposed.sql.transactions.transaction
|
||||
|
||||
|
Reference in New Issue
Block a user