complete preparations for files uploading via posts
This commit is contained in:
server/src/main
services/posts
client
src
commonMain
kotlin
dev
inmo
postssystem
services
posts
common
src
commonMain
kotlin
dev
inmo
postssystem
services
posts
server
src
jvmMain
kotlin
dev
inmo
postssystem
services
posts
targets/telegram/publication/server/src/jvmMain/kotlin/dev/inmo/postssystem/targets/telegram/publication/server
58
services/posts/common/src/commonMain/kotlin/dev/inmo/postssystem/services/posts/common/BinaryContentSerializer.kt
Normal file
58
services/posts/common/src/commonMain/kotlin/dev/inmo/postssystem/services/posts/common/BinaryContentSerializer.kt
Normal file
@ -0,0 +1,58 @@
|
||||
package dev.inmo.postssystem.services.posts.common
|
||||
|
||||
import dev.inmo.micro_utils.common.FileName
|
||||
import dev.inmo.micro_utils.mime_types.MimeType
|
||||
import dev.inmo.micro_utils.mime_types.MimeTypeSerializer
|
||||
import dev.inmo.postssystem.features.common.common.SimpleInputProvider
|
||||
import dev.inmo.postssystem.features.content.common.BinaryContent
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.descriptors.*
|
||||
import kotlinx.serialization.encoding.*
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
@Serializer(BinaryContent::class)
|
||||
class BinaryContentSerializer<T: SimpleInputProvider>(
|
||||
private val kClass: KClass<T>,
|
||||
private val serializer: KSerializer<T>
|
||||
) : KSerializer<BinaryContent> {
|
||||
@OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class)
|
||||
override val descriptor: SerialDescriptor = buildSerialDescriptor(
|
||||
"BinaryContent",
|
||||
SerialKind.CONTEXTUAL
|
||||
) {
|
||||
element("filename", FileName.serializer().descriptor)
|
||||
element("mimetype", MimeTypeSerializer.descriptor)
|
||||
element("data", serializer.descriptor)
|
||||
}
|
||||
|
||||
override fun deserialize(decoder: Decoder): BinaryContent {
|
||||
return decoder.decodeStructure(descriptor) {
|
||||
var fileName: FileName? = null
|
||||
var mimeType: MimeType? = null
|
||||
var data: T? = null
|
||||
while (true) {
|
||||
when (val index = decodeElementIndex(descriptor)) {
|
||||
0 -> fileName = decodeSerializableElement(descriptor, 0, FileName.serializer())
|
||||
1 -> mimeType = decodeSerializableElement(descriptor, 1, MimeTypeSerializer)
|
||||
2 -> data = decodeSerializableElement(descriptor, 2, serializer)
|
||||
CompositeDecoder.DECODE_DONE -> break
|
||||
else -> error("Unexpected index: $index")
|
||||
}
|
||||
}
|
||||
BinaryContent(
|
||||
fileName ?: error("Filename must be presented, but was absent"),
|
||||
mimeType ?: error("Mimetype must be presented, but was absent"),
|
||||
data ?: error("Data must be presented, but was absent")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: BinaryContent) {
|
||||
require(kClass.isInstance(value.inputProvider)) { "${value.inputProvider} do not inherit $kClass" }
|
||||
encoder.encodeStructure(descriptor) {
|
||||
encodeSerializableElement(descriptor, 0, FileName.serializer(), value.filename)
|
||||
encodeSerializableElement(descriptor, 1, MimeTypeSerializer, value.mimeType)
|
||||
encodeSerializableElement(descriptor, 2, serializer, value.inputProvider as T)
|
||||
}
|
||||
}
|
||||
}
|
13
services/posts/common/src/commonMain/kotlin/dev/inmo/postssystem/services/posts/common/Constants.kt
13
services/posts/common/src/commonMain/kotlin/dev/inmo/postssystem/services/posts/common/Constants.kt
@ -2,8 +2,7 @@ package dev.inmo.postssystem.services.posts.common
|
||||
|
||||
import kotlinx.serialization.SerialFormat
|
||||
import kotlinx.serialization.cbor.Cbor
|
||||
import kotlinx.serialization.modules.SerializersModule
|
||||
import kotlinx.serialization.modules.SerializersModuleBuilder
|
||||
import kotlinx.serialization.modules.*
|
||||
|
||||
const val postsRootPath = "posts"
|
||||
const val postsCreateTempPathPart = "temp"
|
||||
@ -13,8 +12,10 @@ const val postsPostIdParameter = "postId"
|
||||
fun SerialFormat.createWithSerializerModuleExtension(
|
||||
configurator: SerializersModuleBuilder.() -> Unit
|
||||
) = Cbor {
|
||||
serializersModule = SerializersModule {
|
||||
include(this@createWithSerializerModuleExtension.serializersModule)
|
||||
configurator()
|
||||
}
|
||||
serializersModule = this@createWithSerializerModuleExtension.serializersModule.overwriteWith(
|
||||
SerializersModule {
|
||||
include(this@createWithSerializerModuleExtension.serializersModule)
|
||||
configurator()
|
||||
}
|
||||
)
|
||||
}
|
||||
|
Reference in New Issue
Block a user