update published posts repo

This commit is contained in:
2020-12-02 17:51:43 +06:00
parent 703f3c057c
commit a3c4b67304
5 changed files with 123 additions and 43 deletions
PostsSystem.drawiogradle.properties
publishing
api
src
commonMain
kotlin
dev
inmo
postssystem
exposed
src
jvmMain
kotlin
dev
inmo
postssystem
core

@ -1,14 +1,15 @@
package dev.inmo.postssystem.core.publishing
import dev.inmo.micro_utils.repos.create
import dev.inmo.postssystem.core.post.PostId
import dev.inmo.postssystem.core.post.RegisteredPost
import dev.inmo.postssystem.core.post.repo.PostsRepo
import dev.inmo.postssystem.core.publishing.repos.PublishedPostsWriteRepo
import dev.inmo.postssystem.core.publishing.repos.PublishingKeysRepo
import dev.inmo.postssystem.core.publishing.repos.*
import kotlinx.coroutines.flow.*
import kotlinx.serialization.Serializable
interface PublishingTrigger {
val postingTriggeredFlow: SharedFlow<RegisteredPost>
val postingTriggeredFlow: SharedFlow<PublishedPost>
suspend fun triggerPosting(
triggerControlKey: TriggerControlKey
@ -20,23 +21,17 @@ class BusinessPublishingTrigger(
private val publishedPostsRepo: PublishedPostsWriteRepo,
private val publishingKeysRepo: PublishingKeysRepo
) : PublishingTrigger {
private val _postingTriggeredFlow: MutableSharedFlow<RegisteredPost> = MutableSharedFlow()
override val postingTriggeredFlow: SharedFlow<RegisteredPost> = _postingTriggeredFlow.asSharedFlow()
private val _postingTriggeredFlow: MutableSharedFlow<PublishedPost> = MutableSharedFlow()
override val postingTriggeredFlow: SharedFlow<PublishedPost> = _postingTriggeredFlow.asSharedFlow()
override suspend fun triggerPosting(triggerControlKey: TriggerControlKey): PostId? {
val postId = publishingKeysRepo.getPostIdByTriggerControlKey(triggerControlKey) ?: return null
publishingKeysRepo.unsetPostTriggerControlKey(postId)
return postsRepo.getPostById(postId) ?.let { post ->
publishedPostsRepo.registerPublishedPost(post) ?.let { publishedPost ->
if (postsRepo.deletePost(postId)) {
_postingTriggeredFlow.emit(post)
postId
} else {
publishedPostsRepo.unpublishPost(publishedPost.id)
null
}
publishedPostsRepo.create(post).firstOrNull() ?.also {
_postingTriggeredFlow.emit(it)
}
}
} ?.id
}
}

@ -1,36 +1,40 @@
package dev.inmo.postssystem.core.publishing.repos
import com.soywiz.klock.DateTime
import dev.inmo.micro_utils.pagination.*
import dev.inmo.micro_utils.repos.*
import dev.inmo.postssystem.core.UnixMillis
import dev.inmo.postssystem.core.post.PostId
import dev.inmo.postssystem.core.post.RegisteredPost
import dev.inmo.postssystem.core.post.repo.PostsRepo
import dev.inmo.postssystem.core.post.repo.ReadPostsRepo
import kotlinx.coroutines.flow.Flow
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
interface PublishedPostsReadRepo : ReadPostsRepo
interface PublishedPostsWriteRepo {
val postPublishedFlow: Flow<RegisteredPost>
val postUnpublishedFlow: Flow<RegisteredPost>
suspend fun registerPublishedPost(registeredPost: RegisteredPost): RegisteredPost?
suspend fun unpublishPost(postId: PostId): Boolean?
typealias PublishedPostId = String
@Serializable
data class PublishedPost(
val id: PublishedPostId,
val post: RegisteredPost,
private val publicationTime: UnixMillis
) {
@Transient
val publicationDateTime = DateTime(publicationTime)
}
interface PublishedPostsRepo : PublishedPostsReadRepo, PublishedPostsWriteRepo
class BusinessPublishedPostsRepo(
private val realPostsRepoWithPublishedPosts: PostsRepo
) : PublishedPostsRepo, ReadPostsRepo by realPostsRepoWithPublishedPosts {
override val postPublishedFlow: Flow<RegisteredPost>
get() = realPostsRepoWithPublishedPosts.postCreatedFlow
override val postUnpublishedFlow: Flow<RegisteredPost>
get() = realPostsRepoWithPublishedPosts.postDeletedFlow
override suspend fun registerPublishedPost(
registeredPost: RegisteredPost
): RegisteredPost? = realPostsRepoWithPublishedPosts.createPost(registeredPost)
override suspend fun unpublishPost(
postId: PostId
): Boolean? = realPostsRepoWithPublishedPosts.deletePost(postId)
interface PublishedPostsReadRepo : ReadCRUDRepo<PublishedPost, PublishedPostId> {
suspend fun getPostPublishing(
postId: PostId,
pagination: Pagination,
reversed: Boolean = false
): PaginationResult<PublishedPostId>
}
suspend inline fun PostId.isPublished(lookIn: PublishedPostsReadRepo): Boolean {
return lookIn.getPostPublishing(this, FirstPagePagination(1)).results.isNotEmpty()
}
suspend inline fun RegisteredPost.isPublished(lookIn: PublishedPostsReadRepo): Boolean {
return lookIn.getPostPublishing(id, FirstPagePagination(1)).results.isNotEmpty()
}
interface PublishedPostsWriteRepo : WriteCRUDRepo<PublishedPost, PublishedPostId, RegisteredPost>
interface PublishedPostsRepo : PublishedPostsReadRepo, PublishedPostsWriteRepo, CRUDRepo<PublishedPost, PublishedPostId, RegisteredPost>