1+ use async_trait:: async_trait;
2+ use serde:: Serialize ;
3+ use thiserror:: Error ;
4+
5+ use crate :: organizations:: OrganizationId ;
6+ use crate :: user_management:: { OrganizationMembership , UserId , UserManagement } ;
7+ use crate :: { ResponseExt , WorkOsError , WorkOsResult } ;
8+
9+ /// Parameters for the [`CreateOrganizationMembership`] function.
10+ #[ derive( Debug , Serialize ) ]
11+ pub struct CreateOrganizationMembershipParams < ' a > {
12+ /// The ID of the user to create a membership for.
13+ pub user_id : & ' a UserId ,
14+
15+ /// The ID of the organization to create a membership for.
16+ pub organization_id : & ' a OrganizationId ,
17+
18+ /// The slug of the role to assign to the user.
19+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
20+ pub role_slug : Option < & ' a str > ,
21+ }
22+
23+ /// An error returned from [`CreateOrganizationMembership`].
24+ #[ derive( Debug , Error ) ]
25+ pub enum CreateOrganizationMembershipError { }
26+
27+ impl From < CreateOrganizationMembershipError > for WorkOsError < CreateOrganizationMembershipError > {
28+ fn from ( err : CreateOrganizationMembershipError ) -> Self {
29+ Self :: Operation ( err)
30+ }
31+ }
32+
33+ /// [WorkOS Docs: Create Organization Membership](https://workos.com/docs/reference/authkit/organization-membership#create-organization-membership)
34+ #[ async_trait]
35+ pub trait CreateOrganizationMembership {
36+ /// Creates an [`OrganizationMembership`].
37+ ///
38+ /// [WorkOS Docs: Create Organization Membership](https://workos.com/docs/reference/authkit/organization-membership#create-organization-membership)
39+ ///
40+ /// # Examples
41+ ///
42+ /// ```
43+ /// # use workos_sdk::WorkOsResult;
44+ /// # use workos_sdk::user_management::*;
45+ /// use workos_sdk::{ApiKey, WorkOs};
46+ ///
47+ /// # async fn run() -> WorkOsResult<(), CreateOrganizationMembershipError> {
48+ /// let workos = WorkOs::new(&ApiKey::from("sk_example_123456789"));
49+ ///
50+ /// let organization_membership = workos
51+ /// .user_management()
52+ /// .create_organization_membership(&CreateOrganizationMembershipParams {
53+ /// user_id: &UserId::from("user_01E4ZCR3C56J083X43JQXF3JK5"),
54+ /// organization_id: &OrganizationId::from("org_01EHZNVPK3SFK441A1RGBFSHRT"),
55+ /// role_slug: Some("admin"),
56+ /// })
57+ /// .await?;
58+ /// # Ok(())
59+ /// # }
60+ /// ```
61+ async fn create_organization_membership (
62+ & self ,
63+ params : & CreateOrganizationMembershipParams < ' _ > ,
64+ ) -> WorkOsResult < OrganizationMembership , CreateOrganizationMembershipError > ;
65+ }
66+
67+ #[ async_trait]
68+ impl CreateOrganizationMembership for UserManagement < ' _ > {
69+ async fn create_organization_membership (
70+ & self ,
71+ params : & CreateOrganizationMembershipParams < ' _ > ,
72+ ) -> WorkOsResult < OrganizationMembership , CreateOrganizationMembershipError > {
73+ let url = self . workos . base_url ( ) . join ( "/user_management/organization_memberships" ) ?;
74+
75+ let organization_membership = self
76+ . workos
77+ . client ( )
78+ . post ( url)
79+ . bearer_auth ( self . workos . key ( ) )
80+ . json ( & params)
81+ . send ( )
82+ . await ?
83+ . handle_unauthorized_or_generic_error ( ) ?
84+ . json :: < OrganizationMembership > ( )
85+ . await ?;
86+
87+ Ok ( organization_membership)
88+ }
89+ }
90+
91+ #[ cfg( test) ]
92+ mod test {
93+ use serde_json:: json;
94+ use tokio;
95+
96+ use crate :: user_management:: OrganizationMembershipId ;
97+ use crate :: { ApiKey , WorkOs } ;
98+
99+ use super :: * ;
100+
101+ #[ tokio:: test]
102+ async fn it_calls_the_create_organization_membership_endpoint ( ) {
103+ let mut server = mockito:: Server :: new_async ( ) . await ;
104+
105+ let workos = WorkOs :: builder ( & ApiKey :: from ( "sk_example_123456789" ) )
106+ . base_url ( & server. url ( ) )
107+ . unwrap ( )
108+ . build ( ) ;
109+
110+ server
111+ . mock ( "POST" , "/user_management/organization_memberships" )
112+ . match_header ( "Authorization" , "Bearer sk_example_123456789" )
113+ . match_body ( mockito:: Matcher :: Json ( json ! ( {
114+ "user_id" : "user_01E4ZCR3C56J083X43JQXF3JK5" ,
115+ "organization_id" : "org_01EHZNVPK3SFK441A1RGBFSHRT" ,
116+ "role_slug" : "admin"
117+ } ) ) )
118+ . with_status ( 201 )
119+ . with_body (
120+ json ! ( {
121+ "object" : "organization_membership" ,
122+ "id" : "om_01E4ZCR3C56J083X43JQXF3JK5" ,
123+ "user_id" : "user_01E4ZCR3C56J083X43JQXF3JK5" ,
124+ "organization_id" : "org_01EHZNVPK3SFK441A1RGBFSHRT" ,
125+ "role" : {
126+ "slug" : "admin"
127+ } ,
128+ "status" : "active" ,
129+ "created_at" : "2021-06-25T19:07:33.155Z" ,
130+ "updated_at" : "2021-06-25T19:07:33.155Z"
131+ } )
132+ . to_string ( ) ,
133+ )
134+ . create_async ( )
135+ . await ;
136+
137+ let organization_membership = workos
138+ . user_management ( )
139+ . create_organization_membership ( & CreateOrganizationMembershipParams {
140+ user_id : & UserId :: from ( "user_01E4ZCR3C56J083X43JQXF3JK5" ) ,
141+ organization_id : & OrganizationId :: from ( "org_01EHZNVPK3SFK441A1RGBFSHRT" ) ,
142+ role_slug : Some ( "admin" ) ,
143+ } )
144+ . await
145+ . unwrap ( ) ;
146+
147+ assert_eq ! (
148+ organization_membership. id,
149+ OrganizationMembershipId :: from( "om_01E4ZCR3C56J083X43JQXF3JK5" )
150+ ) ;
151+ }
152+ }
0 commit comments