use crate::runtime::{self, Error};
#[derive(Clone, Debug, Default)]
pub struct AuthorizationAuthorizeOptions {
pub redirect_uri: Option<String>,
pub state: Option<String>,
pub scope: Option<String>,
}
pub struct AuthorizationManager {
session: std::sync::Arc<runtime::Client>,
}
impl AuthorizationManager {
pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
Self { session }
}
pub async fn authorize(
&self,
response_type: crate::models::schemas::GetAuthorizeResponseType,
client_id: String,
opts: Option<AuthorizationAuthorizeOptions>,
) -> Result<String, Error> {
let mut url = self.session.base_url("oauth_authorize");
url.push_str("/authorize");
let mut req = self.session.new_request("GET", &url);
req = runtime::with_query(req, "response_type", &response_type.0);
req = runtime::with_query(req, "client_id", &client_id);
let opts = opts.unwrap_or_default();
if let Some(value) = opts.redirect_uri {
req = runtime::with_query(req, "redirect_uri", &value);
}
if let Some(value) = opts.state {
req = runtime::with_query(req, "state", &value);
}
if let Some(value) = opts.scope {
req = runtime::with_query(req, "scope", &value);
}
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(String::from_utf8_lossy(&data).into_owned())
}
pub async fn create_oauth2_token(
&self,
body: crate::models::schemas::PostOAuth2Token,
) -> Result<crate::models::schemas::AccessToken, Error> {
let mut url = self.session.base_url("api_root");
url.push_str("/oauth2");
url.push_str("/token");
let mut req = self.session.new_request("POST", &url);
let mut form: Vec<(&str, String)> = vec![("grant_type", body.grant_type.0.clone())];
if let Some(value) = &body.client_id {
form.push(("client_id", value.clone()));
}
if let Some(value) = &body.client_secret {
form.push(("client_secret", value.clone()));
}
if let Some(value) = &body.code {
form.push(("code", value.clone()));
}
if let Some(value) = &body.refresh_token {
form.push(("refresh_token", value.clone()));
}
if let Some(value) = &body.assertion {
form.push(("assertion", value.clone()));
}
if let Some(value) = &body.subject_token {
form.push(("subject_token", value.clone()));
}
if let Some(value) = &body.subject_token_type {
form.push(("subject_token_type", value.0.clone()));
}
if let Some(value) = &body.actor_token {
form.push(("actor_token", value.clone()));
}
if let Some(value) = &body.actor_token_type {
form.push(("actor_token_type", value.0.clone()));
}
if let Some(value) = &body.scope {
form.push(("scope", value.clone()));
}
if let Some(value) = &body.resource {
form.push(("resource", value.clone()));
}
if let Some(value) = &body.box_subject_type {
form.push(("box_subject_type", value.0.clone()));
}
if let Some(value) = &body.box_subject_id {
form.push(("box_subject_id", value.clone()));
}
if let Some(value) = &body.box_shared_link {
form.push(("box_shared_link", value.clone()));
}
let payload = crate::internal::form_encode(&form);
req = runtime::with_form_body(req, payload.as_bytes());
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub async fn create_oauth2_token_refresh(
&self,
body: crate::models::schemas::PostOAuth2TokenRefreshAccessToken,
) -> Result<crate::models::schemas::AccessToken, Error> {
let mut url = self.session.base_url("api_root");
url.push_str("/oauth2");
url.push_str("/token");
let mut req = self.session.new_request("POST", &url);
let form: Vec<(&str, String)> = vec![
("grant_type", body.grant_type.0.clone()),
("client_id", body.client_id.clone()),
("client_secret", body.client_secret.clone()),
("refresh_token", body.refresh_token.clone()),
];
let payload = crate::internal::form_encode(&form);
req = runtime::with_form_body(req, payload.as_bytes());
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub async fn revoke_oauth2(
&self,
body: crate::models::schemas::PostOAuth2Revoke,
) -> Result<(), Error> {
let mut url = self.session.base_url("api_root");
url.push_str("/oauth2");
url.push_str("/revoke");
let mut req = self.session.new_request("POST", &url);
let mut form: Vec<(&str, String)> = Vec::new();
if let Some(value) = &body.client_id {
form.push(("client_id", value.clone()));
}
if let Some(value) = &body.client_secret {
form.push(("client_secret", value.clone()));
}
if let Some(value) = &body.token {
form.push(("token", value.clone()));
}
let payload = crate::internal::form_encode(&form);
req = runtime::with_form_body(req, payload.as_bytes());
let _ = self.session.fetch(req).await?;
Ok(())
}
}