From 25f225a0ddbd7cce9498c1c8c812ad61288599f2 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Sat, 10 Sep 2022 17:57:22 +0200 Subject: Route for model uploading files --- src/routes/model.rs | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'src/routes') diff --git a/src/routes/model.rs b/src/routes/model.rs index 4ac2688..66f8ec6 100644 --- a/src/routes/model.rs +++ b/src/routes/model.rs @@ -1,15 +1,23 @@ +use crate::config::MAX_UPLOAD_FILE_SIZE; use crate::errors::AppError; +use crate::files::upload; use crate::models::{ auth::Claims, model::{Model, ModelCreate, ModelUser}, }; use crate::pagination::Pagination; -use axum::{extract::Query, routing::get, Json, Router}; +use axum::{ + extract::{ContentLengthLimit, Multipart, Path, Query}, + routing::{get, post}, + Json, Router, +}; use serde::Serialize; /// Create routes for `/v1/models/` namespace pub fn create_route() -> Router { - Router::new().route("/", get(list_models).post(create_model)) + Router::new() + .route("/", get(list_models).post(create_model)) + .route("/:id/upload", post(upload_model_file)) } #[derive(Serialize)] @@ -47,3 +55,30 @@ async fn create_model( Ok(Json(model_new)) } + +/// Upload a file for a model +async fn upload_model_file( + claims: Claims, + Path(model_id): Path, + ContentLengthLimit(multipart): ContentLengthLimit, +) -> Result { + let model = match Model::find_by_id(model_id).await { + Ok(model) => model, + Err(_) => { + return Err(AppError::NotFound("Model not found".to_string())); + } + }; + + if model.author_id() != claims.user_id { + return Err(AppError::Unauthorized); + } + + match upload(multipart, vec!["stl"]).await { + Ok(saved_file) => { + return Ok(format!("Uploaded {}", saved_file)); + } + Err(e) => { + return Err(e); + } + } +} -- cgit v1.2.3-71-g8e6c