add target and telegram target

This commit is contained in:
2022-01-07 21:35:11 +06:00
parent 6171eb3c40
commit 3661c1ca73
20 changed files with 232 additions and 3 deletions

View File

@@ -12,6 +12,7 @@ kotlin {
dependencies {
api project(":postssystem.features.common.common")
api project(":postssystem.features.content.common")
api "dev.inmo:micro_utils.mime_types:$microutils_version"
}
}
}

View File

@@ -1,9 +1,14 @@
package dev.inmo.postssystem.features.content.binary.common
import dev.inmo.micro_utils.common.ByteArrayAllocator
import dev.inmo.micro_utils.common.FileName
import dev.inmo.micro_utils.mime_types.MimeType
import dev.inmo.postssystem.features.content.common.Content
import kotlinx.serialization.Serializable
@Serializable
data class BinaryContent(
val bytes: ByteArray
) : Content
val filename: FileName,
val mimeType: MimeType,
val bytesAllocator: ByteArrayAllocator
) : Content

View File

@@ -2,7 +2,8 @@ package dev.inmo.postssystem.features.content.common
import kotlinx.serialization.Serializable
typealias ContentId = String
@Serializable
value class ContentId(val string: String)
/**
* Content which is planned to be registered in database

View File

@@ -0,0 +1,6 @@
package dev.inmo.postssystem.features.content.server
import dev.inmo.micro_utils.repos.CRUDRepo
import dev.inmo.postssystem.features.content.common.*
interface ServerContentStorage : ServerReadContentStorage, ServerWriteContentStorage, CRUDRepo<RegisteredContent, ContentId, Content>

View File

@@ -0,0 +1,7 @@
package dev.inmo.postssystem.features.content.server
import dev.inmo.micro_utils.repos.ReadCRUDRepo
import dev.inmo.postssystem.features.content.common.ContentId
import dev.inmo.postssystem.features.content.common.RegisteredContent
interface ServerReadContentStorage : ReadCRUDRepo<RegisteredContent, ContentId>

View File

@@ -0,0 +1,6 @@
package dev.inmo.postssystem.features.content.server
import dev.inmo.micro_utils.repos.WriteCRUDRepo
import dev.inmo.postssystem.features.content.common.*
interface ServerWriteContentStorage : WriteCRUDRepo<RegisteredContent, ContentId, Content>

View File

@@ -0,0 +1,18 @@
plugins {
id "org.jetbrains.kotlin.multiplatform"
id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library"
}
apply from: "$mppProjectWithSerializationPresetPath"
kotlin {
sourceSets {
commonMain {
dependencies {
api project(":postssystem.features.publication.common")
api project(":postssystem.features.common.client")
}
}
}
}

View File

@@ -0,0 +1 @@
<manifest package="dev.inmo.postssystem.features.publication.client"/>

View File

@@ -0,0 +1,19 @@
plugins {
id "org.jetbrains.kotlin.multiplatform"
id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library"
}
apply from: "$mppProjectWithSerializationPresetPath"
kotlin {
sourceSets {
commonMain {
dependencies {
api project(":postssystem.features.common.common")
api project(":postssystem.features.content.common")
api project(":postssystem.features.posts.common")
}
}
}
}

View File

@@ -0,0 +1 @@
<manifest package="dev.inmo.postssystem.features.publication.common"/>

View File

@@ -0,0 +1,19 @@
plugins {
id "org.jetbrains.kotlin.multiplatform"
id "org.jetbrains.kotlin.plugin.serialization"
}
apply from: "$mppJavaProjectPresetPath"
kotlin {
sourceSets {
commonMain {
dependencies {
api project(":postssystem.features.publication.common")
api project(":postssystem.features.common.server")
api project(":postssystem.features.content.server")
api project(":postssystem.features.posts.server")
}
}
}
}

View File

@@ -0,0 +1,33 @@
package dev.inmo.postssystem.features.publication.server
import dev.inmo.micro_utils.coroutines.asyncSafelyWithoutExceptions
import dev.inmo.postssystem.features.content.server.ServerReadContentStorage
import dev.inmo.postssystem.features.posts.common.PostId
import dev.inmo.postssystem.features.posts.server.ServerReadPostsStorage
import kotlinx.coroutines.*
class PublicationManager (
private val targets: List<PublicationTarget>,
private val postsRepo: ServerReadPostsStorage,
private val contentRepo: ServerReadContentStorage,
private val scope: CoroutineScope
) {
suspend fun publish(
postId: PostId
) {
val post = postsRepo.getById(postId) ?: return
val content = post.content.map {
scope.async {
contentRepo.getById(it)
}
}.awaitAll().filterNotNull()
val publicationPost = PublicationPost(post, content)
targets.map {
scope.asyncSafelyWithoutExceptions {
it.publish(publicationPost)
}
}.awaitAll()
}
}

View File

@@ -0,0 +1,11 @@
package dev.inmo.postssystem.features.publication.server
import dev.inmo.postssystem.features.content.common.RegisteredContent
import dev.inmo.postssystem.features.posts.common.RegisteredPost
import kotlinx.serialization.Serializable
@Serializable
data class PublicationPost(
val post: RegisteredPost,
val content: List<RegisteredContent>
)

View File

@@ -0,0 +1,5 @@
package dev.inmo.postssystem.features.publication.server
fun interface PublicationTarget {
suspend fun publish(post: PublicationPost)
}