first fully ready for trying system
This commit is contained in:
client/src
features
files
common
src
jvmMain
kotlin
dev
inmo
postssystem
features
files
common
publication
common
src
commonMain
kotlin
dev
inmo
postssystem
features
publication
common
publicators
simple
client
common
build.gradle
src
server
template
server
services/posts/client
settings.gradletargets/telegram/publication/server/src/jvmMain/kotlin/dev/inmo/postssystem/targets/telegram/publication/server
@ -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)
|
||||
}
|
||||
|
||||
|
3
features/publication/common/src/commonMain/kotlin/dev/inmo/postssystem/features/publication/common/Constants.kt
Normal file
3
features/publication/common/src/commonMain/kotlin/dev/inmo/postssystem/features/publication/common/Constants.kt
Normal file
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
7
publicators/simple/client/src/commonMain/kotlin/dev/inmo/postssystem/publicators/simple/client/SimplePublicatorService.kt
Normal file
7
publicators/simple/client/src/commonMain/kotlin/dev/inmo/postssystem/publicators/simple/client/SimplePublicatorService.kt
Normal file
@ -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)
|
||||
}
|
33
publicators/simple/client/src/commonMain/kotlin/dev/inmo/postssystem/publicators/simple/client/SimplePublicatorServiceClient.kt
Normal file
33
publicators/simple/client/src/commonMain/kotlin/dev/inmo/postssystem/publicators/simple/client/SimplePublicatorServiceClient.kt
Normal file
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
4
publicators/simple/common/src/commonMain/kotlin/dev/inmo/postssystem/publicators/simple/common/Constants.kt
Normal file
4
publicators/simple/common/src/commonMain/kotlin/dev/inmo/postssystem/publicators/simple/common/Constants.kt
Normal file
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
17
publicators/simple/server/src/jvmMain/kotlin/dev/inmo/postssystem/publicators/simple/server/SimplePublicationTriggerLoader.kt
Normal file
17
publicators/simple/server/src/jvmMain/kotlin/dev/inmo/postssystem/publicators/simple/server/SimplePublicationTriggerLoader.kt
Normal file
@ -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()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
32
publicators/simple/server/src/jvmMain/kotlin/dev/inmo/postssystem/publicators/simple/server/SimplePublicatorRoutingConfigurator.kt
Normal file
32
publicators/simple/server/src/jvmMain/kotlin/dev/inmo/postssystem/publicators/simple/server/SimplePublicatorRoutingConfigurator.kt
Normal file
@ -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)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user