use super::common::*;
#[derive(Debug, Clone)]
pub enum MemberCreated {}
impl crate::event::private::Sealed for MemberCreated {}
impl crate::events::EventSpec for MemberCreated {
const EVENT_TYPE: &'static str = "members.created";
type FetchedObject = Member;
}
pub type MemberCreatedEvent = crate::events::Event<MemberCreated>;
#[derive(Debug, Clone)]
pub enum MemberDeleted {}
impl crate::event::private::Sealed for MemberDeleted {}
impl crate::events::EventSpec for MemberDeleted {
const EVENT_TYPE: &'static str = "members.deleted";
type FetchedObject = Member;
}
pub type MemberDeletedEvent = crate::events::Event<MemberDeleted>;
#[derive(Debug, Clone)]
pub enum MemberUpdated {}
impl crate::event::private::Sealed for MemberUpdated {}
impl crate::events::EventSpec for MemberUpdated {
const EVENT_TYPE: &'static str = "members.updated";
type FetchedObject = Member;
}
pub type MemberUpdatedEvent = crate::events::Event<MemberUpdated>;
#[derive(
Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct Member {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`attributes`](Member::attributes).")
)]
pub attributes: Option<Attributes>,
#[builder(setter(doc = "Sets [`created_at`](Member::created_at)."))]
pub created_at: crate::datetime::DateTime,
#[builder(setter(into, doc = "Sets [`id`](Member::id)."))]
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`invite`](Member::invite).")
)]
pub invite: Option<Invite>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`metadata`](Member::metadata).")
)]
pub metadata: Option<Metadata>,
#[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."
)]
#[builder(setter(doc = "Sets [`permissions`](Member::permissions)."))]
pub permissions: Vec<String>,
#[builder(setter(doc = "Sets [`roles`](Member::roles)."))]
pub roles: Vec<String>,
#[builder(setter(doc = "Sets [`status`](Member::status)."))]
pub status: MembershipStatus,
#[builder(setter(doc = "Sets [`updated_at`](Member::updated_at)."))]
pub updated_at: crate::datetime::DateTime,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, doc = "Sets [`user`](Member::user)."))]
pub user: Option<MembershipUser>,
}
#[derive(
Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct MembershipUser {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`classic`](MembershipUser::classic).")
)]
pub classic: Option<MembershipUserClassic>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`disabled_at`](MembershipUser::disabled_at)."
)
)]
pub disabled_at: Option<crate::datetime::DateTime>,
#[builder(setter(into, doc = "Sets [`email`](MembershipUser::email)."))]
pub email: String,
#[builder(setter(into, doc = "Sets [`id`](MembershipUser::id)."))]
pub id: String,
#[builder(setter(
doc = "Sets [`mfa_on_login_enabled`](MembershipUser::mfa_on_login_enabled)."
))]
pub mfa_on_login_enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`nickname`](MembershipUser::nickname)."
)
)]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`picture`](MembershipUser::picture).")
)]
pub picture: Option<String>,
#[deprecated(note = "Rely on `type` instead.")]
#[builder(setter(
doc = "Sets [`service_account_user`](MembershipUser::service_account_user)."
))]
pub service_account_user: bool,
#[serde(rename = "type")]
#[builder(setter(doc = "Sets [`r#type`](MembershipUser::r#type)."))]
pub r#type: UserType,
#[deprecated(note = "Rely on `type` instead.")]
#[builder(setter(doc = "Sets [`virtual_user`](MembershipUser::virtual_user)."))]
pub virtual_user: bool,
}
#[deprecated]
#[derive(
Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct MembershipUserClassic {
#[builder(setter(doc = "Sets [`user_id`](MembershipUserClassic::user_id)."))]
pub user_id: i64,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum UserType {
#[serde(rename = "user")]
User,
#[serde(rename = "managed_user")]
ManagedUser,
#[serde(rename = "service_account")]
ServiceAccount,
#[serde(rename = "system_account")]
SystemAccount,
#[serde(untagged)]
Other(String),
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct UpdateRequestUser {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`nickname`](UpdateRequestUser::nickname)."
)
)]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`password`](UpdateRequestUser::password).")
)]
pub password: Option<crate::secret::Secret>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ListParams {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`offset`](ListParams::offset).")
)]
pub offset: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`limit`](ListParams::limit).")
)]
pub limit: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`scroll`](ListParams::scroll).")
)]
pub scroll: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`email`](ListParams::email).")
)]
pub email: Option<String>,
#[serde(rename = "user.id")]
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, into, doc = "Sets [`user_id`](ListParams::user_id).")
)]
pub user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`status`](ListParams::status).")
)]
pub status: Option<MembershipStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`roles`](ListParams::roles).")
)]
pub roles: Option<Vec<String>>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ListResponse {
#[builder(setter(doc = "Sets [`items`](ListResponse::items)."))]
pub items: Vec<Member>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`total_count`](ListResponse::total_count).")
)]
pub total_count: Option<i64>,
}
#[derive(
Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct CreateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`attributes`](CreateRequest::attributes).")
)]
pub attributes: Option<Attributes>,
#[builder(setter(into, doc = "Sets [`email`](CreateRequest::email)."))]
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
doc = "Sets [`is_managed_user`](CreateRequest::is_managed_user)."
)
)]
pub is_managed_user: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`metadata`](CreateRequest::metadata).")
)]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(
strip_option,
into,
doc = "Sets [`nickname`](CreateRequest::nickname)."
)
)]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`password`](CreateRequest::password).")
)]
pub password: Option<crate::secret::Secret>,
#[builder(setter(doc = "Sets [`roles`](CreateRequest::roles)."))]
pub roles: Vec<String>,
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct UpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`attributes`](UpdateRequest::attributes).")
)]
pub attributes: Option<Attributes>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`metadata`](UpdateRequest::metadata).")
)]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`roles`](UpdateRequest::roles).")
)]
pub roles: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(
default,
setter(strip_option, doc = "Sets [`user`](UpdateRequest::user).")
)]
pub user: Option<UpdateRequestUser>,
}
use crate::client::Client;
#[derive(Debug, PartialEq)]
pub enum ListErrorBody {
NotFound(Problem),
}
impl crate::error::ProblemDetails for ListErrorBody {
fn problem(&self) -> Option<&crate::resources::common::Problem> {
match self {
Self::NotFound(problem) => Some(problem),
}
}
}
#[derive(Debug, PartialEq)]
pub enum CreateErrorBody {
BadRequest(Problem),
NotFound(Problem),
TooManyRequests(Problem),
}
impl crate::error::ProblemDetails for CreateErrorBody {
fn problem(&self) -> Option<&crate::resources::common::Problem> {
match self {
Self::BadRequest(problem) => Some(problem),
Self::NotFound(problem) => Some(problem),
Self::TooManyRequests(problem) => Some(problem),
}
}
}
#[derive(Debug, PartialEq)]
pub enum DeleteErrorBody {
Forbidden(Problem),
NotFound(Problem),
}
impl crate::error::ProblemDetails for DeleteErrorBody {
fn problem(&self) -> Option<&crate::resources::common::Problem> {
match self {
Self::Forbidden(problem) => Some(problem),
Self::NotFound(problem) => Some(problem),
}
}
}
#[derive(Debug, PartialEq)]
pub enum GetErrorBody {
NotFound(Problem),
}
impl crate::error::ProblemDetails for GetErrorBody {
fn problem(&self) -> Option<&crate::resources::common::Problem> {
match self {
Self::NotFound(problem) => Some(problem),
}
}
}
#[derive(Debug, PartialEq)]
pub enum UpdateErrorBody {
BadRequest(Problem),
Forbidden(Problem),
NotFound(Problem),
Conflict(Problem),
}
impl crate::error::ProblemDetails for UpdateErrorBody {
fn problem(&self) -> Option<&crate::resources::common::Problem> {
match self {
Self::BadRequest(problem) => Some(problem),
Self::Forbidden(problem) => Some(problem),
Self::NotFound(problem) => Some(problem),
Self::Conflict(problem) => Some(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 AsRef<str>,
params: ListParams,
) -> crate::error::SdkResult<ListResponse, ListErrorBody> {
let path = format!("/v0.1/merchants/{}/members", merchant_code.as_ref());
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 => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(ListErrorBody::NotFound)
})
.await)
}
_ => Err(crate::error::SdkError::unexpected_response(response).await),
}
}
pub async fn create(
&self,
merchant_code: impl AsRef<str>,
body: CreateRequest,
) -> crate::error::SdkResult<Member, CreateErrorBody> {
let path = format!("/v0.1/merchants/{}/members", merchant_code.as_ref());
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 => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(CreateErrorBody::BadRequest)
})
.await)
}
reqwest::StatusCode::NOT_FOUND => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(CreateErrorBody::NotFound)
})
.await)
}
reqwest::StatusCode::TOO_MANY_REQUESTS => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(CreateErrorBody::TooManyRequests)
})
.await)
}
_ => Err(crate::error::SdkError::unexpected_response(response).await),
}
}
pub async fn delete(
&self,
merchant_code: impl AsRef<str>,
member_id: impl AsRef<str>,
) -> crate::error::SdkResult<(), DeleteErrorBody> {
let path = format!(
"/v0.1/merchants/{}/members/{}",
merchant_code.as_ref(),
member_id.as_ref()
);
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::FORBIDDEN => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(DeleteErrorBody::Forbidden)
})
.await)
}
reqwest::StatusCode::NOT_FOUND => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(DeleteErrorBody::NotFound)
})
.await)
}
_ => Err(crate::error::SdkError::unexpected_response(response).await),
}
}
pub async fn get(
&self,
merchant_code: impl AsRef<str>,
member_id: impl AsRef<str>,
) -> crate::error::SdkResult<Member, GetErrorBody> {
let path = format!(
"/v0.1/merchants/{}/members/{}",
merchant_code.as_ref(),
member_id.as_ref()
);
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 => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(GetErrorBody::NotFound)
})
.await)
}
_ => Err(crate::error::SdkError::unexpected_response(response).await),
}
}
pub async fn update(
&self,
merchant_code: impl AsRef<str>,
member_id: impl AsRef<str>,
body: UpdateRequest,
) -> crate::error::SdkResult<Member, UpdateErrorBody> {
let path = format!(
"/v0.1/merchants/{}/members/{}",
merchant_code.as_ref(),
member_id.as_ref()
);
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 => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(UpdateErrorBody::BadRequest)
})
.await)
}
reqwest::StatusCode::FORBIDDEN => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(UpdateErrorBody::Forbidden)
})
.await)
}
reqwest::StatusCode::NOT_FOUND => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(UpdateErrorBody::NotFound)
})
.await)
}
reqwest::StatusCode::CONFLICT => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(UpdateErrorBody::Conflict)
})
.await)
}
_ => Err(crate::error::SdkError::unexpected_response(response).await),
}
}
}