From eb54665596851060f7a670c6317264479db699f6 Mon Sep 17 00:00:00 2001 From: Simon Goller Date: Tue, 18 Jun 2024 06:27:29 +0200 Subject: [PATCH] Add background color to sales person --- dao/src/sales_person.rs | 1 + dao_impl/src/sales_person.rs | 16 ++++--- .../20240618035521_sales-person-color.sql | 3 ++ rest-types/src/lib.rs | 3 ++ service/src/sales_person.rs | 3 ++ service_impl/src/test/sales_person.rs | 48 +++++++++++++++++++ 6 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 migrations/20240618035521_sales-person-color.sql diff --git a/dao/src/sales_person.rs b/dao/src/sales_person.rs index b37baca..4194d24 100644 --- a/dao/src/sales_person.rs +++ b/dao/src/sales_person.rs @@ -10,6 +10,7 @@ use crate::DaoError; pub struct SalesPersonEntity { pub id: Uuid, pub name: Arc, + pub background_color: Arc, pub deleted: Option, pub inactive: bool, pub version: Uuid, diff --git a/dao_impl/src/sales_person.rs b/dao_impl/src/sales_person.rs index fe3f957..a773a0d 100644 --- a/dao_impl/src/sales_person.rs +++ b/dao_impl/src/sales_person.rs @@ -22,6 +22,7 @@ impl SalesPersonDaoImpl { struct SalesPersonDb { id: Vec, name: String, + background_color: String, inactive: bool, deleted: Option, update_version: Vec, @@ -32,6 +33,7 @@ impl TryFrom<&SalesPersonDb> for SalesPersonEntity { Ok(Self { id: Uuid::from_slice(sales_person.id.as_ref()).unwrap(), name: sales_person.name.as_str().into(), + background_color: sales_person.background_color.as_str().into(), inactive: sales_person.inactive, deleted: sales_person .deleted @@ -48,7 +50,7 @@ impl SalesPersonDao for SalesPersonDaoImpl { async fn all(&self) -> Result, DaoError> { Ok(query_as!( SalesPersonDb, - "SELECT id, name, inactive, deleted, update_version FROM sales_person WHERE deleted IS NULL" + "SELECT id, name, background_color, inactive, deleted, update_version FROM sales_person WHERE deleted IS NULL" ) .fetch_all(self.pool.as_ref()) .await @@ -62,7 +64,7 @@ impl SalesPersonDao for SalesPersonDaoImpl { let id_vec = id.as_bytes().to_vec(); Ok(query_as!( SalesPersonDb, - "SELECT id, name, inactive, deleted, update_version FROM sales_person WHERE id = ?", + "SELECT id, name, background_color, inactive, deleted, update_version FROM sales_person WHERE id = ?", id_vec ) .fetch_optional(self.pool.as_ref()) @@ -76,7 +78,7 @@ impl SalesPersonDao for SalesPersonDaoImpl { async fn find_by_user(&self, user_id: &str) -> Result, DaoError> { Ok(query_as!( SalesPersonDb, - "SELECT sp.id, sp.name, sp.inactive, sp.deleted, sp.update_version FROM sales_person sp JOIN sales_person_user spu ON sp.id = spu.sales_person_id WHERE spu.user_id = ?", + "SELECT sp.id, sp.name, sp.background_color, sp.inactive, sp.deleted, sp.update_version FROM sales_person sp JOIN sales_person_user spu ON sp.id = spu.sales_person_id WHERE spu.user_id = ?", user_id ) .fetch_optional(self.pool.as_ref()) @@ -91,9 +93,10 @@ impl SalesPersonDao for SalesPersonDaoImpl { let id = entity.id.as_bytes().to_vec(); let version = entity.version.as_bytes().to_vec(); let name = entity.name.as_ref(); + let background_color = entity.background_color.as_ref(); let inactive = entity.inactive; let deleted = entity.deleted.as_ref().map(|deleted| deleted.to_string()); - query!("INSERT INTO sales_person (id, name, inactive, deleted, update_version, update_process) VALUES (?, ?, ?, ?, ?, ?)", id, name, inactive, deleted, version, process) + query!("INSERT INTO sales_person (id, name, background_color, inactive, deleted, update_version, update_process) VALUES (?, ?, ?, ?, ?, ?, ?)", id, name, background_color, inactive, deleted, version, process) .execute(self.pool.as_ref()) .await .map_db_error()?; @@ -103,9 +106,10 @@ impl SalesPersonDao for SalesPersonDaoImpl { let id = entity.id.as_bytes().to_vec(); let version = entity.version.as_bytes().to_vec(); let name = entity.name.as_ref(); + let background_color = entity.name.as_ref(); let inactive = entity.inactive; let deleted = entity.deleted.as_ref().map(|deleted| deleted.to_string()); - query!("UPDATE sales_person SET name = ?, inactive = ?, deleted = ?, update_version = ?, update_process = ? WHERE id = ?", name, inactive, deleted, version, process, id) + query!("UPDATE sales_person SET name = ?, background_color = ?, inactive = ?, deleted = ?, update_version = ?, update_process = ? WHERE id = ?", name, background_color, inactive, deleted, version, process, id) .execute(self.pool.as_ref()) .await .map_db_error()?; @@ -156,7 +160,7 @@ impl SalesPersonDao for SalesPersonDaoImpl { ) -> Result, DaoError> { Ok(query_as!( SalesPersonDb, - "SELECT sp.id, sp.name, sp.inactive, sp.deleted, sp.update_version FROM sales_person sp JOIN sales_person_user spu ON sp.id = spu.sales_person_id WHERE spu.user_id = ?", + "SELECT sp.id, sp.name, sp.background_color, sp.inactive, sp.deleted, sp.update_version FROM sales_person sp JOIN sales_person_user spu ON sp.id = spu.sales_person_id WHERE spu.user_id = ?", user_id ) .fetch_optional(self.pool.as_ref()) diff --git a/migrations/20240618035521_sales-person-color.sql b/migrations/20240618035521_sales-person-color.sql new file mode 100644 index 0000000..031be4c --- /dev/null +++ b/migrations/20240618035521_sales-person-color.sql @@ -0,0 +1,3 @@ +-- Add migration script here +ALTER TABLE sales_person +ADD COLUMN background_color TEXT DEFAULT "#FFF" NOT NULL; \ No newline at end of file diff --git a/rest-types/src/lib.rs b/rest-types/src/lib.rs index 9234e03..8dca1f7 100644 --- a/rest-types/src/lib.rs +++ b/rest-types/src/lib.rs @@ -103,6 +103,7 @@ pub struct SalesPersonTO { #[serde(default)] pub id: Uuid, pub name: Arc, + pub background_color: Arc, #[serde(default)] pub inactive: bool, #[serde(default)] @@ -116,6 +117,7 @@ impl From<&SalesPerson> for SalesPersonTO { Self { id: sales_person.id, name: sales_person.name.clone(), + background_color: sales_person.background_color.clone(), inactive: sales_person.inactive, deleted: sales_person.deleted, version: sales_person.version, @@ -127,6 +129,7 @@ impl From<&SalesPersonTO> for SalesPerson { Self { id: sales_person.id, name: sales_person.name.clone(), + background_color: sales_person.background_color.clone(), inactive: sales_person.inactive, deleted: sales_person.deleted, version: sales_person.version, diff --git a/service/src/sales_person.rs b/service/src/sales_person.rs index 8349217..58b258b 100644 --- a/service/src/sales_person.rs +++ b/service/src/sales_person.rs @@ -12,6 +12,7 @@ use crate::ServiceError; pub struct SalesPerson { pub id: Uuid, pub name: Arc, + pub background_color: Arc, pub inactive: bool, pub deleted: Option, pub version: Uuid, @@ -21,6 +22,7 @@ impl From<&dao::sales_person::SalesPersonEntity> for SalesPerson { Self { id: sales_person.id, name: sales_person.name.clone(), + background_color: sales_person.background_color.clone(), inactive: sales_person.inactive, deleted: sales_person.deleted, version: sales_person.version, @@ -32,6 +34,7 @@ impl From<&SalesPerson> for dao::sales_person::SalesPersonEntity { Self { id: sales_person.id, name: sales_person.name.clone(), + background_color: sales_person.background_color.clone(), inactive: sales_person.inactive, deleted: sales_person.deleted, version: sales_person.version, diff --git a/service_impl/src/test/sales_person.rs b/service_impl/src/test/sales_person.rs index 2fe438f..3009b86 100644 --- a/service_impl/src/test/sales_person.rs +++ b/service_impl/src/test/sales_person.rs @@ -94,6 +94,7 @@ pub fn default_sales_person_entity() -> dao::sales_person::SalesPersonEntity { dao::sales_person::SalesPersonEntity { id: default_id(), name: "John Doe".into(), + background_color: "#FFF".into(), deleted: None, inactive: false, version: default_version(), @@ -104,6 +105,7 @@ pub fn default_sales_person() -> service::sales_person::SalesPerson { service::sales_person::SalesPerson { id: default_id(), name: "John Doe".into(), + background_color: "#FFF".into(), inactive: false, deleted: None, version: default_version(), @@ -515,6 +517,52 @@ async fn test_update_name() { ); } +#[tokio::test] +async fn test_update_background_color() { + let mut dependencies = build_dependencies(true, "hr"); + dependencies + .sales_person_dao + .expect_find_by_id() + .with(eq(default_id())) + .returning(|_| Ok(Some(default_sales_person_entity()))); + dependencies + .sales_person_dao + .expect_update() + .with( + eq(SalesPersonEntity { + background_color: "#000".into(), + version: alternate_version(), + ..default_sales_person_entity() + }), + eq("sales-person-service"), + ) + .returning(|_, _| Ok(())); + dependencies + .uuid_service + .expect_new_uuid() + .with(eq("sales-person-version")) + .returning(|_| alternate_version()); + let sales_person_service = dependencies.build_service(); + let result = sales_person_service + .update( + &SalesPerson { + background_color: "#000".into(), + ..default_sales_person() + }, + ().auth(), + ) + .await + .unwrap(); + assert_eq!( + result, + SalesPerson { + background_color: "#000".into(), + version: alternate_version(), + ..default_sales_person() + } + ); +} + #[tokio::test] async fn test_delete() { let mut dependencies = build_dependencies(true, "hr");