/ backend / src / api / container_spec / blobs / read_session.rs
read_session.rs
 1  use rocket::{http::Header, State};
 2  use sqlx::Pool;
 3  
 4  use crate::api::container_spec::Auth;
 5  use crate::db::DB;
 6  use crate::models::upload_session::UploadSession;
 7  use crate::registry_error::RegistryResult;
 8  use crate::services::get_upload_session_service;
 9  use crate::types::session_id::SessionId;
10  use crate::{header, location, range};
11  
12  #[derive(Responder, Debug)]
13  pub struct GetUploadSessionResponseData<'a> {
14      inner: (),
15      location: Header<'a>,
16      range: Header<'a>,
17  }
18  
19  #[derive(Responder)]
20  pub enum GetUploadSessionResponse<'a> {
21      #[response(status = 204)]
22      Success(GetUploadSessionResponseData<'a>),
23      #[response(status = 500)]
24      Failure(&'a str),
25  }
26  
27  #[get("/v2/<name>/blobs/uploads/<session_id>")]
28  pub async fn get_upload_session<'a>(
29      db_pool: &State<Pool<DB>>,
30      _auth: Auth,
31      name: &str,
32      session_id: &str,
33  ) -> GetUploadSessionResponse<'a> {
34      let latest_session = match handle_get_upload_session(db_pool, name, session_id).await {
35          Ok(v) => v,
36          Err(err) => {
37              warn!("Failed to retrieve upload session, due to err: {err:?}");
38              return GetUploadSessionResponse::Failure("Failed to retrieve upload session");
39          }
40      };
41  
42      GetUploadSessionResponse::Success(GetUploadSessionResponseData {
43          inner: (),
44          location: location!(name, latest_session.id),
45          range: range!(latest_session),
46      })
47  }
48  
49  async fn handle_get_upload_session(
50      db_pool: &Pool<DB>,
51      name: &str,
52      session_id: &str,
53  ) -> RegistryResult<UploadSession> {
54      let session_id = SessionId::parse(session_id)?;
55  
56      let session =
57          get_upload_session_service::retrieve_last_upload_session(db_pool, name, session_id).await?;
58  
59      Ok(session)
60  }