Return the username in a separate service

This allows us to use a service implementation which
returns a dummy user during development and the actual authenticated
user during production.  It also simplifies tests.
This commit is contained in:
Simon Goller 2024-04-26 22:41:44 +02:00
parent 789981ee92
commit 926ac006e7
3 changed files with 29 additions and 7 deletions

View file

@ -33,27 +33,35 @@ where
}
}
pub struct PermissionServiceImpl<PermissionDao>
pub struct PermissionServiceImpl<PermissionDao, UserService>
where
PermissionDao: dao::PermissionDao + Send + Sync,
UserService: service::UserService + Send + Sync,
{
permission_dao: Arc<PermissionDao>,
user_service: Arc<UserService>,
}
impl<PermissionDao> PermissionServiceImpl<PermissionDao>
impl<PermissionDao, UserService> PermissionServiceImpl<PermissionDao, UserService>
where
PermissionDao: dao::PermissionDao + Send + Sync,
UserService: service::UserService + Send + Sync,
{
pub fn new(permission_dao: Arc<PermissionDao>) -> Self {
Self { permission_dao }
pub fn new(permission_dao: Arc<PermissionDao>, user_service: Arc<UserService>) -> Self {
Self {
permission_dao,
user_service,
}
}
}
impl<PermissionDao> service::PermissionService for PermissionServiceImpl<PermissionDao>
impl<PermissionDao, UserService> service::PermissionService
for PermissionServiceImpl<PermissionDao, UserService>
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<Arc<str>, service::ServiceError> {
Ok("DEVUSER".into())
}