use super::common::*;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Member {
pub id: String,
pub roles: Vec<String>,
#[deprecated(
note = "Permissions include only legacy permissions, please use roles instead. Member access is based on roles within a given resource and the permissions these roles grant."
)]
pub permissions: Vec<String>,
pub created_at: crate::datetime::DateTime,
pub updated_at: crate::datetime::DateTime,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<MembershipUser>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invite: Option<Invite>,
pub status: MembershipStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<Attributes>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct MembershipUser {
pub id: String,
pub email: String,
pub mfa_on_login_enabled: bool,
pub virtual_user: bool,
pub service_account_user: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub disabled_at: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub picture: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub classic: Option<MembershipUserClassic>,
}
#[deprecated]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct MembershipUserClassic {
pub user_id: i32,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct UpdateBodyUser {
#[serde(skip_serializing_if = "Option::is_none")]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password: Option<crate::secret::Secret>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ListParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scroll: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(rename = "user.id")]
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<MembershipStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub roles: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ListResponse {
pub items: Vec<Member>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_count: Option<i64>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CreateBody {
#[serde(skip_serializing_if = "Option::is_none")]
pub is_managed_user: Option<bool>,
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub password: Option<crate::secret::Secret>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nickname: Option<String>,
pub roles: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<Attributes>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct UpdateBody {
#[serde(skip_serializing_if = "Option::is_none")]
pub roles: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<Attributes>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<UpdateBodyUser>,
}
use crate::client::Client;
#[derive(Debug)]
pub enum ListErrorBody {
NotFound(Problem),
}
#[derive(Debug)]
pub enum CreateErrorBody {
BadRequest(Problem),
NotFound(Problem),
TooManyRequests(Problem),
}
#[derive(Debug)]
pub enum DeleteErrorBody {
NotFound(Problem),
}
#[derive(Debug)]
pub enum GetErrorBody {
NotFound(Problem),
}
#[derive(Debug)]
pub enum UpdateErrorBody {
BadRequest(Problem),
Forbidden(Problem),
NotFound(Problem),
Conflict(Problem),
}
#[derive(Debug)]
pub struct MembersClient<'a> {
client: &'a Client,
}
impl<'a> MembersClient<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub fn client(&self) -> &Client {
self.client
}
pub async fn list(
&self,
merchant_code: impl Into<String>,
params: ListParams,
) -> crate::error::SdkResult<ListResponse, ListErrorBody> {
let path = format!("/v0.1/merchants/{}/members", merchant_code.into());
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.get(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout());
if let Some(authorization) = self.client.authorization() {
request = request.header("Authorization", format!("Bearer {}", authorization));
}
for (header_name, header_value) in self.client.runtime_headers() {
request = request.header(*header_name, header_value);
}
if let Some(ref value) = params.offset {
request = request.query(&[("offset", value)]);
}
if let Some(ref value) = params.limit {
request = request.query(&[("limit", value)]);
}
if let Some(ref value) = params.scroll {
request = request.query(&[("scroll", value)]);
}
if let Some(ref value) = params.email {
request = request.query(&[("email", value)]);
}
if let Some(ref value) = params.user_id {
request = request.query(&[("user.id", value)]);
}
if let Some(ref value) = params.status {
request = request.query(&[("status", value)]);
}
if let Some(ref value) = params.roles {
request = request.query(&[("roles", value)]);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::OK => {
let data: ListResponse = response.json().await?;
Ok(data)
}
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(ListErrorBody::NotFound(body)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn create(
&self,
merchant_code: impl Into<String>,
body: CreateBody,
) -> crate::error::SdkResult<Member, CreateErrorBody> {
let path = format!("/v0.1/merchants/{}/members", merchant_code.into());
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.post(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout())
.json(&body);
if let Some(authorization) = self.client.authorization() {
request = request.header("Authorization", format!("Bearer {}", authorization));
}
for (header_name, header_value) in self.client.runtime_headers() {
request = request.header(*header_name, header_value);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::CREATED => {
let data: Member = response.json().await?;
Ok(data)
}
reqwest::StatusCode::BAD_REQUEST => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(CreateErrorBody::BadRequest(
body,
)))
}
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(CreateErrorBody::NotFound(body)))
}
reqwest::StatusCode::TOO_MANY_REQUESTS => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(
CreateErrorBody::TooManyRequests(body),
))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn delete(
&self,
merchant_code: impl Into<String>,
member_id: impl Into<String>,
) -> crate::error::SdkResult<(), DeleteErrorBody> {
let path = format!(
"/v0.1/merchants/{}/members/{}",
merchant_code.into(),
member_id.into()
);
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.delete(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout());
if let Some(authorization) = self.client.authorization() {
request = request.header("Authorization", format!("Bearer {}", authorization));
}
for (header_name, header_value) in self.client.runtime_headers() {
request = request.header(*header_name, header_value);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::OK => Ok(()),
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(DeleteErrorBody::NotFound(body)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn get(
&self,
merchant_code: impl Into<String>,
member_id: impl Into<String>,
) -> crate::error::SdkResult<Member, GetErrorBody> {
let path = format!(
"/v0.1/merchants/{}/members/{}",
merchant_code.into(),
member_id.into()
);
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.get(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout());
if let Some(authorization) = self.client.authorization() {
request = request.header("Authorization", format!("Bearer {}", authorization));
}
for (header_name, header_value) in self.client.runtime_headers() {
request = request.header(*header_name, header_value);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::OK => {
let data: Member = response.json().await?;
Ok(data)
}
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(GetErrorBody::NotFound(body)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn update(
&self,
merchant_code: impl Into<String>,
member_id: impl Into<String>,
body: UpdateBody,
) -> crate::error::SdkResult<Member, UpdateErrorBody> {
let path = format!(
"/v0.1/merchants/{}/members/{}",
merchant_code.into(),
member_id.into()
);
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.put(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout())
.json(&body);
if let Some(authorization) = self.client.authorization() {
request = request.header("Authorization", format!("Bearer {}", authorization));
}
for (header_name, header_value) in self.client.runtime_headers() {
request = request.header(*header_name, header_value);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::OK => {
let data: Member = response.json().await?;
Ok(data)
}
reqwest::StatusCode::BAD_REQUEST => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(UpdateErrorBody::BadRequest(
body,
)))
}
reqwest::StatusCode::FORBIDDEN => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(UpdateErrorBody::Forbidden(
body,
)))
}
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(UpdateErrorBody::NotFound(body)))
}
reqwest::StatusCode::CONFLICT => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(UpdateErrorBody::Conflict(body)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
}