use std::sync::Arc;
use crate::dao::SaTokenDao;
use crate::error::SaTokenResult;
pub struct GrantRepo {
dao: Arc<SaTokenDao>,
}
impl std::fmt::Debug for GrantRepo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("GrantRepo { .. }")
}
}
impl GrantRepo {
pub fn new(dao: Arc<SaTokenDao>) -> Self {
Self { dao }
}
#[inline]
fn permission_key(&self, login_type: &str, login_id: &str) -> String {
self.dao.keys().permission(login_type, login_id)
}
#[inline]
fn role_key(&self, login_type: &str, login_id: &str) -> String {
self.dao.keys().role(login_type, login_id)
}
pub async fn get_permissions(
&self,
login_type: &str,
login_id: &str,
) -> SaTokenResult<Vec<String>> {
self.dao
.get_string_list(&self.permission_key(login_type, login_id))
.await
}
pub async fn set_permissions(
&self,
login_type: &str,
login_id: &str,
permissions: &[String],
) -> SaTokenResult<()> {
self.dao
.set_string_list(
&self.permission_key(login_type, login_id),
permissions,
None,
)
.await
}
pub async fn add_permission(
&self,
login_type: &str,
login_id: &str,
permission: String,
) -> SaTokenResult<()> {
let key = self.permission_key(login_type, login_id);
let mut list = self.dao.get_string_list(&key).await?;
if !list.contains(&permission) {
list.push(permission);
self.dao.set_string_list(&key, &list, None).await?;
}
Ok(())
}
pub async fn remove_permission(
&self,
login_type: &str,
login_id: &str,
permission: &str,
) -> SaTokenResult<()> {
let key = self.permission_key(login_type, login_id);
let mut list = self.dao.get_string_list(&key).await?;
let before = list.len();
list.retain(|p| p != permission);
if list.len() != before {
self.dao.set_string_list(&key, &list, None).await?;
}
Ok(())
}
pub async fn clear_permissions(&self, login_type: &str, login_id: &str) -> SaTokenResult<()> {
self.dao
.delete(&self.permission_key(login_type, login_id))
.await
}
pub async fn get_roles(&self, login_type: &str, login_id: &str) -> SaTokenResult<Vec<String>> {
self.dao
.get_string_list(&self.role_key(login_type, login_id))
.await
}
pub async fn set_roles(
&self,
login_type: &str,
login_id: &str,
roles: &[String],
) -> SaTokenResult<()> {
self.dao
.set_string_list(&self.role_key(login_type, login_id), roles, None)
.await
}
pub async fn add_role(
&self,
login_type: &str,
login_id: &str,
role: String,
) -> SaTokenResult<()> {
let key = self.role_key(login_type, login_id);
let mut list = self.dao.get_string_list(&key).await?;
if !list.contains(&role) {
list.push(role);
self.dao.set_string_list(&key, &list, None).await?;
}
Ok(())
}
pub async fn remove_role(
&self,
login_type: &str,
login_id: &str,
role: &str,
) -> SaTokenResult<()> {
let key = self.role_key(login_type, login_id);
let mut list = self.dao.get_string_list(&key).await?;
let before = list.len();
list.retain(|r| r != role);
if list.len() != before {
self.dao.set_string_list(&key, &list, None).await?;
}
Ok(())
}
pub async fn clear_roles(&self, login_type: &str, login_id: &str) -> SaTokenResult<()> {
self.dao.delete(&self.role_key(login_type, login_id)).await
}
}