@@ -14,6 +14,7 @@ use crate::mail::manager::send_emails;
1414use crate :: mail:: manager:: subscribe_nda;
1515use crate :: mail:: manager:: unsubscribe_nda;
1616use crate :: mail:: templates:: Template ;
17+ use crate :: rules:: engine:: ADMIN_CAN_ADD_MEMBER ;
1718use crate :: rules:: engine:: ONLY_ADMINS ;
1819use crate :: rules:: engine:: REMOVE_MEMBER ;
1920use crate :: rules:: engine:: RENEW_MEMBER ;
@@ -52,6 +53,14 @@ pub fn membership_and_scoped_host(
5253 Trust :: Ndaed => {
5354 internal:: member:: membership_and_ndaed_host ( & connection, group. id , user. user_uuid )
5455 }
56+ Trust :: Vouched => {
57+ internal:: member:: membership_and_vouched_host ( & connection, group. id , user. user_uuid )
58+ }
59+ Trust :: Authenticated => internal:: member:: membership_and_authenticated_host (
60+ & connection,
61+ group. id ,
62+ user. user_uuid ,
63+ ) ,
5564 _ => Ok ( None ) ,
5665 }
5766}
@@ -141,6 +150,37 @@ fn db_leave(
141150 )
142151}
143152
153+ pub async fn transfer (
154+ pool : & Pool ,
155+ scope_and_user : & ScopeAndUser ,
156+ group_name : & str ,
157+ old_user : & User ,
158+ new_user : & User ,
159+ cis_client : Arc < impl AsyncCisClientTrait > ,
160+ ) -> Result < ( ) , Error > {
161+ let connection = pool. get ( ) ?;
162+ let host = internal:: user:: user_by_id ( & connection, & scope_and_user. user_id ) ?;
163+ ADMIN_CAN_ADD_MEMBER . run ( & RuleContext :: minimal_with_member_uuid (
164+ & pool. clone ( ) ,
165+ scope_and_user,
166+ & group_name,
167+ & host. user_uuid ,
168+ & new_user. user_uuid ,
169+ ) ) ?;
170+ internal:: member:: transfer_membership ( & connection, & group_name, & host, & old_user, & new_user) ?;
171+ if group_name == "nda" {
172+ let old_user_profile =
173+ internal:: user:: slim_user_profile_by_uuid ( & connection, & old_user. user_uuid ) ?;
174+ let new_user_profile =
175+ internal:: user:: slim_user_profile_by_uuid ( & connection, & old_user. user_uuid ) ?;
176+ unsubscribe_nda ( & old_user_profile. email ) ;
177+ subscribe_nda ( & new_user_profile. email ) ;
178+ }
179+ drop ( connection) ;
180+ send_groups_to_cis ( pool, Arc :: clone ( & cis_client) , & old_user. user_uuid ) . await ?;
181+ send_groups_to_cis ( pool, cis_client, & new_user. user_uuid ) . await
182+ }
183+
144184pub async fn add (
145185 pool : & Pool ,
146186 scope_and_user : & ScopeAndUser ,
@@ -150,11 +190,12 @@ pub async fn add(
150190 expiration : Option < i32 > ,
151191 cis_client : Arc < impl AsyncCisClientTrait > ,
152192) -> Result < ( ) , Error > {
153- ONLY_ADMINS . run ( & RuleContext :: minimal (
193+ ADMIN_CAN_ADD_MEMBER . run ( & RuleContext :: minimal_with_member_uuid (
154194 & pool. clone ( ) ,
155195 scope_and_user,
156196 & group_name,
157197 & host. user_uuid ,
198+ & user. user_uuid ,
158199 ) ) ?;
159200 let connection = pool. get ( ) ?;
160201 let expiration = if expiration. is_none ( ) {
0 commit comments