#![doc = "Transport-independent service interface for local and remote calls."]
use async_trait::async_trait;
use spiral_contract::auth::AuthHeader;
use spiral_contract::call::CallError;
use crate::api::authn::objects::*;
#[async_trait]
pub trait AuthnApi: Send + Sync + 'static {
async fn decide_consent(
&self,
auth_header: AuthHeader,
challenge: String,
request: ConsentDecision,
) -> Result<ConsentRedirect, CallError<AuthnError>>;
async fn delete_client(
&self,
auth_header: AuthHeader,
client_id: String,
) -> Result<(), CallError<AuthnError>>;
async fn delete_client_redirect(
&self,
auth_header: AuthHeader,
client_id: String,
name: String,
) -> Result<(), CallError<AuthnError>>;
async fn get_client(
&self,
auth_header: AuthHeader,
client_id: String,
) -> Result<ClientRegistration, CallError<AuthnError>>;
async fn get_consent_request(
&self,
auth_header: AuthHeader,
challenge: String,
) -> Result<ConsentRequest, CallError<AuthnError>>;
async fn get_organization_app_access(
&self,
auth_header: AuthHeader,
organization_id: String,
) -> Result<OrganizationAppAccess, CallError<AuthnError>>;
async fn put_client(
&self,
auth_header: AuthHeader,
client_id: String,
request: ClientRegistration,
) -> Result<ClientRegistration, CallError<AuthnError>>;
async fn put_client_redirect(
&self,
auth_header: AuthHeader,
client_id: String,
name: String,
request: ClientRedirect,
) -> Result<ClientRedirect, CallError<AuthnError>>;
async fn put_organization_app_access(
&self,
auth_header: AuthHeader,
organization_id: String,
request: OrganizationAppAccess,
) -> Result<OrganizationAppAccess, CallError<AuthnError>>;
async fn revoke_consent(
&self,
auth_header: AuthHeader,
client_id: String,
user_id: String,
) -> Result<(), CallError<AuthnError>>;
async fn revoke_organization_consent(
&self,
auth_header: AuthHeader,
client_id: String,
user_id: String,
organization_id: String,
) -> Result<(), CallError<AuthnError>>;
}