update published posts repo
This commit is contained in:
PostsSystem.drawiogradle.properties
publishing
api
src
commonMain
kotlin
dev
inmo
postssystem
core
publishing
exposed
src
jvmMain
kotlin
dev
inmo
postssystem
core
publishing
exposed
@ -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>
|
||||
|
Reference in New Issue
Block a user