/ backend / src / db / upload_session_repository.rs
upload_session_repository.rs
  1  use sqlx::Transaction;
  2  use uuid::Uuid;
  3  
  4  use crate::{models::upload_session::UploadSession, registry_error::RegistryResult};
  5  
  6  use super::DB;
  7  
  8  pub async fn insert(
  9      transaction: &mut Transaction<'_, DB>,
 10      prev_session: Option<Uuid>,
 11      starting_byte_index: i32,
 12      repository: &str,
 13  ) -> RegistryResult<UploadSession> {
 14      Ok(sqlx::query_as!(
 15          UploadSession,
 16          r#"
 17  INSERT INTO upload_session(digest, starting_byte_index, repository, previous_session)
 18  VALUES                    (null,   $1,                  $2,         $3)
 19  RETURNING id, previous_session, starting_byte_index, digest, repository, created_at, is_finished
 20      "#,
 21          starting_byte_index,
 22          repository,
 23          prev_session,
 24      )
 25      .fetch_one(&mut **transaction)
 26      .await?)
 27  }
 28  
 29  pub async fn set_digest(
 30      transaction: &mut Transaction<'_, DB>,
 31      id: Uuid,
 32      digest: &str,
 33  ) -> RegistryResult<()> {
 34      sqlx::query_as!(
 35          UploadSession,
 36          r#"
 37  UPDATE upload_session
 38  SET digest = $1
 39  WHERE id = $2
 40          "#,
 41          digest,
 42          id
 43      )
 44      .execute(&mut **transaction)
 45      .await?;
 46  
 47      Ok(())
 48  }
 49  
 50  pub async fn set_finished(
 51      transaction: &mut Transaction<'_, DB>,
 52      session_id: Uuid,
 53      repository: &str,
 54  ) -> RegistryResult<()> {
 55      sqlx::query_as!(
 56          UploadSession,
 57          r#"
 58  UPDATE upload_session
 59  SET is_finished=TRUE
 60  WHERE id = $1 AND repository = $2
 61          "#,
 62          session_id,
 63          repository
 64      )
 65      .execute(&mut **transaction)
 66      .await?;
 67  
 68      Ok(())
 69  }
 70  
 71  pub async fn find_by_repository_and_id(
 72      transaction: &mut Transaction<'_, DB>,
 73      repository: &str,
 74      session_id: Uuid,
 75  ) -> RegistryResult<Option<UploadSession>> {
 76      Ok(sqlx::query_as!(
 77          UploadSession,
 78          r#"
 79  SELECT id, previous_session, starting_byte_index, digest, repository, created_at, is_finished
 80  FROM upload_session
 81  WHERE id = $1 AND repository = $2
 82      "#,
 83          session_id,
 84          repository
 85      )
 86      .fetch_optional(&mut **transaction)
 87      .await?)
 88  }
 89  
 90  pub async fn try_find_by_previous_id(
 91      transaction: &mut Transaction<'_, DB>,
 92      repository: &str,
 93      session_id: Uuid,
 94  ) -> RegistryResult<Option<UploadSession>> {
 95      Ok(sqlx::query_as!(
 96          UploadSession,
 97          r#"
 98  SELECT id, previous_session, starting_byte_index, digest, repository, created_at, is_finished
 99  FROM upload_session
100  WHERE previous_session = $1 AND repository = $2
101      "#,
102          session_id,
103          repository
104      )
105      .fetch_optional(&mut **transaction)
106      .await?)
107  }