use crate::codec::authorization::{
from_wire_add_relationship_response, from_wire_check_access_many_response,
from_wire_check_access_response, from_wire_delete_relationship_response,
from_wire_get_active_model_ref_response, from_wire_list_active_model_resource_types_response,
from_wire_list_relationships_response, from_wire_set_active_model_response,
from_wire_set_authorization_state_response, to_wire_add_relationship_request,
to_wire_check_access_many_request, to_wire_check_access_request,
to_wire_delete_relationship_request, to_wire_list_active_model_resource_types_request,
to_wire_list_relationships_request, to_wire_set_active_model_request,
to_wire_set_authorization_state_request,
};
use crate::codec::host_service::{HostServiceChannel, connect_host_service, plain_channel};
use crate::generated::v1;
use crate::rpc_support::GestaltError;
pub type DefaultAccessPolicy = i32;
pub mod default_access_policy {
pub const DEFAULT_ACCESS_POLICY_DENY: i32 = 0;
pub const DEFAULT_ACCESS_POLICY_ALLOW: i32 = 1;
}
pub type RelationshipTargetType = i32;
pub mod relationship_target_type {
pub const RELATIONSHIP_TARGET_TYPE_UNSPECIFIED: i32 = 0;
pub const RELATIONSHIP_TARGET_TYPE_SUBJECT: i32 = 1;
pub const RELATIONSHIP_TARGET_TYPE_RESOURCE: i32 = 2;
pub const RELATIONSHIP_TARGET_TYPE_SUBJECT_SET: i32 = 3;
}
pub type SourceLayer = i32;
pub mod source_layer {
pub const SOURCE_LAYER_UNSPECIFIED: i32 = 0;
pub const SOURCE_LAYER_STATIC_CONFIG: i32 = 1;
pub const SOURCE_LAYER_RUNTIME: i32 = 2;
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct Action {
pub name: String,
pub properties: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AddRelationshipRequest {
pub relationship: Option<Relationship>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AddRelationshipResponse {
pub relationship: Option<Relationship>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AuthorizationModel {
pub id: String,
pub version: String,
pub resource_types: Vec<AuthorizationModelResourceType>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AuthorizationModelRef {
pub id: String,
pub version: String,
pub created_at: Option<std::time::SystemTime>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AuthorizationModelResourceType {
pub name: String,
pub relations: Vec<ModelRelation>,
pub actions: Vec<ModelAction>,
pub source_layer: SourceLayer,
pub default_access_policy: DefaultAccessPolicy,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AuthorizationModelResourceTypeFilter {
pub name: String,
pub source_layer: SourceLayer,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CheckAccessManyRequest {
pub requests: Vec<CheckAccessRequest>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CheckAccessManyResponse {
pub decisions: Vec<CheckAccessResponse>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CheckAccessRequest {
pub subject: Option<Subject>,
pub action: Option<Action>,
pub resource: Option<Resource>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CheckAccessResponse {
pub allowed: bool,
pub model_id: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct DeleteRelationshipRequest {
pub relationship_tuple: Option<RelationshipTuple>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct DeleteRelationshipResponse {}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetActiveModelRefResponse {
pub model: Option<AuthorizationModelRef>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListActiveModelResourceTypesRequest {
pub filter: Option<AuthorizationModelResourceTypeFilter>,
pub page_size: i32,
pub page_token: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListActiveModelResourceTypesResponse {
pub resource_types: Vec<AuthorizationModelResourceType>,
pub next_page_token: String,
pub model_id: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListRelationshipsRequest {
pub filter: Option<RelationshipFilter>,
pub page_size: i32,
pub page_token: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListRelationshipsResponse {
pub relationships: Vec<Relationship>,
pub next_page_token: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ModelAction {
pub name: String,
pub relations: Vec<String>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum ModelAllowedTargetKind {
SubjectType(String),
ResourceType(String),
SubjectSetType(SubjectSetType),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ModelAllowedTarget {
pub kind: Option<ModelAllowedTargetKind>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ModelRelation {
pub name: String,
pub allowed_targets: Vec<ModelAllowedTarget>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct Relationship {
pub tuple: Option<RelationshipTuple>,
pub properties: Option<serde_json::Map<String, serde_json::Value>>,
pub source_layer: SourceLayer,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct RelationshipFilter {
pub target: Option<RelationshipTarget>,
pub relation: String,
pub resource: Option<Resource>,
pub target_type: RelationshipTargetType,
pub target_entity_type: String,
pub resource_type: String,
pub source_layer: SourceLayer,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum RelationshipTargetKind {
Subject(Subject),
Resource(Resource),
SubjectSet(SubjectSet),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct RelationshipTarget {
pub kind: Option<RelationshipTargetKind>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct RelationshipTuple {
pub target: Option<RelationshipTarget>,
pub relation: String,
pub resource: Option<Resource>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct Resource {
pub r#type: String,
pub id: String,
pub properties: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SetActiveModelRequest {
pub model: Option<AuthorizationModel>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SetActiveModelResponse {
pub model: Option<AuthorizationModelRef>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SetAuthorizationStateRequest {
pub model: Option<AuthorizationModel>,
pub relationships: Vec<Relationship>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SetAuthorizationStateResponse {
pub active_model: Option<AuthorizationModelRef>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct Subject {
pub r#type: String,
pub id: String,
pub properties: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SubjectSet {
pub resource: Option<Resource>,
pub relation: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SubjectSetType {
pub resource_type: String,
pub relation: String,
}
pub struct Authorization {
inner: v1::authorization_client::AuthorizationClient<HostServiceChannel>,
timeout: Option<std::time::Duration>,
}
impl Authorization {
pub fn new(channel: tonic::transport::Channel) -> Self {
Self {
inner: v1::authorization_client::AuthorizationClient::new(plain_channel(channel)),
timeout: None,
}
}
pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
self.timeout = Some(timeout);
self
}
pub async fn connect() -> Result<Self, GestaltError> {
Self::connect_named("").await
}
pub async fn connect_named(name: &str) -> Result<Self, GestaltError> {
Ok(Self {
inner: v1::authorization_client::AuthorizationClient::new(
connect_host_service("authorization", name).await?,
),
timeout: None,
})
}
pub async fn check_access(
&mut self,
action: Option<Action>,
resource: Option<Resource>,
) -> Result<CheckAccessResponse, GestaltError> {
let request = CheckAccessRequest {
action,
resource,
..Default::default()
};
let mut tonic_request = tonic::Request::new(to_wire_check_access_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.check_access(tonic_request).await?;
Ok(from_wire_check_access_response(response.into_inner()))
}
pub async fn check_access_raw(
&mut self,
request: CheckAccessRequest,
) -> Result<CheckAccessResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_check_access_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.check_access(tonic_request).await?;
Ok(from_wire_check_access_response(response.into_inner()))
}
pub async fn check_access_many(
&mut self,
requests: Vec<CheckAccessRequest>,
) -> Result<CheckAccessManyResponse, GestaltError> {
let request = CheckAccessManyRequest { requests };
let mut tonic_request = tonic::Request::new(to_wire_check_access_many_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.check_access_many(tonic_request).await?;
Ok(from_wire_check_access_many_response(response.into_inner()))
}
pub async fn check_access_many_raw(
&mut self,
request: CheckAccessManyRequest,
) -> Result<CheckAccessManyResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_check_access_many_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.check_access_many(tonic_request).await?;
Ok(from_wire_check_access_many_response(response.into_inner()))
}
pub async fn list_relationships(
&mut self,
page_size: i32,
page_token: String,
filter: Option<RelationshipFilter>,
) -> Result<ListRelationshipsResponse, GestaltError> {
let request = ListRelationshipsRequest {
page_size,
page_token,
filter,
};
let mut tonic_request = tonic::Request::new(to_wire_list_relationships_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.list_relationships(tonic_request).await?;
Ok(from_wire_list_relationships_response(response.into_inner()))
}
pub async fn list_relationships_raw(
&mut self,
request: ListRelationshipsRequest,
) -> Result<ListRelationshipsResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_list_relationships_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.list_relationships(tonic_request).await?;
Ok(from_wire_list_relationships_response(response.into_inner()))
}
pub async fn add_relationship(
&mut self,
relationship: Option<Relationship>,
) -> Result<Option<Relationship>, GestaltError> {
let request = AddRelationshipRequest { relationship };
let mut tonic_request = tonic::Request::new(to_wire_add_relationship_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_add_relationship_response(
self.inner
.add_relationship(tonic_request)
.await?
.into_inner(),
);
Ok(response.relationship)
}
pub async fn add_relationship_raw(
&mut self,
request: AddRelationshipRequest,
) -> Result<AddRelationshipResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_add_relationship_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.add_relationship(tonic_request).await?;
Ok(from_wire_add_relationship_response(response.into_inner()))
}
pub async fn delete_relationship(
&mut self,
relationship_tuple: Option<RelationshipTuple>,
) -> Result<DeleteRelationshipResponse, GestaltError> {
let request = DeleteRelationshipRequest { relationship_tuple };
let mut tonic_request = tonic::Request::new(to_wire_delete_relationship_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.delete_relationship(tonic_request).await?;
Ok(from_wire_delete_relationship_response(
response.into_inner(),
))
}
pub async fn delete_relationship_raw(
&mut self,
request: DeleteRelationshipRequest,
) -> Result<DeleteRelationshipResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_delete_relationship_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.delete_relationship(tonic_request).await?;
Ok(from_wire_delete_relationship_response(
response.into_inner(),
))
}
pub async fn set_authorization_state(
&mut self,
relationships: Vec<Relationship>,
model: Option<AuthorizationModel>,
) -> Result<Option<AuthorizationModelRef>, GestaltError> {
let request = SetAuthorizationStateRequest {
relationships,
model,
};
let mut tonic_request =
tonic::Request::new(to_wire_set_authorization_state_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_set_authorization_state_response(
self.inner
.set_authorization_state(tonic_request)
.await?
.into_inner(),
);
Ok(response.active_model)
}
pub async fn set_authorization_state_raw(
&mut self,
request: SetAuthorizationStateRequest,
) -> Result<SetAuthorizationStateResponse, GestaltError> {
let mut tonic_request =
tonic::Request::new(to_wire_set_authorization_state_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.set_authorization_state(tonic_request).await?;
Ok(from_wire_set_authorization_state_response(
response.into_inner(),
))
}
pub async fn get_active_model_ref(
&mut self,
) -> Result<Option<AuthorizationModelRef>, GestaltError> {
let mut tonic_request = tonic::Request::new(());
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_get_active_model_ref_response(
self.inner
.get_active_model_ref(tonic_request)
.await?
.into_inner(),
);
Ok(response.model)
}
pub async fn get_active_model_ref_raw(
&mut self,
) -> Result<GetActiveModelRefResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(());
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_active_model_ref(tonic_request).await?;
Ok(from_wire_get_active_model_ref_response(
response.into_inner(),
))
}
pub async fn set_active_model(
&mut self,
model: Option<AuthorizationModel>,
) -> Result<Option<AuthorizationModelRef>, GestaltError> {
let request = SetActiveModelRequest { model };
let mut tonic_request = tonic::Request::new(to_wire_set_active_model_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_set_active_model_response(
self.inner
.set_active_model(tonic_request)
.await?
.into_inner(),
);
Ok(response.model)
}
pub async fn set_active_model_raw(
&mut self,
request: SetActiveModelRequest,
) -> Result<SetActiveModelResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_set_active_model_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.set_active_model(tonic_request).await?;
Ok(from_wire_set_active_model_response(response.into_inner()))
}
pub async fn list_active_model_resource_types(
&mut self,
page_size: i32,
page_token: String,
filter: Option<AuthorizationModelResourceTypeFilter>,
) -> Result<ListActiveModelResourceTypesResponse, GestaltError> {
let request = ListActiveModelResourceTypesRequest {
page_size,
page_token,
filter,
};
let mut tonic_request =
tonic::Request::new(to_wire_list_active_model_resource_types_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self
.inner
.list_active_model_resource_types(tonic_request)
.await?;
Ok(from_wire_list_active_model_resource_types_response(
response.into_inner(),
))
}
pub async fn list_active_model_resource_types_raw(
&mut self,
request: ListActiveModelResourceTypesRequest,
) -> Result<ListActiveModelResourceTypesResponse, GestaltError> {
let mut tonic_request =
tonic::Request::new(to_wire_list_active_model_resource_types_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self
.inner
.list_active_model_resource_types(tonic_request)
.await?;
Ok(from_wire_list_active_model_resource_types_response(
response.into_inner(),
))
}
}