use crate::wami::identity::Group;
use async_trait::async_trait;
use wami_core::error::Result;
use wami_core::types::PaginationParams;
#[async_trait]
pub trait GroupStore: Send + Sync {
async fn create_group(&mut self, group: Group) -> Result<Group>;
async fn get_group(&self, group_name: &str) -> Result<Option<Group>>;
async fn update_group(&mut self, group: Group) -> Result<Group>;
async fn delete_group(&mut self, group_name: &str) -> Result<()>;
async fn list_groups(
&self,
path_prefix: Option<&str>,
pagination: Option<&PaginationParams>,
) -> Result<(Vec<Group>, bool, Option<String>)>;
async fn list_groups_for_user(&self, user_name: &str) -> Result<Vec<Group>>;
async fn add_user_to_group(&mut self, group_name: &str, user_name: &str) -> Result<()>;
async fn remove_user_from_group(&mut self, group_name: &str, user_name: &str) -> Result<()>;
async fn attach_group_policy(&mut self, group_name: &str, policy_arn: &str) -> Result<()>;
async fn detach_group_policy(&mut self, group_name: &str, policy_arn: &str) -> Result<()>;
async fn list_attached_group_policies(&self, group_name: &str) -> Result<Vec<String>>;
async fn put_group_policy(
&mut self,
group_name: &str,
policy_name: &str,
policy_document: String,
) -> Result<()>;
async fn get_group_policy(&self, group_name: &str, policy_name: &str)
-> Result<Option<String>>;
async fn delete_group_policy(&mut self, group_name: &str, policy_name: &str) -> Result<()>;
async fn list_group_policies(&self, group_name: &str) -> Result<Vec<String>>;
}