core/features/content/binary/server/src/jvmMain/kotlin/dev/inmo/postssystem/features/content/binary/server/BinaryContentServerModuleLo...

108 lines
4.6 KiB
Kotlin

package dev.inmo.postssystem.features.content.binary.server
import dev.inmo.micro_utils.repos.exposed.keyvalue.ExposedKeyValueRepo
import dev.inmo.postssystem.features.common.common.singleWithBinds
import dev.inmo.postssystem.features.common.common.singleWithRandomQualifier
import dev.inmo.postssystem.features.common.server.Qualifiers
import dev.inmo.postssystem.features.common.server.ServerModuleLoader
import dev.inmo.postssystem.features.content.common.BinaryContent
import dev.inmo.postssystem.features.content.server.ServerContentStorageWrapper
import dev.inmo.postssystem.features.files.common.*
import dev.inmo.postssystem.features.files.common.storage.DefaultFilesStorage
import dev.inmo.postssystem.features.files.common.storage.FilesStorage
import kotlinx.serialization.json.*
import org.koin.core.module.Module
import org.koin.core.qualifier.StringQualifier
import java.io.File
/**
* This provider is declaring one additional optional section: "previewDimensions". This section is an object with two
* fields:
*
* * maxWidth
* * maxHeight
*
* for preview images
*/
class BinaryContentServerModuleLoader : ServerModuleLoader {
override fun Module.load(config: JsonObject) {
val binaryFilesFolderQualifier = StringQualifier("binaryFilesFolder")
val binaryStorageFilesQualifier = StringQualifier("binaryContentFiles")
val binaryPreviewStorageFilesQualifier = StringQualifier("binaryPreviewContentFiles")
val binaryPreviewFilesFolderQualifier = StringQualifier("binaryPreviewFilesFolder")
val binaryFilesMetasKeyValueRepoQualifier = StringQualifier("BinaryFilesMetaKV")
val binaryPreviewFilesMetasKeyValueRepoQualifier = StringQualifier("BinaryPreviewFilesMetaKV")
val binaryOriginalFilesMetasKeyValueRepoQualifier = StringQualifier("BinaryOriginalFilesMetaKV")
val binaryOriginalPreviewFilesMetasKeyValueRepoQualifier = StringQualifier("BinaryPreviewOriginalFilesMetaKV")
singleWithBinds(binaryFilesFolderQualifier) {
File(get<File>(Qualifiers.filesFolderQualifier), "binary_content").apply {
mkdirs()
}
}
single {
val dimensionsSection = config["previewDimensions"] ?: return@single PreviewImageDimensionsConfig()
get<Json>().decodeFromJsonElement(
PreviewImageDimensionsConfig.serializer(),
dimensionsSection
)
}
single<ImagesCropper> {
ScrimageBasedImagesCropper(get())
}
singleWithBinds(binaryPreviewFilesFolderQualifier) {
File(get<File>(binaryFilesFolderQualifier), "preview").apply {
mkdirs()
}
}
singleWithBinds(binaryOriginalFilesMetasKeyValueRepoQualifier) {
ExposedKeyValueRepo(get(), { text("fileid") }, { text("metaInfo") }, "BinaryContentFileIdsToMetas")
}
singleWithBinds(binaryOriginalPreviewFilesMetasKeyValueRepoQualifier) {
ExposedKeyValueRepo(get(), { text("fileid") }, { text("metaInfo") }, "BinaryPreviewContentFileIdsToMetas")
}
singleWithBinds(binaryFilesMetasKeyValueRepoQualifier) {
MetasKeyValueRepo(
get(),
get(binaryOriginalFilesMetasKeyValueRepoQualifier)
)
}
singleWithBinds(binaryPreviewFilesMetasKeyValueRepoQualifier) {
MetasKeyValueRepo(
get(),
get(binaryOriginalPreviewFilesMetasKeyValueRepoQualifier)
)
}
single<FilesStorage>(binaryStorageFilesQualifier) {
DefaultFilesStorage(
DiskReadFilesStorage(get(binaryFilesFolderQualifier), get(binaryFilesMetasKeyValueRepoQualifier)),
WriteDistFilesStorage(get(binaryFilesFolderQualifier), get(binaryFilesMetasKeyValueRepoQualifier))
)
}
single<FilesStorage>(binaryPreviewStorageFilesQualifier) {
DefaultFilesStorage(
DiskReadFilesStorage(get(binaryPreviewFilesFolderQualifier), get(binaryPreviewFilesMetasKeyValueRepoQualifier)),
WriteDistFilesStorage(get(binaryPreviewFilesFolderQualifier), get(binaryPreviewFilesMetasKeyValueRepoQualifier))
)
}
singleWithRandomQualifier {
ServerContentStorageWrapper(
BinaryServerContentStorage(
get(binaryStorageFilesQualifier),
get(binaryPreviewStorageFilesQualifier),
get(),
get()
),
BinaryContent::class
)
}
}
}