From 476061780864378226cc1f54ef5d75e659812225 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 3 Nov 2019 00:32:51 +0600 Subject: [PATCH] started to fill InMemoryPostsAPI --- .../postssystem/core/api/ReadPostsAPI.kt | 17 +++++++ .../core/utils/pagination/Pagination.kt | 17 ++++++- .../postssystem/core/api/InMemoryPostsAPI.kt | 44 +++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 core/src/test/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryPostsAPI.kt 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 b0bdbeea..250d08b1 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 @@ -7,10 +7,27 @@ import com.insanusmokrassar.postssystem.core.utils.pagination.Pagination import com.insanusmokrassar.postssystem.core.utils.pagination.PaginationResult import org.joda.time.DateTime +/** + * Simple read API by different properties + */ interface ReadPostsAPI { + /** + * @return [RegisteredPost] if it is available by [id] + */ suspend fun getPostById(id: PostId): RegisteredPost? + + /** + * @return all [RegisteredPost]s which contains content with specified content [id] + */ suspend fun getPostsByContent(id: ContentId): List + + /** + * @return all [RegisteredPost]s between [from] and [to]. Range will be used INCLUSIVE, line \[[from], [to]\] + */ suspend fun getPostsByDates(from: DateTime? = null, to: DateTime? = null): List + /** + * @return all posts by pages basing on their creation date + */ suspend fun getPostsByPagination(pagination: Pagination): PaginationResult } \ No newline at end of file diff --git a/core/src/main/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/Pagination.kt b/core/src/main/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/Pagination.kt index 5e97a362..a8496b9d 100644 --- a/core/src/main/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/Pagination.kt +++ b/core/src/main/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/Pagination.kt @@ -17,4 +17,19 @@ interface Pagination { * Size of current page. Offset can be calculated as [page] * [size] */ val size: Int -} \ No newline at end of file +} + +/** + * First number in index of objects. It can be used as offset for databases or other data sources + */ +val Pagination.firstIndex: Int + get() = page * size + +/** + * Last number in index of objects. In fact, one [Pagination] object represent data in next range: + * + * [[firstIndex], [lastIndex]]; That means, that for [Pagination] with [Pagination.size] == 10 and [Pagination.page] == 1 + * you will retrieve [Pagination.firstIndex] == 10 and [Pagination.lastIndex] == 19. + */ +val Pagination.lastIndex: Int + get() = firstIndex + size - 1 diff --git a/core/src/test/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryPostsAPI.kt b/core/src/test/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryPostsAPI.kt new file mode 100644 index 00000000..c136f86a --- /dev/null +++ b/core/src/test/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryPostsAPI.kt @@ -0,0 +1,44 @@ +package com.insanusmokrassar.postssystem.core.api + +import com.insanusmokrassar.postssystem.core.content.ContentId +import com.insanusmokrassar.postssystem.core.content.RegisteredContent +import com.insanusmokrassar.postssystem.core.post.PostId +import com.insanusmokrassar.postssystem.core.post.RegisteredPost +import com.insanusmokrassar.postssystem.core.utils.pagination.* +import org.joda.time.DateTime + +class InMemoryPostsAPI( + initialPosts: List = emptyList() +) : PostsAPI { + private val posts: MutableMap = initialPosts.associateBy { it.id }.toMutableMap() + private val content: MutableMap = initialPosts.asSequence().flatMap { + it.content.asSequence() + }.associateBy { + it.id + }.toMutableMap() + + private val sortedByDatePosts: List + get() = posts.values.sortedBy { it.creationDate } + + override suspend fun getPostById(id: PostId): RegisteredPost? = posts[id] + override suspend fun getPostsByContent(id: ContentId): List = posts.values.filter { post -> + post.content.any { it.id == id } + } + override suspend fun getPostsByDates(from: DateTime?, to: DateTime?): List = posts.values.filter { + from ?.let { _ -> it.creationDate > from } ?: true && to ?.let { _ -> it.creationDate < to } ?: true + } + override suspend fun getPostsByPagination( + pagination: Pagination + ): PaginationResult = sortedByDatePosts.subList( + pagination.firstIndex, + pagination.lastIndex + ).let { + PaginationResult( + pagination.page, + posts.size / pagination.size, + it + ) + } + + +}