use serde_json::{json, Map, Value};
use crate::error::Result;
use crate::http::HttpClient;
pub struct Authz<'a> {
http: &'a HttpClient,
memory_id: String,
}
impl<'a> Authz<'a> {
pub(crate) fn new(http: &'a HttpClient, memory_id: String) -> Self {
Self { http, memory_id }
}
pub async fn check(
&self,
principal: &str,
permission: &str,
resource_type: &str,
resource_id: &str,
) -> Result<Value> {
let query = json!({
"principal": principal,
"permission": permission,
"resource_type": resource_type,
"resource_id": resource_id,
});
let path = format!("/memories/{}/authz/check", self.memory_id);
self.http._get(&path, Some(&query)).await
}
pub async fn grant(
&self,
subject: &str,
relation: &str,
object: &str,
pseudonymized: Option<bool>,
) -> Result<Value> {
let body = tuple_body(subject, relation, object, pseudonymized);
let path = format!("/memories/{}/authz/grant", self.memory_id);
self.http._post(&path, Some(&Value::Object(body))).await
}
pub async fn revoke(
&self,
subject: &str,
relation: &str,
object: &str,
pseudonymized: Option<bool>,
) -> Result<Value> {
let body = tuple_body(subject, relation, object, pseudonymized);
let path = format!("/memories/{}/authz/revoke", self.memory_id);
self.http
._post_no_retry(&path, Some(&Value::Object(body)))
.await
}
}
fn tuple_body(
subject: &str,
relation: &str,
object: &str,
pseudonymized: Option<bool>,
) -> Map<String, Value> {
let mut body = Map::new();
body.insert("subject".into(), Value::String(subject.to_string()));
body.insert("relation".into(), Value::String(relation.to_string()));
body.insert("object".into(), Value::String(object.to_string()));
if let Some(p) = pseudonymized {
body.insert("pseudonymized".into(), Value::Bool(p));
}
body
}