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 ) } } } } }