diff --git a/ClientPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/client/ReadableHttpPostsAPI.kt b/ClientPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/client/ReadableHttpPostsAPI.kt index ac9162d8..c23a1eca 100644 --- a/ClientPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/client/ReadableHttpPostsAPI.kt +++ b/ClientPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/client/ReadableHttpPostsAPI.kt @@ -20,20 +20,20 @@ class ReadableHttpPostsAPI( private val postsByDatesAddress = "$baseAddress/$getPostsByDatesAddress" private val postsByPaginationAddress = "$baseAddress/$getPostsByPaginationAddress" - override suspend fun getPostById(id: PostId): Post? { - return client.post(postByIdAddress) { + override suspend fun getPostById(id: PostId): RegisteredPost? { + return client.post(postByIdAddress) { body = id } } - override suspend fun getPostsByContent(id: ContentId): List { - return client.post>(postsByContentIdAddress) { + override suspend fun getPostsByContent(id: ContentId): List { + return client.post>(postsByContentIdAddress) { body = id } } - override suspend fun getPostsByDates(from: DateTime?, to: DateTime?): List { - return client.post>(postsByDatesAddress) { + override suspend fun getPostsByDates(from: DateTime?, to: DateTime?): List { + return client.post>(postsByDatesAddress) { body = DateTimeRequest( from ?.millis, to ?.millis @@ -41,8 +41,8 @@ class ReadableHttpPostsAPI( } } - override suspend fun getPostsByPagination(pagination: Pagination): PaginationResult { - return client.post>(postsByPaginationAddress) { + override suspend fun getPostsByPagination(pagination: Pagination): PaginationResult { + return client.post>(postsByPaginationAddress) { body = pagination } } diff --git a/ClientPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/client/WritableHttpPostsAPI.kt b/ClientPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/client/WritableHttpPostsAPI.kt index 93d7ee64..15a15fd3 100644 --- a/ClientPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/client/WritableHttpPostsAPI.kt +++ b/ClientPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/client/WritableHttpPostsAPI.kt @@ -20,17 +20,17 @@ class WritableHttpPostsAPI( port, "/$url" ) { - Json.plain.parse(SimplePost.serializer(), it) + Json.plain.parse(SimpleRegisteredPost.serializer(), it) } - override val postCreatedFlow: Flow = postEventFlow(eventPostsCreatedAddress) - override val postDeletedFlow: Flow = postEventFlow(eventPostsDeletedAddress) - override val postUpdatedFlow: Flow = postEventFlow(eventPostsUpdatedAddress) + override val postCreatedFlow: Flow = postEventFlow(eventPostsCreatedAddress) + override val postDeletedFlow: Flow = postEventFlow(eventPostsDeletedAddress) + override val postUpdatedFlow: Flow = postEventFlow(eventPostsUpdatedAddress) - override suspend fun createPost(content: PostContents): Post? = client.post( + override suspend fun createPost(post: Post): RegisteredPost? = client.post( createPostAddress ) { - body = content + body = post.content } override suspend fun deletePost(id: PostId): Boolean = client.post(deletePostAddress) { @@ -39,8 +39,8 @@ class WritableHttpPostsAPI( override suspend fun updatePostContent( postId: PostId, - content: PostContents + post: Post ): Boolean = client.post(createPostAddress) { - body = UpdatePostRequest(postId, content) + body = UpdatePostRequest(postId, post.content) } } \ No newline at end of file diff --git a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/api/ReadPostsAPI.kt b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/api/ReadPostsAPI.kt index eb001bce..b0bdbeea 100644 --- a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/api/ReadPostsAPI.kt +++ b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/api/ReadPostsAPI.kt @@ -1,17 +1,16 @@ package com.insanusmokrassar.postssystem.core.api -import com.insanusmokrassar.postssystem.core.post.Post -import com.insanusmokrassar.postssystem.core.post.PostId import com.insanusmokrassar.postssystem.core.content.ContentId +import com.insanusmokrassar.postssystem.core.post.* import com.insanusmokrassar.postssystem.core.utils.pagination.* import com.insanusmokrassar.postssystem.core.utils.pagination.Pagination import com.insanusmokrassar.postssystem.core.utils.pagination.PaginationResult import org.joda.time.DateTime interface ReadPostsAPI { - suspend fun getPostById(id: PostId): Post? - suspend fun getPostsByContent(id: ContentId): List - suspend fun getPostsByDates(from: DateTime? = null, to: DateTime? = null): List + suspend fun getPostById(id: PostId): RegisteredPost? + suspend fun getPostsByContent(id: ContentId): List + suspend fun getPostsByDates(from: DateTime? = null, to: DateTime? = null): List - suspend fun getPostsByPagination(pagination: Pagination): PaginationResult + suspend fun getPostsByPagination(pagination: Pagination): PaginationResult } \ No newline at end of file diff --git a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/api/WritePostsAPI.kt b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/api/WritePostsAPI.kt index 43b2897c..881120b2 100644 --- a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/api/WritePostsAPI.kt +++ b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/api/WritePostsAPI.kt @@ -5,12 +5,12 @@ import com.insanusmokrassar.postssystem.core.post.* import kotlinx.coroutines.flow.Flow interface WritePostsAPI { - val postCreatedFlow: Flow - val postDeletedFlow: Flow - val postUpdatedFlow: Flow + val postCreatedFlow: Flow + val postDeletedFlow: Flow + val postUpdatedFlow: Flow - suspend fun createPost(content: PostContents): Post? + suspend fun createPost(post: Post): RegisteredPost? suspend fun deletePost(id: PostId): Boolean - suspend fun updatePostContent(postId: PostId, content: PostContents): Boolean + suspend fun updatePostContent(postId: PostId, post: Post): Boolean } \ No newline at end of file diff --git a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt index 69ed6956..c5f4c4b6 100644 --- a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt +++ b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt @@ -2,6 +2,8 @@ package com.insanusmokrassar.postssystem.core.content typealias ContentId = String -interface Content { +interface Content + +interface RegisteredContent : Content { val id: ContentId } diff --git a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/content/TextContent.kt b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/content/TextContent.kt index 3dae566d..af2608e6 100644 --- a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/content/TextContent.kt +++ b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/content/TextContent.kt @@ -1,5 +1,20 @@ package com.insanusmokrassar.postssystem.core.content +import kotlinx.serialization.Serializable + interface TextContent : Content { val text: String -} \ No newline at end of file +} + +interface TextRegisteredContent : RegisteredContent, TextContent + +@Serializable +data class SimpleTextContent( + override val text: String +) : TextContent + +@Serializable +data class SimpleTextRegisteredContent( + override val id: ContentId, + override val text: String +) : TextRegisteredContent diff --git a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/post/Post.kt b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/post/Post.kt index f2cec695..2e4b6e29 100644 --- a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/post/Post.kt +++ b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/post/Post.kt @@ -1,21 +1,36 @@ package com.insanusmokrassar.postssystem.core.post import com.insanusmokrassar.postssystem.core.content.Content +import com.insanusmokrassar.postssystem.core.content.RegisteredContent import kotlinx.serialization.Serializable +import org.joda.time.DateTime typealias PostId = String typealias PostContents = List +typealias RegisteredPostContents = List interface Post { - val id: PostId val content: PostContents +} - val meta: PostMetaInfo +interface RegisteredPost : Post { + val id: PostId + + override val content: RegisteredPostContents + + val creationDate: DateTime + val modificationDate: DateTime } @Serializable data class SimplePost( - override val id: PostId, - override val content: PostContents, - override val meta: PostMetaInfo + override val content: PostContents ) : Post + +@Serializable +data class SimpleRegisteredPost( + override val id: PostId, + override val content: RegisteredPostContents, + override val creationDate: DateTime, + override val modificationDate: DateTime = creationDate +) : RegisteredPost \ No newline at end of file diff --git a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/post/PostMetaInfo.kt b/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/post/PostMetaInfo.kt deleted file mode 100644 index f6133d6c..00000000 --- a/Core/src/main/kotlin/com/insanusmokrassar/postssystem/core/post/PostMetaInfo.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.insanusmokrassar.postssystem.core.post - -import org.joda.time.DateTime - -interface PostMetaInfo { - val postId: PostId - val creationDate: DateTime - val modificationDate: DateTime -} \ No newline at end of file diff --git a/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/Commons.kt b/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/Commons.kt index b2355b1d..ec03f14d 100644 --- a/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/Commons.kt +++ b/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/Commons.kt @@ -1,7 +1,7 @@ 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.post.SimpleRegisteredPost import com.insanusmokrassar.postssystem.core.utils.pagination.PaginationResult import io.ktor.application.ApplicationCall import io.ktor.http.ContentType @@ -15,8 +15,8 @@ import kotlinx.serialization.internal.NullableSerializer import kotlinx.serialization.json.Json -internal val postsSerializer = ArrayListSerializer(SimplePost.serializer()) -internal val paginationResultSerializer = PaginationResult.serializer(SimplePost.serializer()) +internal val postsSerializer = ArrayListSerializer(SimpleRegisteredPost.serializer()) +internal val paginationResultSerializer = PaginationResult.serializer(SimpleRegisteredPost.serializer()) internal val List.asSimplePostList get() = map { post -> @@ -25,8 +25,8 @@ internal val List.asSimplePostList internal val Post.asSimplePost get() = when (this) { - is SimplePost -> this - else -> SimplePost(id, content, meta) + is SimpleRegisteredPost -> this + else -> SimpleRegisteredPost(id, content, meta) } @InternalSerializationApi diff --git a/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/ReadModules.kt b/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/ReadModules.kt index 326ac614..5d1498cd 100644 --- a/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/ReadModules.kt +++ b/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/ReadModules.kt @@ -8,17 +8,10 @@ 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.* -import io.ktor.features.ContentNegotiation -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 io.ktor.serialization.serialization import kotlinx.serialization.InternalSerializationApi -import kotlinx.serialization.json.Json import org.joda.time.DateTime @InternalSerializationApi @@ -26,7 +19,7 @@ fun Route.includePostsCoreReadModules(readPostsAPI: ReadPostsAPI) { post(getPostByIdAddress) { call.receiveOrNull() ?.also { id -> val post = readPostsAPI.getPostById(id) - call.answer(SimplePost.serializer(), post ?.asSimplePost) + call.answer(SimpleRegisteredPost.serializer(), post ?.asSimplePost) } ?: call.answerBadRequest("Id of post") } post(getPostsByContentIdAddress) { diff --git a/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/WriteModules.kt b/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/WriteModules.kt index df93f7bf..975e11de 100644 --- a/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/WriteModules.kt +++ b/ServerPart/src/main/kotlin/com/insanusmokrassar/postssystem/core/server/WriteModules.kt @@ -5,14 +5,10 @@ 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.* -import io.ktor.features.ContentNegotiation -import io.ktor.http.ContentType 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.serialization.serialization -import io.ktor.websocket.WebSockets import io.ktor.websocket.webSocket import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect @@ -24,7 +20,7 @@ private inline fun Route.createWebsocket(path: String, flow: Flow) { webSocket("/$path") { flow.collect { val simplePost = it.asSimplePost - outgoing.send(Frame.Text(Json.plain.stringify(SimplePost.serializer(), simplePost))) + outgoing.send(Frame.Text(Json.plain.stringify(SimpleRegisteredPost.serializer(), simplePost))) } } } @@ -41,7 +37,7 @@ fun Route.includePostsCoreWriteModules( call.receiveOrNull() ?.also { contents -> val post = writePostsAPI.createPost(contents) - call.answer(SimplePost.serializer(), post ?.asSimplePost) + call.answer(SimpleRegisteredPost.serializer(), post ?.asSimplePost) } ?: call.answerBadRequest("Contents (List of Content)") }