core/features/files/server/src/jvmMain/kotlin/dev/inmo/postssystem/features/files/server/FilesRoutingConfigurator.kt

53 lines
1.9 KiB
Kotlin

package dev.inmo.postssystem.features.files.server
import dev.inmo.postssystem.features.files.common.*
import dev.inmo.postssystem.features.files.common.storage.*
import dev.inmo.micro_utils.ktor.server.*
import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator
import dev.inmo.micro_utils.repos.ktor.server.crud.*
import io.ktor.http.HttpStatusCode
import io.ktor.http.decodeURLQueryComponent
import io.ktor.server.application.call
import io.ktor.server.auth.authenticate
import io.ktor.server.request.receive
import io.ktor.server.response.respond
import io.ktor.server.response.respondBytes
import io.ktor.server.routing.*
import kotlinx.serialization.builtins.nullable
class FilesRoutingConfigurator(
private val filesStorage: ReadFilesStorage,
private val writeFilesStorage: WriteFilesStorage?,
) : ApplicationRoutingConfigurator.Element {
constructor(filesStorage: FilesStorage) : this(filesStorage, filesStorage)
override fun Route.invoke() {
authenticate {
route(filesRootPathPart) {
configureReadCRUDRepoRoutes(
filesStorage,
::FileId
)
writeFilesStorage ?.let {
configureWriteCRUDRepoRoutes(writeFilesStorage)
}
post(filesGetFilesPathPart) {
call.respondBytes(
filesStorage.getBytes(
call.receive()
)
)
}
get(filesGetFullFileInfoPathPart) {
call.respond(
filesStorage.getFullFileInfo(
FileId(call.getParameterOrSendError(filesFileIdParameter) ?.decodeURLQueryComponent() ?: return@get)
) ?: HttpStatusCode.NoContent
)
}
}
}
}
}