add writable parts of server and client
This commit is contained in:
ClientPart
ClientServerCommon/src/main/kotlin/com/insanusmokrassar/postssystem/core/clientserver/common
Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/content
ServerPart
@ -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(
|
||||
|
54
ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/WriteModules.kt
Normal file
54
ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/WriteModules.kt
Normal file
@ -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)")
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user