use crate::{anthropic_request_json, ApiResponseOrError, Credentials};
use derive_builder::Builder;
use reqwest::Method;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum InviteRole {
User,
Developer,
Billing,
Admin,
}
#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum InviteStatus {
Accepted,
Expired,
Deleted,
Pending,
}
#[derive(Deserialize, Debug, Clone, Eq, PartialEq)]
pub struct Invite {
pub id: String,
pub email: String,
pub invited_at: String,
pub expires_at: String,
pub role: InviteRole,
pub status: InviteStatus,
#[serde(rename = "type")]
pub invite_type: String,
}
#[derive(Deserialize, Debug, Clone, Eq, PartialEq)]
pub struct InviteList {
pub data: Vec<Invite>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
}
#[derive(Deserialize, Debug, Clone, Eq, PartialEq)]
pub struct InviteDeleted {
pub id: String,
#[serde(rename = "type")]
pub deleted_type: String,
}
#[derive(Serialize, Builder, Debug, Clone)]
#[builder(derive(Clone, Debug, PartialEq))]
#[builder(pattern = "owned")]
#[builder(name = "InviteListBuilder")]
#[builder(setter(strip_option, into))]
pub struct InviteListRequest {
#[builder(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub before_id: Option<String>,
#[builder(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub after_id: Option<String>,
#[builder(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u32>,
#[serde(skip_serializing)]
#[builder(default)]
pub credentials: Option<Credentials>,
}
#[derive(Serialize, Builder, Debug, Clone)]
#[builder(derive(Clone, Debug, PartialEq))]
#[builder(pattern = "owned")]
#[builder(name = "InviteBuilder")]
#[builder(setter(strip_option, into))]
pub struct InviteRequest {
pub invite_id: String,
#[serde(skip_serializing)]
#[builder(default)]
pub credentials: Option<Credentials>,
}
#[derive(Serialize, Builder, Debug, Clone)]
#[builder(derive(Clone, Debug, PartialEq))]
#[builder(pattern = "owned")]
#[builder(name = "InviteCreateBuilder")]
#[builder(setter(strip_option, into))]
pub struct InviteCreateRequest {
pub email: String,
pub role: InviteRole,
#[serde(skip_serializing)]
#[builder(default)]
pub credentials: Option<Credentials>,
}
#[derive(Serialize, Builder, Debug, Clone)]
#[builder(derive(Clone, Debug, PartialEq))]
#[builder(pattern = "owned")]
#[builder(name = "InviteDeleteBuilder")]
#[builder(setter(strip_option, into))]
pub struct InviteDeleteRequest {
pub invite_id: String,
#[serde(skip_serializing)]
#[builder(default)]
pub credentials: Option<Credentials>,
}
impl InviteList {
pub fn builder() -> InviteListBuilder {
InviteListBuilder::create_empty()
}
pub async fn create(request: InviteListRequest) -> ApiResponseOrError<Self> {
let credentials_opt = request.credentials.clone();
let mut query_params = Vec::new();
if let Some(before_id) = &request.before_id {
query_params.push(("before_id", before_id.clone()));
}
if let Some(after_id) = &request.after_id {
query_params.push(("after_id", after_id.clone()));
}
if let Some(limit) = request.limit {
query_params.push(("limit", limit.to_string()));
}
anthropic_request_json(
Method::GET,
"organizations/invites",
|r| r.query(&query_params),
credentials_opt,
)
.await
}
}
impl Invite {
pub fn builder(invite_id: impl Into<String>) -> InviteBuilder {
InviteBuilder::create_empty().invite_id(invite_id)
}
pub async fn create(request: InviteRequest) -> ApiResponseOrError<Self> {
let credentials_opt = request.credentials.clone();
let route = format!("organizations/invites/{}", request.invite_id);
anthropic_request_json(Method::GET, &route, |r| r, credentials_opt).await
}
pub fn create_builder() -> InviteCreateBuilder {
InviteCreateBuilder::create_empty()
}
pub async fn create_new(request: InviteCreateRequest) -> ApiResponseOrError<Self> {
let credentials_opt = request.credentials.clone();
anthropic_request_json(
Method::POST,
"organizations/invites",
|r| r.json(&request),
credentials_opt,
)
.await
}
pub fn delete_builder(invite_id: impl Into<String>) -> InviteDeleteBuilder {
InviteDeleteBuilder::create_empty().invite_id(invite_id)
}
pub async fn delete(request: InviteDeleteRequest) -> ApiResponseOrError<InviteDeleted> {
let credentials_opt = request.credentials.clone();
let route = format!("organizations/invites/{}", request.invite_id);
anthropic_request_json(Method::DELETE, &route, |r| r, credentials_opt).await
}
}
impl InviteListBuilder {
pub async fn create(self) -> ApiResponseOrError<InviteList> {
let request = self.build().unwrap();
InviteList::create(request).await
}
}
impl InviteBuilder {
pub async fn create(self) -> ApiResponseOrError<Invite> {
let request = self.build().unwrap();
Invite::create(request).await
}
}
impl InviteCreateBuilder {
pub async fn create(self) -> ApiResponseOrError<Invite> {
let request = self.build().unwrap();
Invite::create_new(request).await
}
}
impl InviteDeleteBuilder {
pub async fn create(self) -> ApiResponseOrError<InviteDeleted> {
let request = self.build().unwrap();
Invite::delete(request).await
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Credentials;
#[tokio::test]
#[ignore] async fn test_list_invites() {
let credentials = Credentials::from_env();
let invites = InviteList::builder()
.credentials(credentials)
.create()
.await
.unwrap();
assert!(invites.data.len() > 0);
}
#[tokio::test]
#[ignore] async fn test_get_invite() {
let credentials = Credentials::from_env();
let invites = InviteList::builder()
.credentials(credentials.clone())
.create()
.await
.unwrap();
if let Some(invite) = invites.data.first() {
let invite_id = &invite.id;
let invite_details = Invite::builder(invite_id)
.credentials(credentials)
.create()
.await
.unwrap();
assert_eq!(invite_details.id, *invite_id);
}
}
}