sumup 0.6.0

Rust SDK for the SumUp API.
Documentation
// The contents of this file are generated; do not modify them.

//! Endpoints to manage user's memberships. Memberships are used to connect the user to merchant accounts and to grant them access to the merchant's resources via roles.
use super::common::*;
/// A membership associates a user with a resource, memberships is defined by user, resource, resource type, and associated roles.
#[derive(
    Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct Membership {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(strip_option, doc = "Sets [`attributes`](Membership::attributes).")
    )]
    pub attributes: Option<Attributes>,
    /// The timestamp of when the membership was created.
    ///
    /// Example: `2023-01-20T15:16:17Z`
    #[builder(setter(doc = "Sets [`created_at`](Membership::created_at)."))]
    pub created_at: crate::datetime::DateTime,
    /// ID of the membership.
    ///
    /// Example: `mem_WZsm7QTPhVrompscmPhoGTXXcrd58fr9MOhP`
    #[builder(setter(into, doc = "Sets [`id`](Membership::id)."))]
    pub id: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(strip_option, doc = "Sets [`invite`](Membership::invite).")
    )]
    pub invite: Option<Invite>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(strip_option, doc = "Sets [`metadata`](Membership::metadata).")
    )]
    pub metadata: Option<Metadata>,
    /// User's permissions.
    #[deprecated(
        note = "Permissions include only legacy permissions, please use roles instead. Member access is based on their roles within a given resource and the permissions these roles grant."
    )]
    #[builder(setter(doc = "Sets [`permissions`](Membership::permissions)."))]
    pub permissions: Vec<String>,
    #[builder(setter(doc = "Sets [`resource`](Membership::resource)."))]
    pub resource: MembershipResource,
    /// ID of the resource the membership is in.
    ///
    /// Example: `M2DDT39A`
    #[builder(setter(into, doc = "Sets [`resource_id`](Membership::resource_id)."))]
    pub resource_id: String,
    /// User's roles.
    #[builder(setter(doc = "Sets [`roles`](Membership::roles)."))]
    pub roles: Vec<String>,
    #[builder(setter(doc = "Sets [`status`](Membership::status)."))]
    pub status: MembershipStatus,
    #[serde(rename = "type")]
    #[builder(setter(into, doc = "Sets [`r#type`](Membership::r#type)."))]
    pub r#type: ResourceType,
    /// The timestamp of when the membership was last updated.
    ///
    /// Example: `2023-01-20T15:16:17Z`
    #[builder(setter(doc = "Sets [`updated_at`](Membership::updated_at)."))]
    pub updated_at: crate::datetime::DateTime,
}
/// Information about the resource the membership is in.
#[derive(
    Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct MembershipResource {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(
            strip_option,
            doc = "Sets [`attributes`](MembershipResource::attributes)."
        )
    )]
    pub attributes: Option<Attributes>,
    /// The timestamp of when the membership resource was created.
    ///
    /// Example: `2023-01-20T15:16:17Z`
    #[builder(setter(doc = "Sets [`created_at`](MembershipResource::created_at)."))]
    pub created_at: crate::datetime::DateTime,
    /// ID of the resource the membership is in.
    ///
    /// Example: `M2DDT39A`
    #[builder(setter(into, doc = "Sets [`id`](MembershipResource::id)."))]
    pub id: String,
    /// Logo fo the resource.
    ///
    /// Constraints:
    /// - format: `uri`
    /// - max length: 256
    ///
    /// Example: `https://images.sumup.com/img_2x4y6z8a0b1c2d3e4f5g6h7j8k.png`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(strip_option, into, doc = "Sets [`logo`](MembershipResource::logo).")
    )]
    pub logo: Option<String>,
    /// Display name of the resource.
    ///
    /// Example: `Acme Corp`
    #[builder(setter(into, doc = "Sets [`name`](MembershipResource::name)."))]
    pub name: String,
    #[serde(rename = "type")]
    #[builder(setter(into, doc = "Sets [`r#type`](MembershipResource::r#type)."))]
    pub r#type: ResourceType,
    /// The timestamp of when the membership resource was last updated.
    ///
    /// Example: `2023-01-20T15:16:17Z`
    #[builder(setter(doc = "Sets [`updated_at`](MembershipResource::updated_at)."))]
    pub updated_at: crate::datetime::DateTime,
}
/// The type of the membership resource.
/// Possible values are:
/// * `merchant` - merchant account(s)
/// * `organization` - organization(s)
///
/// Example: `merchant`
pub type ResourceType = String;
#[derive(
    Debug,
    Clone,
    Default,
    PartialEq,
    serde::Serialize,
    serde::Deserialize,
    typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ListParams {
    /// Offset of the first member to return.
    ///
    /// Constraints:
    /// - value >= 0
    ///
    /// Example: `0`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(strip_option, doc = "Sets [`offset`](ListParams::offset).")
    )]
    pub offset: Option<i64>,
    /// Maximum number of members to return.
    ///
    /// Constraints:
    /// - value >= 1
    /// - value <= 25
    ///
    /// Example: `10`
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(strip_option, doc = "Sets [`limit`](ListParams::limit).")
    )]
    pub limit: Option<i64>,
    /// Filter memberships by resource kind.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(strip_option, into, doc = "Sets [`kind`](ListParams::kind).")
    )]
    pub kind: Option<ResourceType>,
    /// Filter the returned memberships by the membership status.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(strip_option, doc = "Sets [`status`](ListParams::status).")
    )]
    pub status: Option<MembershipStatus>,
    /// Filter memberships by resource kind.
    #[serde(rename = "resource.type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(
            strip_option,
            into,
            doc = "Sets [`resource_type`](ListParams::resource_type)."
        )
    )]
    pub resource_type: Option<ResourceType>,
    /// Filter memberships by the sandbox status of the resource the membership is in.
    #[serde(rename = "resource.attributes.sandbox")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(
            strip_option,
            doc = "Sets [`resource_attributes_sandbox`](ListParams::resource_attributes_sandbox)."
        )
    )]
    pub resource_attributes_sandbox: Option<bool>,
    /// Filter memberships by the name of the resource the membership is in.
    #[serde(rename = "resource.name")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(
            strip_option,
            into,
            doc = "Sets [`resource_name`](ListParams::resource_name)."
        )
    )]
    pub resource_name: Option<String>,
    /// Filter memberships by the ID of the resource the membership is in.
    #[serde(rename = "resource.id")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(
            strip_option,
            into,
            doc = "Sets [`resource_id`](ListParams::resource_id)."
        )
    )]
    pub resource_id: Option<String>,
    /// Filter memberships by the parent of the resource the membership is in.
    /// Omit both `resource.parent.id` and `resource.parent.type` to skip parent filtering. When filtering by parent, both parameters must be present. To select resources without a parent, set each parameter to an empty value. Otherwise, both parameters must identify a parent.
    #[serde(rename = "resource.parent.id")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(
            strip_option,
            into,
            doc = "Sets [`resource_parent_id`](ListParams::resource_parent_id)."
        )
    )]
    pub resource_parent_id: Option<String>,
    /// Filter memberships by the parent of the resource the membership is in.
    /// Omit both `resource.parent.id` and `resource.parent.type` to skip parent filtering. When filtering by parent, both parameters must be present. To select resources without a parent, set each parameter to an empty value. Otherwise, both parameters must identify a parent.
    #[serde(rename = "resource.parent.type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(
            strip_option,
            into,
            doc = "Sets [`resource_parent_type`](ListParams::resource_parent_type)."
        )
    )]
    pub resource_parent_type: Option<ResourceType>,
    /// Filter the returned memberships by role.
    #[serde(skip_serializing_if = "Option::is_none")]
    #[builder(
        default,
        setter(strip_option, doc = "Sets [`roles`](ListParams::roles).")
    )]
    pub roles: Option<Vec<String>>,
}
/// Returns a list of Membership objects.
#[derive(
    Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct ListResponse {
    #[builder(setter(doc = "Sets [`items`](ListResponse::items)."))]
    pub items: Vec<Membership>,
    #[builder(setter(doc = "Sets [`total_count`](ListResponse::total_count)."))]
    pub total_count: i64,
}
use crate::client::Client;
#[derive(Debug, PartialEq)]
pub enum ListErrorBody {
    BadRequest(Problem),
    Unauthorized(Problem),
}
impl crate::error::ProblemDetails for ListErrorBody {
    fn problem(&self) -> Option<&crate::resources::common::Problem> {
        match self {
            Self::BadRequest(problem) => Some(problem),
            Self::Unauthorized(problem) => Some(problem),
        }
    }
}
/// Client for the Memberships API endpoints.
#[derive(Debug)]
pub struct MembershipsClient<'a> {
    client: &'a Client,
}
impl<'a> MembershipsClient<'a> {
    pub(crate) fn new(client: &'a Client) -> Self {
        Self { client }
    }
    /// Returns a reference to the underlying client.
    pub fn client(&self) -> &Client {
        self.client
    }
    /// List memberships
    ///
    /// List memberships of the current user.
    ///
    /// Responses:
    /// - 200: Returns a list of Membership objects.
    /// - 400: Invalid query parameter combination.
    /// - 401: Authentication failed or missing required scope.
    pub async fn list(
        &self,
        params: ListParams,
    ) -> crate::error::SdkResult<ListResponse, ListErrorBody> {
        let path = "/v0.1/memberships";
        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.kind {
            request = request.query(&[("kind", value)]);
        }
        if let Some(ref value) = params.status {
            request = request.query(&[("status", value)]);
        }
        if let Some(ref value) = params.resource_type {
            request = request.query(&[("resource.type", value)]);
        }
        if let Some(ref value) = params.resource_attributes_sandbox {
            request = request.query(&[("resource.attributes.sandbox", value)]);
        }
        if let Some(ref value) = params.resource_name {
            request = request.query(&[("resource.name", value)]);
        }
        if let Some(ref value) = params.resource_id {
            request = request.query(&[("resource.id", value)]);
        }
        if let Some(ref value) = params.resource_parent_id {
            request = request.query(&[("resource.parent.id", value)]);
        }
        if let Some(ref value) = params.resource_parent_type {
            request = request.query(&[("resource.parent.type", 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::BAD_REQUEST => {
                Err(crate::error::SdkError::from_response(response, |raw| {
                    serde_json::from_slice::<Problem>(raw).map(ListErrorBody::BadRequest)
                })
                .await)
            }
            reqwest::StatusCode::UNAUTHORIZED => {
                Err(crate::error::SdkError::from_response(response, |raw| {
                    serde_json::from_slice::<Problem>(raw).map(ListErrorBody::Unauthorized)
                })
                .await)
            }
            _ => Err(crate::error::SdkError::unexpected_response(response).await),
        }
    }
}