create_session.rs
1 use rocket::{http::Header, State}; 2 use sqlx::Pool; 3 use uuid::Uuid; 4 5 use crate::{ 6 api::container_spec::{Auth, DOCKER_UPLOAD_UUID_HEADER_NAME, RANGE_HEADER_NAME}, 7 db::DB, 8 header, location, 9 services::upload_blob_service, 10 }; 11 12 #[derive(Responder, Debug)] 13 pub struct CreateSessionResponseData<'a> { 14 response: &'a str, 15 location: Header<'a>, 16 range: Header<'a>, 17 docker_upload_uuid: Header<'a>, 18 } 19 20 #[derive(Responder)] 21 pub enum CreateSessionResponse<'a> { 22 #[response(status = 202)] 23 Success(CreateSessionResponseData<'a>), 24 #[response(status = 500)] 25 Failure(&'a str), 26 } 27 28 #[post("/v2/<name>/blobs/uploads")] 29 pub async fn post_create_session<'a>( 30 db_pool: &State<Pool<DB>>, 31 auth: Auth, 32 name: &str, 33 ) -> CreateSessionResponse<'a> { 34 let initial_session_id: Uuid = 35 match upload_blob_service::create_session(db_pool, &auth.username, name).await { 36 Ok(id) => id.into(), 37 Err(e) => { 38 error!("Failed to create upload session, err: {e:?}"); 39 return CreateSessionResponse::Failure("Failed to ceate session"); 40 } 41 }; 42 43 CreateSessionResponse::Success(CreateSessionResponseData { 44 response: "Session created successfully", 45 location: location!(name, initial_session_id), 46 range: header!(RANGE_HEADER_NAME, "0-0"), 47 docker_upload_uuid: header!( 48 DOCKER_UPLOAD_UUID_HEADER_NAME, 49 initial_session_id.to_string() 50 ), 51 }) 52 }