diff --git a/app/src/main.rs b/app/src/main.rs index 9c60112..ab1021b 100644 --- a/app/src/main.rs +++ b/app/src/main.rs @@ -12,7 +12,15 @@ async fn main() { let hello_dao = dao_impl::HelloDaoImpl::new(pool.clone()); let permission_dao = dao_impl::PermissionDaoImpl::new(pool); - let permission_service = service_impl::PermissionServiceImpl::new(permission_dao.into()); + // Always authenticate with DEVUSER during development. + // This is used to test the permission service locally without a login service. + // + // TODO: Implement a proper authentication service when used in produciton. Maybe + // use differnet implementations on debug then on release. Or control it via a + // feature. + let user_service = service_impl::UserServiceDev; + let permission_service = + service_impl::PermissionServiceImpl::new(permission_dao.into(), user_service.into()); let hello_service = service_impl::HelloServiceImpl::new(hello_dao.into(), permission_service.into()); rest::start_server(hello_service).await diff --git a/service/src/lib.rs b/service/src/lib.rs index 097dea0..32f8950 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -19,6 +19,8 @@ pub trait PermissionService { &self, privilege: &str, ) -> impl Future> + Send; +} +pub trait UserService { fn current_user(&self) -> impl Future, ServiceError>> + Send; } diff --git a/service_impl/src/lib.rs b/service_impl/src/lib.rs index a3bf4f5..7c8db7a 100644 --- a/service_impl/src/lib.rs +++ b/service_impl/src/lib.rs @@ -33,27 +33,35 @@ where } } -pub struct PermissionServiceImpl +pub struct PermissionServiceImpl where PermissionDao: dao::PermissionDao + Send + Sync, + UserService: service::UserService + Send + Sync, { permission_dao: Arc, + user_service: Arc, } -impl PermissionServiceImpl +impl PermissionServiceImpl where PermissionDao: dao::PermissionDao + Send + Sync, + UserService: service::UserService + Send + Sync, { - pub fn new(permission_dao: Arc) -> Self { - Self { permission_dao } + pub fn new(permission_dao: Arc, user_service: Arc) -> Self { + Self { + permission_dao, + user_service, + } } } -impl service::PermissionService for PermissionServiceImpl +impl service::PermissionService + for PermissionServiceImpl where PermissionDao: dao::PermissionDao + Send + Sync, + UserService: service::UserService + Send + Sync, { async fn check_permission(&self, privilege: &str) -> Result<(), service::ServiceError> { - let current_user = self.current_user().await?; + let current_user = self.user_service.current_user().await?; if self .permission_dao .has_privilege(current_user.as_ref(), privilege) @@ -64,7 +72,11 @@ where Err(service::ServiceError::Forbidden) } } +} +pub struct UserServiceDev; + +impl service::UserService for UserServiceDev { async fn current_user(&self) -> Result, service::ServiceError> { Ok("DEVUSER".into()) }