diff --git a/dao/src/booking.rs b/dao/src/booking.rs index 72ef603..700383b 100644 --- a/dao/src/booking.rs +++ b/dao/src/booking.rs @@ -33,7 +33,7 @@ pub trait BookingDao { ) -> Result, DaoError>; async fn find_by_week( &self, - calendar_week: i32, + calendar_week: u8, year: u32, ) -> Result, DaoError>; async fn create(&self, entity: &BookingEntity, process: &str) -> Result<(), DaoError>; diff --git a/dao/src/sales_person.rs b/dao/src/sales_person.rs index bed9464..b37baca 100644 --- a/dao/src/sales_person.rs +++ b/dao/src/sales_person.rs @@ -31,4 +31,8 @@ pub trait SalesPersonDao { process: &str, ) -> Result<(), DaoError>; async fn discard_assigned_user(&self, sales_person_id: Uuid) -> Result<(), DaoError>; + async fn find_sales_person_by_user_id( + &self, + user_id: &str, + ) -> Result, DaoError>; } diff --git a/dao_impl/src/booking.rs b/dao_impl/src/booking.rs index ee6d8aa..dd92fd8 100644 --- a/dao_impl/src/booking.rs +++ b/dao_impl/src/booking.rs @@ -108,7 +108,7 @@ impl BookingDao for BookingDaoImpl { async fn find_by_week( &self, - calendar_week: i32, + calendar_week: u8, year: u32, ) -> Result, DaoError> { Ok(query_as!( diff --git a/dao_impl/src/sales_person.rs b/dao_impl/src/sales_person.rs index 81b0ef0..fe3f957 100644 --- a/dao_impl/src/sales_person.rs +++ b/dao_impl/src/sales_person.rs @@ -149,4 +149,22 @@ impl SalesPersonDao for SalesPersonDaoImpl { .map_db_error()? .map(|result| result.user_id.into())) } + + async fn find_sales_person_by_user_id( + &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 = ?", + user_id + ) + .fetch_optional(self.pool.as_ref()) + .await + .map_db_error()? + .as_ref() + .map(SalesPersonEntity::try_from) + .transpose()? + ) + } } diff --git a/rest/src/booking.rs b/rest/src/booking.rs index 2776f63..3e254b0 100644 --- a/rest/src/booking.rs +++ b/rest/src/booking.rs @@ -45,7 +45,7 @@ pub async fn get_all_bookings( pub async fn get_by_week( rest_state: State, Extension(context): Extension, - Path((calendar_week, year)): Path<(i32, u32)>, + Path((year, calendar_week)): Path<(u32, u8)>, ) -> Response { error_handler( (async { diff --git a/rest/src/sales_person.rs b/rest/src/sales_person.rs index f291300..55870d2 100644 --- a/rest/src/sales_person.rs +++ b/rest/src/sales_person.rs @@ -21,6 +21,7 @@ pub fn generate_route() -> Router { .route("/:id/user", get(get_sales_person_user::)) .route("/:id/user", post(set_sales_person_user::)) .route("/:id/user", delete(delete_sales_person_user::)) + .route("/current", get(get_sales_person_current_user::)) } pub async fn get_all_sales_persons( @@ -184,3 +185,24 @@ pub async fn delete_sales_person_user( .await, ) } + +pub async fn get_sales_person_current_user( + rest_state: State, + Extension(context): Extension, +) -> Response { + error_handler( + (async { + let sales_person = rest_state + .sales_person_service() + .get_sales_person_current_user(context.into()) + .await? + .map(|sales_person| SalesPersonTO::from(&sales_person)); + + Ok(Response::builder() + .status(200) + .body(Body::new(serde_json::to_string(&sales_person).unwrap())) + .unwrap()) + }) + .await, + ) +} diff --git a/service/src/booking.rs b/service/src/booking.rs index 42ff22e..e27bf01 100644 --- a/service/src/booking.rs +++ b/service/src/booking.rs @@ -66,7 +66,7 @@ pub trait BookingService { ) -> Result; async fn get_for_week( &self, - calendar_week: i32, + calendar_week: u8, year: u32, context: Authentication, ) -> Result, ServiceError>; diff --git a/service/src/permission.rs b/service/src/permission.rs index 6ee0349..decea17 100644 --- a/service/src/permission.rs +++ b/service/src/permission.rs @@ -65,6 +65,10 @@ impl From, + ) -> Result>, ServiceError>; async fn check_permission( &self, privilege: &str, diff --git a/service/src/sales_person.rs b/service/src/sales_person.rs index 857b150..8349217 100644 --- a/service/src/sales_person.rs +++ b/service/src/sales_person.rs @@ -84,4 +84,13 @@ pub trait SalesPersonService { user_id: Option>, context: Authentication, ) -> Result<(), ServiceError>; + async fn get_sales_person_for_user( + &self, + user_id: Arc, + context: Authentication, + ) -> Result, ServiceError>; + async fn get_sales_person_current_user( + &self, + context: Authentication, + ) -> Result, ServiceError>; } diff --git a/service_impl/src/booking.rs b/service_impl/src/booking.rs index 6748c18..3aab21a 100644 --- a/service_impl/src/booking.rs +++ b/service_impl/src/booking.rs @@ -125,7 +125,7 @@ where async fn get_for_week( &self, - calendar_week: i32, + calendar_week: u8, year: u32, context: Authentication, ) -> Result, ServiceError> { diff --git a/service_impl/src/permission.rs b/service_impl/src/permission.rs index a4c0a52..4db9bc2 100644 --- a/service_impl/src/permission.rs +++ b/service_impl/src/permission.rs @@ -36,6 +36,18 @@ where { type Context = UserService::Context; + async fn current_user_id( + &self, + context: Authentication, + ) -> Result>, ServiceError> { + match context { + Authentication::Full => Ok(None), + Authentication::Context(context) => { + let current_user = self.user_service.current_user(context).await?; + Ok(Some(current_user)) + } + } + } async fn check_permission( &self, privilege: &str, diff --git a/service_impl/src/sales_person.rs b/service_impl/src/sales_person.rs index 8f8620b..36d50a7 100644 --- a/service_impl/src/sales_person.rs +++ b/service_impl/src/sales_person.rs @@ -232,4 +232,38 @@ where } Ok(()) } + + async fn get_sales_person_for_user( + &self, + user_id: Arc, + context: Authentication, + ) -> Result, ServiceError> { + self.permission_service + .check_permission("hr", context) + .await?; + Ok(self + .sales_person_dao + .find_sales_person_by_user_id(&user_id) + .await? + .as_ref() + .map(SalesPerson::from)) + } + + async fn get_sales_person_current_user( + &self, + context: Authentication, + ) -> Result, ServiceError> { + let current_user = if let Some(current_user) = self + .permission_service + .current_user_id(context.clone()) + .await? + { + current_user + } else { + return Ok(None); + }; + Ok(self + .get_sales_person_for_user(current_user, Authentication::Full) + .await?) + } }