Add background color to sales person

This commit is contained in:
Simon Goller 2024-06-18 06:27:29 +02:00
parent b4b926a8e4
commit eb54665596
6 changed files with 68 additions and 6 deletions

View file

@ -10,6 +10,7 @@ use crate::DaoError;
pub struct SalesPersonEntity { pub struct SalesPersonEntity {
pub id: Uuid, pub id: Uuid,
pub name: Arc<str>, pub name: Arc<str>,
pub background_color: Arc<str>,
pub deleted: Option<time::PrimitiveDateTime>, pub deleted: Option<time::PrimitiveDateTime>,
pub inactive: bool, pub inactive: bool,
pub version: Uuid, pub version: Uuid,

View file

@ -22,6 +22,7 @@ impl SalesPersonDaoImpl {
struct SalesPersonDb { struct SalesPersonDb {
id: Vec<u8>, id: Vec<u8>,
name: String, name: String,
background_color: String,
inactive: bool, inactive: bool,
deleted: Option<String>, deleted: Option<String>,
update_version: Vec<u8>, update_version: Vec<u8>,
@ -32,6 +33,7 @@ impl TryFrom<&SalesPersonDb> for SalesPersonEntity {
Ok(Self { Ok(Self {
id: Uuid::from_slice(sales_person.id.as_ref()).unwrap(), id: Uuid::from_slice(sales_person.id.as_ref()).unwrap(),
name: sales_person.name.as_str().into(), name: sales_person.name.as_str().into(),
background_color: sales_person.background_color.as_str().into(),
inactive: sales_person.inactive, inactive: sales_person.inactive,
deleted: sales_person deleted: sales_person
.deleted .deleted
@ -48,7 +50,7 @@ impl SalesPersonDao for SalesPersonDaoImpl {
async fn all(&self) -> Result<Arc<[SalesPersonEntity]>, DaoError> { async fn all(&self) -> Result<Arc<[SalesPersonEntity]>, DaoError> {
Ok(query_as!( Ok(query_as!(
SalesPersonDb, 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()) .fetch_all(self.pool.as_ref())
.await .await
@ -62,7 +64,7 @@ impl SalesPersonDao for SalesPersonDaoImpl {
let id_vec = id.as_bytes().to_vec(); let id_vec = id.as_bytes().to_vec();
Ok(query_as!( Ok(query_as!(
SalesPersonDb, 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 id_vec
) )
.fetch_optional(self.pool.as_ref()) .fetch_optional(self.pool.as_ref())
@ -76,7 +78,7 @@ impl SalesPersonDao for SalesPersonDaoImpl {
async fn find_by_user(&self, user_id: &str) -> Result<Option<SalesPersonEntity>, DaoError> { async fn find_by_user(&self, user_id: &str) -> Result<Option<SalesPersonEntity>, DaoError> {
Ok(query_as!( Ok(query_as!(
SalesPersonDb, 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 user_id
) )
.fetch_optional(self.pool.as_ref()) .fetch_optional(self.pool.as_ref())
@ -91,9 +93,10 @@ impl SalesPersonDao for SalesPersonDaoImpl {
let id = entity.id.as_bytes().to_vec(); let id = entity.id.as_bytes().to_vec();
let version = entity.version.as_bytes().to_vec(); let version = entity.version.as_bytes().to_vec();
let name = entity.name.as_ref(); let name = entity.name.as_ref();
let background_color = entity.background_color.as_ref();
let inactive = entity.inactive; let inactive = entity.inactive;
let deleted = entity.deleted.as_ref().map(|deleted| deleted.to_string()); 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()) .execute(self.pool.as_ref())
.await .await
.map_db_error()?; .map_db_error()?;
@ -103,9 +106,10 @@ impl SalesPersonDao for SalesPersonDaoImpl {
let id = entity.id.as_bytes().to_vec(); let id = entity.id.as_bytes().to_vec();
let version = entity.version.as_bytes().to_vec(); let version = entity.version.as_bytes().to_vec();
let name = entity.name.as_ref(); let name = entity.name.as_ref();
let background_color = entity.name.as_ref();
let inactive = entity.inactive; let inactive = entity.inactive;
let deleted = entity.deleted.as_ref().map(|deleted| deleted.to_string()); 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()) .execute(self.pool.as_ref())
.await .await
.map_db_error()?; .map_db_error()?;
@ -156,7 +160,7 @@ impl SalesPersonDao for SalesPersonDaoImpl {
) -> Result<Option<SalesPersonEntity>, DaoError> { ) -> Result<Option<SalesPersonEntity>, DaoError> {
Ok(query_as!( Ok(query_as!(
SalesPersonDb, 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 user_id
) )
.fetch_optional(self.pool.as_ref()) .fetch_optional(self.pool.as_ref())

View file

@ -0,0 +1,3 @@
-- Add migration script here
ALTER TABLE sales_person
ADD COLUMN background_color TEXT DEFAULT "#FFF" NOT NULL;

View file

@ -103,6 +103,7 @@ pub struct SalesPersonTO {
#[serde(default)] #[serde(default)]
pub id: Uuid, pub id: Uuid,
pub name: Arc<str>, pub name: Arc<str>,
pub background_color: Arc<str>,
#[serde(default)] #[serde(default)]
pub inactive: bool, pub inactive: bool,
#[serde(default)] #[serde(default)]
@ -116,6 +117,7 @@ impl From<&SalesPerson> for SalesPersonTO {
Self { Self {
id: sales_person.id, id: sales_person.id,
name: sales_person.name.clone(), name: sales_person.name.clone(),
background_color: sales_person.background_color.clone(),
inactive: sales_person.inactive, inactive: sales_person.inactive,
deleted: sales_person.deleted, deleted: sales_person.deleted,
version: sales_person.version, version: sales_person.version,
@ -127,6 +129,7 @@ impl From<&SalesPersonTO> for SalesPerson {
Self { Self {
id: sales_person.id, id: sales_person.id,
name: sales_person.name.clone(), name: sales_person.name.clone(),
background_color: sales_person.background_color.clone(),
inactive: sales_person.inactive, inactive: sales_person.inactive,
deleted: sales_person.deleted, deleted: sales_person.deleted,
version: sales_person.version, version: sales_person.version,

View file

@ -12,6 +12,7 @@ use crate::ServiceError;
pub struct SalesPerson { pub struct SalesPerson {
pub id: Uuid, pub id: Uuid,
pub name: Arc<str>, pub name: Arc<str>,
pub background_color: Arc<str>,
pub inactive: bool, pub inactive: bool,
pub deleted: Option<time::PrimitiveDateTime>, pub deleted: Option<time::PrimitiveDateTime>,
pub version: Uuid, pub version: Uuid,
@ -21,6 +22,7 @@ impl From<&dao::sales_person::SalesPersonEntity> for SalesPerson {
Self { Self {
id: sales_person.id, id: sales_person.id,
name: sales_person.name.clone(), name: sales_person.name.clone(),
background_color: sales_person.background_color.clone(),
inactive: sales_person.inactive, inactive: sales_person.inactive,
deleted: sales_person.deleted, deleted: sales_person.deleted,
version: sales_person.version, version: sales_person.version,
@ -32,6 +34,7 @@ impl From<&SalesPerson> for dao::sales_person::SalesPersonEntity {
Self { Self {
id: sales_person.id, id: sales_person.id,
name: sales_person.name.clone(), name: sales_person.name.clone(),
background_color: sales_person.background_color.clone(),
inactive: sales_person.inactive, inactive: sales_person.inactive,
deleted: sales_person.deleted, deleted: sales_person.deleted,
version: sales_person.version, version: sales_person.version,

View file

@ -94,6 +94,7 @@ pub fn default_sales_person_entity() -> dao::sales_person::SalesPersonEntity {
dao::sales_person::SalesPersonEntity { dao::sales_person::SalesPersonEntity {
id: default_id(), id: default_id(),
name: "John Doe".into(), name: "John Doe".into(),
background_color: "#FFF".into(),
deleted: None, deleted: None,
inactive: false, inactive: false,
version: default_version(), version: default_version(),
@ -104,6 +105,7 @@ pub fn default_sales_person() -> service::sales_person::SalesPerson {
service::sales_person::SalesPerson { service::sales_person::SalesPerson {
id: default_id(), id: default_id(),
name: "John Doe".into(), name: "John Doe".into(),
background_color: "#FFF".into(),
inactive: false, inactive: false,
deleted: None, deleted: None,
version: default_version(), 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] #[tokio::test]
async fn test_delete() { async fn test_delete() {
let mut dependencies = build_dependencies(true, "hr"); let mut dependencies = build_dependencies(true, "hr");