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 }