Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/user_management/operations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ mod list_organization_memberships;
mod list_sessions;
mod list_users;
mod reactivate_organization_membership;
mod resend_invitation;
mod reset_password;
mod revoke_invitation;
mod revoke_session;
Expand Down Expand Up @@ -81,6 +82,7 @@ pub use list_organization_memberships::*;
pub use list_sessions::*;
pub use list_users::*;
pub use reactivate_organization_membership::*;
pub use resend_invitation::*;
pub use reset_password::*;
pub use revoke_invitation::*;
pub use revoke_session::*;
Expand Down
148 changes: 148 additions & 0 deletions src/user_management/operations/resend_invitation.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
use async_trait::async_trait;
use serde::Serialize;
use thiserror::Error;

use crate::user_management::{Invitation, InvitationId, Locale, UserManagement};
use crate::{ResponseExt, WorkOsError, WorkOsResult};

/// The parameters for [`ResendInvitation`].
#[derive(Debug, Serialize)]
pub struct ResendInvitationParams<'a> {
/// The ID of the invitation.
#[serde(skip_serializing)]
pub invitation_id: &'a InvitationId,

/// The locale to use when rendering the invitation email.
pub locale: Option<&'a Locale>,
}

/// An error returned from [`ResendInvitation`].
#[derive(Debug, Error)]
pub enum ResendInvitationError {}

impl From<ResendInvitationError> for WorkOsError<ResendInvitationError> {
fn from(err: ResendInvitationError) -> Self {
Self::Operation(err)
}
}

/// [WorkOS Docs: Resend an invitation](https://workos.com/docs/reference/user-management/invitation/resend)
#[async_trait]
pub trait ResendInvitation {
/// Resends an invitation email to the recipient. The invitation must be in a pending state.
///
/// [WorkOS Docs: Resend an invitation](https://workos.com/docs/reference/user-management/invitation/resend)
///
/// # Examples
///
/// ```
/// # use workos::WorkOsResult;
/// # use workos::user_management::*;
/// use workos::{ApiKey, WorkOs};
///
/// # async fn run() -> WorkOsResult<(), ResendInvitationError> {
/// let workos = WorkOs::new(&ApiKey::from("sk_example_123456789"));
///
/// let invitation = workos
/// .user_management()
/// .resend_invitation(&ResendInvitationParams {
/// invitation_id: &InvitationId::from("invitation_01E4ZCR3C56J083X43JQXF3JK5"),
/// locale: None,
/// })
/// .await?;
/// # Ok(())
/// # }
/// ```
async fn resend_invitation(
&self,
params: &ResendInvitationParams<'_>,
) -> WorkOsResult<Invitation, ResendInvitationError>;
}

#[async_trait]
impl ResendInvitation for UserManagement<'_> {
async fn resend_invitation(
&self,
params: &ResendInvitationParams<'_>,
) -> WorkOsResult<Invitation, ResendInvitationError> {
let url = self.workos.base_url().join(&format!(
"/user_management/invitations/{id}/resend",
id = params.invitation_id
))?;
let invitation = self
.workos
.client()
.post(url)
.bearer_auth(self.workos.key())
.json(&params)
.send()
.await?
.handle_unauthorized_or_generic_error()
.await?
.json::<Invitation>()
.await?;

Ok(invitation)
}
}

#[cfg(test)]
mod test {
use serde_json::json;
use tokio;

use crate::user_management::InvitationId;
use crate::{ApiKey, WorkOs};

use super::*;

#[tokio::test]
async fn it_calls_the_resend_invitation_endpoint() {
let mut server = mockito::Server::new_async().await;

let workos = WorkOs::builder(&ApiKey::from("sk_example_123456789"))
.base_url(&server.url())
.unwrap()
.build();

server
.mock("POST", "/user_management/invitations/invitation_01E4ZCR3C56J083X43JQXF3JK5/resend")
.match_header("Authorization", "Bearer sk_example_123456789")
.with_status(200)
.with_body(
json!({
"object": "invitation",
"id": "invitation_01E4ZCR3C56J083X43JQXF3JK5",
"email": "marcelina.davis@example.com",
"state": "pending",
"accepted_at": null,
"revoked_at": null,
"expires_at": "2021-07-01T19:07:33.155Z",
"token": "Z1uX3RbwcIl5fIGJJJCXXisdI",
"accept_invitation_url": "https://your-app.com/invite?invitation_token=Z1uX3RbwcIl5fIGJJJCXXisdI",
"organization_id": "org_01E4ZCR3C56J083X43JQXF3JK5",
"inviter_user_id": "user_01HYGBX8ZGD19949T3BM4FW1C3",
"accepted_user_id": null,
"created_at": "2021-06-25T19:07:33.155Z",
"updated_at": "2021-06-25T19:07:33.155Z"
})
.to_string(),
)
.create_async()
.await;

let invitation = workos
.user_management()
.resend_invitation(&ResendInvitationParams {
invitation_id: &InvitationId::from("invitation_01E4ZCR3C56J083X43JQXF3JK5"),
locale: None,
})
.await
.unwrap();

assert_eq!(
invitation.id,
InvitationId::from("invitation_01E4ZCR3C56J083X43JQXF3JK5")
);
}
}
7 changes: 6 additions & 1 deletion src/user_management/operations/send_invitation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use thiserror::Error;

use crate::organizations::OrganizationId;
use crate::roles::RoleSlug;
use crate::user_management::{Invitation, UserId, UserManagement};
use crate::user_management::{Invitation, Locale, UserId, UserManagement};
use crate::{ResponseExt, WorkOsError, WorkOsResult};

/// The parameters for [`SendInvitation`].
Expand All @@ -26,6 +26,9 @@ pub struct SendInvitationParams<'a> {

/// The role that the recipient will receive when they join the organization in the invitation.
pub role_slug: Option<&'a RoleSlug>,

/// The locale to use when rendering the invitation email.
pub locale: Option<&'a Locale>,
}

/// An error returned from [`SendInvitation`].
Expand Down Expand Up @@ -63,6 +66,7 @@ pub trait SendInvitation {
/// expires_in_days: None,
/// inviter_user_id: None,
/// role_slug: None,
/// locale: None,
/// })
/// .await?;
/// # Ok(())
Expand Down Expand Up @@ -153,6 +157,7 @@ mod test {
expires_in_days: None,
inviter_user_id: None,
role_slug: None,
locale: None,
})
.await
.unwrap();
Expand Down
2 changes: 2 additions & 0 deletions src/user_management/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ mod email_verification;
mod identity;
mod impersonator;
mod invitation;
mod locale;
mod magic_auth;
mod organization_membership;
mod password;
Expand All @@ -32,6 +33,7 @@ pub use email_verification::*;
pub use identity::*;
pub use impersonator::*;
pub use invitation::*;
pub use locale::*;
pub use magic_auth::*;
pub use organization_membership::*;
pub use password::*;
Expand Down
Loading
Loading