start fill server part

This commit is contained in:
2019-10-17 17:35:48 +06:00
parent 631cfe9c28
commit 0178229175
12 changed files with 183 additions and 12 deletions
ClientPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/client
ClientServerCommon/src/main/kotlin/com/insanusmokrassar/postssystem/core/clientserver/common
Core/src/main/kotlin/com/insanusmokrassar/postssystem/core
ServerPart
build.gradlegradle.propertiessettings.gradle
src
main
kotlin
com
insanusmokrassar
postssystem
settings.gradle

42
ServerPart/build.gradle Normal file

@ -0,0 +1,42 @@
project.version = "0.1.0"
project.group = "com.insanusmokrassar"
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"
}
}
apply plugin: 'java-library'
apply plugin: 'kotlin'
apply plugin: 'kotlinx-serialization'
repositories {
mavenLocal()
jcenter()
mavenCentral()
maven { url "https://kotlin.bintray.com/kotlinx" }
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
api project(":Core")
api project(":ClientServerCommon")
api "io.ktor:ktor-server:$ktor_version"
api "io.ktor:ktor-server-core:$ktor_version"
}
compileKotlin {
kotlinOptions {
freeCompilerArgs = [ disableImplicitReflectionSerializerAnnotation ]
}
}

@ -0,0 +1 @@
ktor_version=1.2.4

@ -0,0 +1 @@
rootProject.name = 'postssystem.core.server'

@ -0,0 +1,21 @@
package com.insanusmokrassar.postssystem.core.server
import com.insanusmokrassar.postssystem.core.post.Post
import com.insanusmokrassar.postssystem.core.post.SimplePost
import com.insanusmokrassar.postssystem.core.utils.pagination.PaginationResult
import kotlinx.serialization.internal.ArrayListSerializer
internal val postsSerializer = ArrayListSerializer(SimplePost.serializer())
internal val paginationResultSerializer = PaginationResult.serializer(SimplePost.serializer())
internal val List<Post>.asSimplePostList
get() = map { post ->
post.asSimplePost
}
internal val Post.asSimplePost
get() = when (this) {
is SimplePost -> this
else -> SimplePost(id, content, meta)
}

@ -0,0 +1,66 @@
package com.insanusmokrassar.postssystem.core.server
import com.insanusmokrassar.postssystem.core.api.ReadPostsAPI
import com.insanusmokrassar.postssystem.core.clientserver.common.*
import com.insanusmokrassar.postssystem.core.clientserver.common.models.DateTimeRequest
import com.insanusmokrassar.postssystem.core.content.ContentId
import com.insanusmokrassar.postssystem.core.post.*
import com.insanusmokrassar.postssystem.core.utils.pagination.PaginationRequest
import com.insanusmokrassar.postssystem.core.utils.pagination.PaginationResult
import io.ktor.application.call
import io.ktor.http.ContentType
import io.ktor.http.HttpStatusCode
import io.ktor.request.receiveOrNull
import io.ktor.response.respond
import io.ktor.response.respondText
import io.ktor.routing.Route
import io.ktor.routing.post
import kotlinx.serialization.json.Json
import org.joda.time.DateTime
fun Route.includePostsCoreReadModules(readPostsAPI: ReadPostsAPI) {
post(getPostByIdAddress) {
call.receiveOrNull(PostId::class) ?.also { id ->
val post = readPostsAPI.getPostById(id)
post ?.let {
val simplePost = post.asSimplePost
call.respondText(ContentType.Application.Json) {
Json.plain.stringify(SimplePost.serializer(), simplePost)
}
} ?: call.respond(HttpStatusCode.NotFound, "Not found")
} ?: call.respond(HttpStatusCode.BadRequest, "Id of post must be provided as body of request")
}
post(getPostsByContentIdAddress) {
call.receiveOrNull(ContentId::class) ?.also { id ->
val posts = readPostsAPI.getPostsByContent(id)
val simplePosts = posts.asSimplePostList
call.respondText(ContentType.Application.Json) {
Json.plain.stringify(postsSerializer, simplePosts)
}
} ?: call.respond(HttpStatusCode.BadRequest, "Id of content must be provided as body of request")
}
post(getPostsByDatesAddress) {
call.receiveOrNull<DateTimeRequest>() ?.also { (from, to) ->
val posts = readPostsAPI.getPostsByDates(from ?.let { DateTime(it) }, to ?.let { DateTime(it) })
val simplePosts = posts.asSimplePostList
call.respondText(ContentType.Application.Json) {
Json.plain.stringify(postsSerializer, simplePosts)
}
} ?: call.respond(HttpStatusCode.BadRequest, "Object \"DateTimeRequest\" must be provided as body of request")
}
post(getPostsByPaginationAddress) {
call.receiveOrNull<PaginationRequest>() ?.also { pagination ->
val paginationResult = readPostsAPI.getPostsByPagination(pagination).let {
val simplePosts = it.results.asSimplePostList
PaginationResult(
it.page,
it.pagesNumber,
simplePosts
)
}
call.respondText(ContentType.Application.Json) {
Json.plain.stringify(paginationResultSerializer, paginationResult)
}
} ?: call.respond(HttpStatusCode.BadRequest, "Object \"PaginationRequest\" must be provided as body of request")
}
}