first fully ready for trying system
This commit is contained in:
parent
559545438a
commit
369dcb12f5
@ -29,6 +29,8 @@ import dev.inmo.postssystem.features.content.common.ContentSerializersModuleConf
|
||||
import dev.inmo.postssystem.features.content.common.OtherContentSerializerModuleConfigurator
|
||||
import dev.inmo.postssystem.features.content.text.common.TextContentSerializerModuleConfigurator
|
||||
import dev.inmo.postssystem.features.status.client.StatusFeatureClient
|
||||
import dev.inmo.postssystem.publicators.simple.client.SimplePublicatorService
|
||||
import dev.inmo.postssystem.publicators.simple.client.SimplePublicatorServiceClient
|
||||
import dev.inmo.postssystem.services.posts.client.ClientPostsService
|
||||
import dev.inmo.postssystem.services.posts.common.*
|
||||
import io.ktor.client.HttpClient
|
||||
@ -138,5 +140,6 @@ fun getAuthorizedFeaturesDIModule(
|
||||
ReadPostsService::class,
|
||||
WritePostsService::class
|
||||
)
|
||||
single<SimplePublicatorService> { SimplePublicatorServiceClient(get(serverUrlQualifier), get()) }
|
||||
}
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ fun baseKoin(): Koin {
|
||||
factory { AuthUIViewModel(get()) }
|
||||
factory { AuthView(get(), get(UIScopeQualifier)) }
|
||||
|
||||
factory<PostCreateUIModel> { DefaultPostCreateUIModel(get()) }
|
||||
factory<PostCreateUIModel> { DefaultPostCreateUIModel(get(), get()) }
|
||||
factory { PostCreateUIViewModel(get()) }
|
||||
factory { PostCreateView(get(), get(UIScopeQualifier)) }
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import dev.inmo.postssystem.features.files.common.storage.WriteFilesStorage
|
||||
import dev.inmo.micro_utils.repos.*
|
||||
import io.ktor.utils.io.core.copyTo
|
||||
import io.ktor.utils.io.streams.asOutput
|
||||
import io.ktor.utils.io.streams.writePacket
|
||||
import kotlinx.coroutines.flow.*
|
||||
import java.io.File
|
||||
|
||||
@ -38,7 +39,11 @@ class WriteDistFilesStorage(
|
||||
file = newId.file
|
||||
} while (file.exists())
|
||||
metasKeyValueRepo.set(newId, it.toMetaFileInfo())
|
||||
it.inputProvider().copyTo(file.outputStream().asOutput())
|
||||
it.inputProvider().use { input ->
|
||||
file.outputStream().asOutput().use { output ->
|
||||
input.copyTo(output)
|
||||
}
|
||||
}
|
||||
FullFileInfoStorageWrapper(newId, it)
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,3 @@
|
||||
package dev.inmo.postssystem.features.publication.common
|
||||
|
||||
const val publicatorsRootPath = "publicators"
|
18
publicators/simple/client/build.gradle
Normal file
18
publicators/simple/client/build.gradle
Normal 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.publicators.simple.common")
|
||||
api project(":postssystem.features.publication.client")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package dev.inmo.postssystem.publicators.simple.client
|
||||
|
||||
import dev.inmo.postssystem.features.posts.common.PostId
|
||||
|
||||
interface SimplePublicatorService {
|
||||
suspend fun publish(postId: PostId)
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package dev.inmo.postssystem.publicators.simple.client
|
||||
|
||||
import dev.inmo.micro_utils.ktor.client.UnifiedRequester
|
||||
import dev.inmo.micro_utils.ktor.common.buildStandardUrl
|
||||
import dev.inmo.postssystem.features.posts.common.PostId
|
||||
import dev.inmo.postssystem.features.publication.common.publicatorsRootPath
|
||||
import dev.inmo.postssystem.publicators.simple.common.simplePublicatorPublishPathPart
|
||||
import dev.inmo.postssystem.publicators.simple.common.simplePublicatorRootPath
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
|
||||
class SimplePublicatorServiceClient(
|
||||
baseUrl: String,
|
||||
private val unifiedRequester: UnifiedRequester
|
||||
) : SimplePublicatorService {
|
||||
private val fullUrl = buildStandardUrl(
|
||||
baseUrl,
|
||||
buildStandardUrl(
|
||||
publicatorsRootPath,
|
||||
simplePublicatorRootPath
|
||||
)
|
||||
)
|
||||
|
||||
private val publishFullUrl = buildStandardUrl(
|
||||
fullUrl,
|
||||
simplePublicatorPublishPathPart
|
||||
)
|
||||
|
||||
override suspend fun publish(postId: PostId) = unifiedRequester.unipost(
|
||||
publishFullUrl,
|
||||
PostId.serializer() to postId,
|
||||
Unit.serializer()
|
||||
)
|
||||
}
|
1
publicators/simple/client/src/main/AndroidManifest.xml
Normal file
1
publicators/simple/client/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1 @@
|
||||
<manifest package="dev.inmo.postssystem.publicators.simple.client"/>
|
17
publicators/simple/common/build.gradle
Normal file
17
publicators/simple/common/build.gradle
Normal file
@ -0,0 +1,17 @@
|
||||
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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package dev.inmo.postssystem.publicators.simple.common
|
||||
|
||||
const val simplePublicatorRootPath = "simple"
|
||||
const val simplePublicatorPublishPathPart = "publish"
|
1
publicators/simple/common/src/main/AndroidManifest.xml
Normal file
1
publicators/simple/common/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1 @@
|
||||
<manifest package="dev.inmo.postssystem.publicators.simple.common"/>
|
17
publicators/simple/server/build.gradle
Normal file
17
publicators/simple/server/build.gradle
Normal file
@ -0,0 +1,17 @@
|
||||
plugins {
|
||||
id "org.jetbrains.kotlin.multiplatform"
|
||||
id "org.jetbrains.kotlin.plugin.serialization"
|
||||
}
|
||||
|
||||
apply from: "$mppJavaProjectPresetPath"
|
||||
|
||||
kotlin {
|
||||
sourceSets {
|
||||
commonMain {
|
||||
dependencies {
|
||||
api project(":postssystem.publicators.simple.common")
|
||||
api project(":postssystem.features.publication.server")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package dev.inmo.postssystem.publicators.simple.server
|
||||
|
||||
import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator
|
||||
import dev.inmo.postssystem.features.common.common.singleWithRandomQualifier
|
||||
import dev.inmo.postssystem.features.common.server.sessions.ModuleLoader
|
||||
import kotlinx.serialization.json.JsonObject
|
||||
import org.koin.core.module.Module
|
||||
|
||||
class SimplePublicationTriggerLoader : ModuleLoader {
|
||||
override fun Module.load(config: JsonObject) {
|
||||
singleWithRandomQualifier<ApplicationRoutingConfigurator.Element> {
|
||||
SimplePublicatorRoutingConfigurator(
|
||||
get()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package dev.inmo.postssystem.publicators.simple.server
|
||||
|
||||
import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator
|
||||
import dev.inmo.micro_utils.ktor.server.unianswer
|
||||
import dev.inmo.micro_utils.ktor.server.uniload
|
||||
import dev.inmo.postssystem.features.posts.common.PostId
|
||||
import dev.inmo.postssystem.features.publication.common.publicatorsRootPath
|
||||
import dev.inmo.postssystem.features.publication.server.PublicationManager
|
||||
import dev.inmo.postssystem.publicators.simple.common.simplePublicatorPublishPathPart
|
||||
import dev.inmo.postssystem.publicators.simple.common.simplePublicatorRootPath
|
||||
import io.ktor.application.call
|
||||
import io.ktor.routing.*
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
|
||||
class SimplePublicatorRoutingConfigurator(
|
||||
private val publicationManager: PublicationManager
|
||||
) : ApplicationRoutingConfigurator.Element {
|
||||
override fun Route.invoke() {
|
||||
route(publicatorsRootPath) {
|
||||
route(simplePublicatorRootPath) {
|
||||
post(simplePublicatorPublishPathPart) {
|
||||
val postId = call.uniload(PostId.serializer())
|
||||
|
||||
call.unianswer(
|
||||
Unit.serializer(),
|
||||
publicationManager.publish(postId)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -11,7 +11,7 @@ kotlin {
|
||||
commonMain {
|
||||
dependencies {
|
||||
api project(":postssystem.publicators.template.common")
|
||||
api project(":postssystem.features.common.client")
|
||||
api project(":postssystem.features.publication.client")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ kotlin {
|
||||
sourceSets {
|
||||
commonMain {
|
||||
dependencies {
|
||||
api project(":postssystem.features.common.common")
|
||||
api project(":postssystem.features.publication.common")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ kotlin {
|
||||
commonMain {
|
||||
dependencies {
|
||||
api project(":postssystem.publicators.template.common")
|
||||
api project(":postssystem.features.common.server")
|
||||
api project(":postssystem.features.publication.server")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,6 +25,8 @@ dependencies {
|
||||
|
||||
api project(":postssystem.services.posts.server")
|
||||
|
||||
api project(":postssystem.publicators.simple.server")
|
||||
|
||||
api project(":postssystem.targets.telegram.loader.server")
|
||||
api project(":postssystem.targets.telegram.publication.server")
|
||||
|
||||
|
File diff suppressed because one or more lines are too long
@ -7,7 +7,8 @@
|
||||
"filesFolder": "/tmp/files",
|
||||
"debugMode": true,
|
||||
"modules": [
|
||||
"dev.inmo.postssystem.targets.telegram.loader.server.TelegramTargetModuleLoader"
|
||||
"dev.inmo.postssystem.targets.telegram.loader.server.TelegramTargetModuleLoader",
|
||||
"dev.inmo.postssystem.publicators.simple.server.SimplePublicationTriggerLoader"
|
||||
],
|
||||
"telegram": {
|
||||
"botToken": "YOUR BOT TOKEN",
|
||||
|
@ -13,6 +13,7 @@ kotlin {
|
||||
api project(":postssystem.features.common.client")
|
||||
api project(":postssystem.services.posts.common")
|
||||
api project(":postssystem.features.posts.client")
|
||||
api project(":postssystem.publicators.simple.client")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,20 +2,25 @@ package dev.inmo.postssystem.services.posts.client.ui.create
|
||||
|
||||
import dev.inmo.postssystem.features.common.common.AbstractUIModel
|
||||
import dev.inmo.postssystem.features.content.common.Content
|
||||
import dev.inmo.postssystem.publicators.simple.client.SimplePublicatorService
|
||||
import dev.inmo.postssystem.services.posts.common.FullNewPost
|
||||
import dev.inmo.postssystem.services.posts.common.WritePostsService
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
class DefaultPostCreateUIModel(
|
||||
private val postCreationService: WritePostsService
|
||||
private val postCreationService: WritePostsService,
|
||||
private val publicationService: SimplePublicatorService
|
||||
) : PostCreateUIModel, AbstractUIModel<PostCreateUIState>(
|
||||
PostCreateUIState.Init
|
||||
) {
|
||||
override suspend fun create(content: List<Content>) {
|
||||
runCatching {
|
||||
_currentState.value = PostCreateUIState.Uploading
|
||||
postCreationService.create(
|
||||
val post = postCreationService.create(
|
||||
FullNewPost(content)
|
||||
)
|
||||
) ?: return@runCatching
|
||||
delay(1000L)
|
||||
publicationService.publish(post.id)
|
||||
}.onFailure {
|
||||
_currentState.value = PostCreateUIState.Fail
|
||||
}.onSuccess {
|
||||
|
@ -53,6 +53,10 @@ String[] includes = [
|
||||
":features:publication:client",
|
||||
":features:publication:server",
|
||||
|
||||
":publicators:simple:common",
|
||||
":publicators:simple:client",
|
||||
":publicators:simple:server",
|
||||
|
||||
":targets:telegram:publication:server",
|
||||
":targets:telegram:loader:common",
|
||||
":targets:telegram:loader:server",
|
||||
|
@ -12,6 +12,7 @@ import dev.inmo.tgbotapi.requests.send.SendTextMessage
|
||||
import dev.inmo.tgbotapi.requests.send.media.*
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import dev.inmo.tgbotapi.utils.StorageFile
|
||||
import dev.inmo.tgbotapi.utils.StorageFileInfo
|
||||
import io.ktor.utils.io.ByteReadChannel
|
||||
import io.ktor.utils.io.core.readBytes
|
||||
import kotlinx.coroutines.delay
|
||||
@ -25,7 +26,9 @@ class PublicationTargetTelegram(
|
||||
when (val content = it.content) {
|
||||
is BinaryContent -> {
|
||||
val storageFile by lazy {
|
||||
StorageFile(content.filename.name, content.inputProvider().readBytes()).asMultipartFile()
|
||||
StorageFile(StorageFileInfo(content.filename.name)) {
|
||||
content.inputProvider()
|
||||
}.asMultipartFile()
|
||||
}
|
||||
when (content.mimeType) {
|
||||
is KnownMimeTypes.Image.Jpeg,
|
||||
@ -38,7 +41,10 @@ class PublicationTargetTelegram(
|
||||
is KnownMimeTypes.Audio.Mpeg -> {
|
||||
SendAudio(targetChatId, storageFile)
|
||||
}
|
||||
else -> null
|
||||
else -> SendDocument(
|
||||
targetChatId,
|
||||
storageFile
|
||||
)
|
||||
}
|
||||
}
|
||||
is TextContent -> {
|
||||
@ -47,7 +53,16 @@ class PublicationTargetTelegram(
|
||||
else -> null
|
||||
}
|
||||
}.forEach { request ->
|
||||
bot.executeUnsafe(request, 3, 1000L)
|
||||
repeat(3) {
|
||||
runCatching {
|
||||
bot.execute(request)
|
||||
}.onFailure {
|
||||
it.printStackTrace()
|
||||
}.onSuccess {
|
||||
return@forEach
|
||||
}
|
||||
delay(1000L)
|
||||
}
|
||||
delay(100L)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user