add writable parts of server and client

This commit is contained in:
2019-10-17 21:34:52 +06:00
parent a3cc3e8537
commit 3e7a2c1f0d
9 changed files with 153 additions and 19 deletions
ClientPart
build.gradle
src
main
kotlin
com
insanusmokrassar
ClientServerCommon/src/main/kotlin/com/insanusmokrassar/postssystem/core/clientserver/common
Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/content
ServerPart
build.gradle
src
main
kotlin
com
insanusmokrassar
postssystem

@ -33,6 +33,7 @@ dependencies {
api "io.ktor:ktor-server:$ktor_version"
api "io.ktor:ktor-server-core:$ktor_version"
api "io.ktor:ktor-websockets:$ktor_version"
}
compileKotlin {

@ -8,8 +8,10 @@ import io.ktor.http.ContentType
import io.ktor.http.HttpStatusCode
import io.ktor.response.respond
import io.ktor.response.respondText
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.internal.ArrayListSerializer
import kotlinx.serialization.internal.NullableSerializer
import kotlinx.serialization.json.Json
@ -27,11 +29,12 @@ internal val Post.asSimplePost
else -> SimplePost(id, content, meta)
}
internal suspend fun <T> ApplicationCall.answer(
@InternalSerializationApi
internal suspend fun <T : Any> ApplicationCall.answer(
serializer: KSerializer<T>,
answerObject: T
answerObject: T?
) = respondText(ContentType.Application.Json) {
Json.plain.stringify(serializer, answerObject)
Json.plain.stringify(NullableSerializer(serializer), answerObject)
}
internal suspend fun ApplicationCall.answerBadRequest(

@ -0,0 +1,54 @@
package com.insanusmokrassar.postssystem.core.server
import com.insanusmokrassar.postssystem.core.api.WritePostsAPI
import com.insanusmokrassar.postssystem.core.clientserver.common.*
import com.insanusmokrassar.postssystem.core.clientserver.common.models.UpdatePostRequest
import com.insanusmokrassar.postssystem.core.post.*
import io.ktor.application.call
import io.ktor.http.cio.websocket.Frame
import io.ktor.request.receiveOrNull
import io.ktor.routing.Route
import io.ktor.routing.post
import io.ktor.websocket.webSocket
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.internal.BooleanSerializer
import kotlinx.serialization.json.Json
private inline fun Route.createWebsocket(path: String, flow: Flow<Post>) {
webSocket("/$path") {
flow.collect {
val simplePost = it.asSimplePost
outgoing.send(Frame.Text(Json.plain.stringify(SimplePost.serializer(), simplePost)))
}
}
}
@InternalSerializationApi
fun Route.includePostsCoreWriteModules(
writePostsAPI: WritePostsAPI
) {
createWebsocket(eventPostsCreatedAddress, writePostsAPI.postCreatedFlow)
createWebsocket(eventPostsDeletedAddress, writePostsAPI.postDeletedFlow)
createWebsocket(eventPostsUpdatedAddress, writePostsAPI.postUpdatedFlow)
post(createPostAddress) {
call.receiveOrNull<PostContents>() ?.also { contents ->
val post = writePostsAPI.createPost(contents)
call.answer(SimplePost.serializer(), post ?.asSimplePost)
} ?: call.answerBadRequest("Contents (List of Content)")
}
post(deletePostAddress) {
call.receiveOrNull<PostId>() ?.also { postId ->
call.answer(BooleanSerializer, writePostsAPI.deletePost(postId))
} ?: call.answerBadRequest("Post Id (String)")
}
post(deletePostAddress) {
call.receiveOrNull<UpdatePostRequest>() ?.also { (postId, contents) ->
call.answer(BooleanSerializer, writePostsAPI.updatePostContent(postId, contents))
} ?: call.answerBadRequest("Post Id (String)")
}
}