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:
parent
789981ee92
commit
926ac006e7
3 changed files with 29 additions and 7 deletions
|
|
@ -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())
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue