start fill server part
This commit is contained in:
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
settings.gradle
42
ServerPart/build.gradle
Normal file
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 ]
|
||||
}
|
||||
}
|
1
ServerPart/gradle.properties
Normal file
1
ServerPart/gradle.properties
Normal file
@ -0,0 +1 @@
|
||||
ktor_version=1.2.4
|
1
ServerPart/settings.gradle
Normal file
1
ServerPart/settings.gradle
Normal file
@ -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)
|
||||
}
|
66
ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/ReadModules.kt
Normal file
66
ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/ReadModules.kt
Normal file
@ -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")
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user