use async_trait::async_trait;
use modkit_security::SecurityContext;
use modkit_odata::{ODataQuery, Page};
use uuid::Uuid;
use crate::error::ResourceGroupError;
use crate::models::{
CreateGroupRequest, CreateTypeRequest, ResourceGroup, ResourceGroupMembership,
ResourceGroupType, ResourceGroupWithDepth, UpdateGroupRequest, UpdateTypeRequest,
};
#[async_trait]
pub trait ResourceGroupClient: Send + Sync {
async fn create_type(
&self,
ctx: &SecurityContext,
request: CreateTypeRequest,
) -> Result<ResourceGroupType, ResourceGroupError>;
async fn get_type(
&self,
ctx: &SecurityContext,
code: &str,
) -> Result<ResourceGroupType, ResourceGroupError>;
async fn list_types(
&self,
ctx: &SecurityContext,
query: &ODataQuery,
) -> Result<Page<ResourceGroupType>, ResourceGroupError>;
async fn update_type(
&self,
ctx: &SecurityContext,
code: &str,
request: UpdateTypeRequest,
) -> Result<ResourceGroupType, ResourceGroupError>;
async fn delete_type(
&self,
ctx: &SecurityContext,
code: &str,
) -> Result<(), ResourceGroupError>;
async fn create_group(
&self,
ctx: &SecurityContext,
request: CreateGroupRequest,
) -> Result<ResourceGroup, ResourceGroupError>;
async fn get_group(
&self,
ctx: &SecurityContext,
id: Uuid,
) -> Result<ResourceGroup, ResourceGroupError>;
async fn list_groups(
&self,
ctx: &SecurityContext,
query: &ODataQuery,
) -> Result<Page<ResourceGroup>, ResourceGroupError>;
async fn update_group(
&self,
ctx: &SecurityContext,
id: Uuid,
request: UpdateGroupRequest,
) -> Result<ResourceGroup, ResourceGroupError>;
async fn delete_group(&self, ctx: &SecurityContext, id: Uuid)
-> Result<(), ResourceGroupError>;
async fn get_group_descendants(
&self,
ctx: &SecurityContext,
group_id: Uuid,
query: &ODataQuery,
) -> Result<Page<ResourceGroupWithDepth>, ResourceGroupError>;
async fn get_group_ancestors(
&self,
ctx: &SecurityContext,
group_id: Uuid,
query: &ODataQuery,
) -> Result<Page<ResourceGroupWithDepth>, ResourceGroupError>;
async fn add_membership(
&self,
ctx: &SecurityContext,
group_id: Uuid,
resource_type: &str,
resource_id: &str,
) -> Result<ResourceGroupMembership, ResourceGroupError>;
async fn remove_membership(
&self,
ctx: &SecurityContext,
group_id: Uuid,
resource_type: &str,
resource_id: &str,
) -> Result<(), ResourceGroupError>;
async fn list_memberships(
&self,
ctx: &SecurityContext,
query: &ODataQuery,
) -> Result<Page<ResourceGroupMembership>, ResourceGroupError>;
}
#[async_trait]
pub trait ResourceGroupReadHierarchy: Send + Sync {
async fn get_group_descendants(
&self,
ctx: &SecurityContext,
group_id: Uuid,
query: &ODataQuery,
) -> Result<Page<ResourceGroupWithDepth>, ResourceGroupError>;
async fn get_group_ancestors(
&self,
ctx: &SecurityContext,
group_id: Uuid,
query: &ODataQuery,
) -> Result<Page<ResourceGroupWithDepth>, ResourceGroupError>;
async fn list_groups(
&self,
ctx: &SecurityContext,
query: &ODataQuery,
) -> Result<Page<ResourceGroup>, ResourceGroupError>;
}