From 1c48ee4eb04bb8815f844f3bb6cf6b429b3515fe Mon Sep 17 00:00:00 2001 From: Paulo Bressan Date: Tue, 23 Jul 2024 10:28:37 -0300 Subject: [PATCH] feat: implemented project status (#56) --- ...4c08f5e0b2846da495d724282b211104eb324.json | 12 ++++++ ...edb6b9547d87ad29d3cfcdd0b8b103f4ccdab.json | 12 ------ src/domain/event.rs | 1 + src/domain/project.rs | 43 ++++++++++++++++--- .../cache/migrations/20240606_tables.sql | 1 + src/driven/cache/project.rs | 18 +++++--- 6 files changed, 64 insertions(+), 23 deletions(-) create mode 100644 .sqlx/query-9973fd1b0b77890a2a667c728014c08f5e0b2846da495d724282b211104eb324.json delete mode 100644 .sqlx/query-9ffaba23f9806e445bbb3d3a14eedb6b9547d87ad29d3cfcdd0b8b103f4ccdab.json diff --git a/.sqlx/query-9973fd1b0b77890a2a667c728014c08f5e0b2846da495d724282b211104eb324.json b/.sqlx/query-9973fd1b0b77890a2a667c728014c08f5e0b2846da495d724282b211104eb324.json new file mode 100644 index 0000000..f089ca8 --- /dev/null +++ b/.sqlx/query-9973fd1b0b77890a2a667c728014c08f5e0b2846da495d724282b211104eb324.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n INSERT INTO project (id, namespace, name, owner, status, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 7 + }, + "nullable": [] + }, + "hash": "9973fd1b0b77890a2a667c728014c08f5e0b2846da495d724282b211104eb324" +} diff --git a/.sqlx/query-9ffaba23f9806e445bbb3d3a14eedb6b9547d87ad29d3cfcdd0b8b103f4ccdab.json b/.sqlx/query-9ffaba23f9806e445bbb3d3a14eedb6b9547d87ad29d3cfcdd0b8b103f4ccdab.json deleted file mode 100644 index 5aecc12..0000000 --- a/.sqlx/query-9ffaba23f9806e445bbb3d3a14eedb6b9547d87ad29d3cfcdd0b8b103f4ccdab.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n INSERT INTO project (id, namespace, name, owner, created_at, updated_at)\n VALUES ($1, $2, $3, $4, $5, $6)\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 6 - }, - "nullable": [] - }, - "hash": "9ffaba23f9806e445bbb3d3a14eedb6b9547d87ad29d3cfcdd0b8b103f4ccdab" -} diff --git a/src/domain/event.rs b/src/domain/event.rs index 7c16c19..ba406bb 100644 --- a/src/domain/event.rs +++ b/src/domain/event.rs @@ -18,6 +18,7 @@ pub struct ProjectCreated { pub name: String, pub namespace: String, pub owner: String, + pub status: String, pub created_at: DateTime, pub updated_at: DateTime, } diff --git a/src/domain/project.rs b/src/domain/project.rs index bc833a1..9614897 100644 --- a/src/domain/project.rs +++ b/src/domain/project.rs @@ -10,7 +10,7 @@ use rand::{ Rng, }; use rdkafka::message::ToBytes; -use std::sync::Arc; +use std::{fmt::Display, str::FromStr, sync::Arc}; use tracing::{error, info}; use uuid::Uuid; @@ -35,6 +35,7 @@ pub async fn create( namespace: cmd.namespace.clone(), name: cmd.name, owner: user_id, + status: ProjectStatus::Active.to_string(), created_at: Utc::now(), updated_at: Utc::now(), }; @@ -46,7 +47,7 @@ pub async fn create( } pub async fn create_cache(cache: Arc, evt: ProjectCreated) -> Result<()> { - cache.create(&evt.into()).await?; + cache.create(&evt.try_into()?).await?; Ok(()) } @@ -210,24 +211,52 @@ impl CreateProjectCmd { } } +pub enum ProjectStatus { + Active, + Deleted, +} +impl FromStr for ProjectStatus { + type Err = Error; + + fn from_str(s: &str) -> std::result::Result { + match s { + "active" => Ok(ProjectStatus::Active), + "deleted" => Ok(ProjectStatus::Deleted), + _ => bail!("project status not supported"), + } + } +} +impl Display for ProjectStatus { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + ProjectStatus::Active => write!(f, "active"), + ProjectStatus::Deleted => write!(f, "deleted"), + } + } +} + pub struct ProjectCache { pub id: String, pub name: String, pub namespace: String, pub owner: String, + pub status: ProjectStatus, pub created_at: DateTime, pub updated_at: DateTime, } -impl From for ProjectCache { - fn from(value: ProjectCreated) -> Self { - Self { +impl TryFrom for ProjectCache { + type Error = Error; + + fn try_from(value: ProjectCreated) -> std::result::Result { + Ok(Self { id: value.id, namespace: value.namespace, name: value.name, owner: value.owner, + status: value.status.parse()?, created_at: value.created_at, updated_at: value.updated_at, - } + }) } } @@ -361,6 +390,7 @@ mod tests { name: "New Project".into(), namespace: "sonic-vegas".into(), owner: "user id".into(), + status: ProjectStatus::Active, created_at: Utc::now(), updated_at: Utc::now(), } @@ -373,6 +403,7 @@ mod tests { name: "New Project".into(), namespace: "sonic-vegas".into(), owner: "user id".into(), + status: ProjectStatus::Active.to_string(), created_at: Utc::now(), updated_at: Utc::now(), } diff --git a/src/driven/cache/migrations/20240606_tables.sql b/src/driven/cache/migrations/20240606_tables.sql index 528bf1f..126d988 100644 --- a/src/driven/cache/migrations/20240606_tables.sql +++ b/src/driven/cache/migrations/20240606_tables.sql @@ -3,6 +3,7 @@ CREATE TABLE IF NOT EXISTS project ( namespace TEXT NOT NULL UNIQUE, name TEXT NOT NULL, owner TEXT NOT NULL, + status TEXT NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL ); diff --git a/src/driven/cache/project.rs b/src/driven/cache/project.rs index 69fad36..09db5f4 100644 --- a/src/driven/cache/project.rs +++ b/src/driven/cache/project.rs @@ -1,4 +1,4 @@ -use anyhow::Result; +use anyhow::{Error, Result}; use sqlx::{sqlite::SqliteRow, FromRow, Row}; use std::sync::Arc; @@ -21,7 +21,7 @@ impl ProjectDrivenCache for SqliteProjectDrivenCache { async fn find_by_namespace(&self, namespace: &str) -> Result> { let project = sqlx::query_as::<_, ProjectCache>( r#" - SELECT id, namespace, name, owner, created_at, updated_at + SELECT id, namespace, name, owner, status, created_at, updated_at FROM project WHERE namespace = $1; "#, ) @@ -34,7 +34,7 @@ impl ProjectDrivenCache for SqliteProjectDrivenCache { async fn find_by_id(&self, id: &str) -> Result> { let project = sqlx::query_as::<_, ProjectCache>( r#" - SELECT id, namespace, name, owner, created_at, updated_at + SELECT id, namespace, name, owner, status, created_at, updated_at FROM project WHERE id = $1; "#, ) @@ -48,15 +48,18 @@ impl ProjectDrivenCache for SqliteProjectDrivenCache { async fn create(&self, project: &ProjectCache) -> Result<()> { let mut tx = self.sqlite.db.begin().await?; + let status = project.status.to_string(); + sqlx::query!( r#" - INSERT INTO project (id, namespace, name, owner, created_at, updated_at) - VALUES ($1, $2, $3, $4, $5, $6) + INSERT INTO project (id, namespace, name, owner, status, created_at, updated_at) + VALUES ($1, $2, $3, $4, $5, $6, $7) "#, project.id, project.namespace, project.name, project.owner, + status, project.created_at, project.updated_at ) @@ -132,11 +135,16 @@ impl ProjectDrivenCache for SqliteProjectDrivenCache { impl FromRow<'_, SqliteRow> for ProjectCache { fn from_row(row: &SqliteRow) -> sqlx::Result { + let status: &str = row.try_get("status")?; + Ok(Self { id: row.try_get("id")?, name: row.try_get("name")?, namespace: row.try_get("namespace")?, owner: row.try_get("owner")?, + status: status + .parse() + .map_err(|err: Error| sqlx::Error::Decode(err.into()))?, created_at: row.try_get("created_at")?, updated_at: row.try_get("updated_at")?, })