/ backend / src / api / container_spec / blobs / create_session.rs
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  }