diff options
author | Santo Cariotti <santo@dcariotti.me> | 2021-03-17 23:27:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-17 23:27:19 +0100 |
commit | 53b34a6a994461260df18ee78c787bac86f5a31f (patch) | |
tree | b663cd9542dd420ef88c53745207eef38e11717b /src/branch/models.rs | |
parent | 124048f2b7052c47816ce40d8a88a7e3f538fd84 (diff) | |
parent | 3dff10c09ef6db02360a2d2e914e8c2d96ef7a89 (diff) |
Merge pull request #17 from gico-net/feat/add-branch
Add CRUD for Branch model
Diffstat (limited to 'src/branch/models.rs')
-rw-r--r-- | src/branch/models.rs | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/src/branch/models.rs b/src/branch/models.rs new file mode 100644 index 0000000..c8a8d65 --- /dev/null +++ b/src/branch/models.rs @@ -0,0 +1,148 @@ +use crate::db::get_client; +use crate::errors::{AppError, AppErrorType}; + +use deadpool_postgres::Pool; +use serde::{Deserialize, Serialize}; +use tokio_pg_mapper::FromTokioPostgresRow; +use tokio_pg_mapper_derive::PostgresMapper; +use uuid::Uuid; + +#[derive(Serialize, Deserialize, PostgresMapper)] +#[pg_mapper(table = "branch")] +/// Branch model +pub struct Branch { + pub id: Uuid, + pub name: String, + pub repository_id: Uuid, + pub head: String, +} + +/// Struct used for forms +pub struct BranchData { + pub name: String, + pub repository_id: Uuid, + pub head: String, +} + +impl Branch { + /// Find all branches + pub async fn find_all(pool: Pool) -> Result<Vec<Branch>, AppError> { + let client = get_client(pool.clone()).await.unwrap(); + let statement = client.prepare("SELECT * FROM branch").await?; + + let branches = client + .query(&statement, &[]) + .await? + .iter() + .map(|row| Branch::from_row_ref(row).unwrap()) + .collect::<Vec<Branch>>(); + + Ok(branches) + } + + /// Find a branch with an `id` equals to an Uuid element + pub async fn find(pool: Pool, id: &Uuid) -> Result<Branch, AppError> { + let client = get_client(pool.clone()).await.unwrap(); + let statement = + client.prepare("SELECT * FROM branch WHERE id = $1").await?; + + let branch = client + .query_opt(&statement, &[&id]) + .await? + .map(|row| Branch::from_row_ref(&row).unwrap()); + + match branch { + Some(branch) => Ok(branch), + None => Err(AppError { + error_type: AppErrorType::NotFoundError, + cause: None, + message: Some("Branch not found".to_string()), + }), + } + } + + /// Find all branches of a repository + pub async fn find_by_repo( + pool: Pool, + repo: &Uuid, + ) -> Result<Vec<Branch>, AppError> { + let client = get_client(pool.clone()).await.unwrap(); + let statement = client + .prepare("SELECT * FROM branch WHERE repository_id=$1") + .await?; + + let branches = client + .query(&statement, &[&repo]) + .await? + .iter() + .map(|row| Branch::from_row_ref(row).unwrap()) + .collect::<Vec<Branch>>(); + + Ok(branches) + } + + /// Find a branch and delete it, but before check if "Authorization" + /// matches with SECRET_KEY + pub async fn delete(pool: Pool, id: &Uuid) -> Result<Branch, AppError> { + let client = get_client(pool.clone()).await.unwrap(); + let statement = client + .prepare( + " + DELETE FROM branch + WHERE id=$1 + RETURNING * + ", + ) + .await?; + + let branch = client + .query_opt(&statement, &[&id]) + .await? + .map(|row| Branch::from_row_ref(&row).unwrap()); + + match branch { + Some(branch) => Ok(branch), + None => Err(AppError { + error_type: AppErrorType::NotFoundError, + cause: None, + message: Some("Branch not found".to_string()), + }), + } + } + + /// Create a new branch + pub async fn create( + pool: Pool, + data: &BranchData, + ) -> Result<Branch, AppError> { + let client = get_client(pool.clone()).await.unwrap(); + + let statement = client + .prepare( + "INSERT INTO repository(id, name, repository_id, head) + VALUES($1, $2, $3, $4) + RETURNING *", + ) + .await?; + + // Create a new UUID v4 + let uuid = Uuid::new_v4(); + + let branch = client + .query_opt( + &statement, + &[&uuid, &data.name, &data.repository_id, &data.head], + ) + .await? + .map(|row| Branch::from_row_ref(&row).unwrap()); + + match branch { + Some(branch) => Ok(branch), + None => Err(AppError { + message: Some("Error creating a new branch".to_string()), + cause: Some("Unknown error".to_string()), + error_type: AppErrorType::DbError, + }), + } + } +} |