use crate::error::Result;
use async_trait::async_trait;
#[async_trait]
pub trait MembershipStore: Send + Sync {
type Membership: Send + Sync + Clone;
type Role: Send + Sync + Clone + PartialEq;
async fn add_member(&self, membership: &Self::Membership) -> Result<()>;
async fn remove_member(&self, org_id: &str, user_id: &str) -> Result<()>;
async fn get_membership(&self, org_id: &str, user_id: &str)
-> Result<Option<Self::Membership>>;
async fn list_members(&self, org_id: &str) -> Result<Vec<Self::Membership>>;
async fn update_membership(&self, membership: &Self::Membership) -> Result<()>;
fn membership_user_id(&self, m: &Self::Membership) -> String;
fn membership_org_id(&self, m: &Self::Membership) -> String;
fn membership_role(&self, m: &Self::Membership) -> Self::Role;
fn can_manage_members(&self, role: &Self::Role) -> bool;
fn can_manage_settings(&self, role: &Self::Role) -> bool;
fn can_delete_org(&self, role: &Self::Role) -> bool;
fn can_transfer_ownership(&self, role: &Self::Role) -> bool;
fn is_owner(&self, role: &Self::Role) -> bool;
async fn list_user_memberships(&self, user_id: &str) -> Result<Vec<Self::Membership>>;
async fn count_members(&self, org_id: &str) -> Result<u32> {
Ok(self.list_members(org_id).await?.len() as u32)
}
async fn is_member(&self, org_id: &str, user_id: &str) -> Result<bool> {
Ok(self.get_membership(org_id, user_id).await?.is_some())
}
async fn update_memberships_atomic(&self, memberships: &[Self::Membership]) -> Result<()> {
for m in memberships {
self.update_membership(m).await?;
}
Ok(())
}
}