Browse Source
			
			
			Merge pull request #3397 from nikolaevn/feature/add-admin-reinvite-endpoint
			
				support `/users/<uuid>/invite/resend` admin api
			
			
				pull/3405/head
			
			
		 
		
			
				
					
						 Daniel García
					
					3 years ago
						Daniel García
					
					3 years ago
					
						
							committed by
							
								 GitHub
								GitHub
							
						 
					
				 
				
			 
		 
		
			
				
					
					No known key found for this signature in database
					
						
							GPG Key ID: 4AEE18F83AFDEB23
						
					
				
			
		
		
		
	
		
			
				 3 changed files with 
44 additions and 
1 deletions
			 
			
		 
		
			
				- 
					
					
					 
					src/api/admin.rs
				
- 
					
					
					 
					src/static/scripts/admin_users.js
				
- 
					
					
					 
					src/static/templates/admin/users.hbs
				
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -53,7 +53,8 @@ pub fn routes() -> Vec<Route> { | 
			
		
	
		
			
				
					|  |  |  |         organizations_overview, | 
			
		
	
		
			
				
					|  |  |  |         delete_organization, | 
			
		
	
		
			
				
					|  |  |  |         diagnostics, | 
			
		
	
		
			
				
					|  |  |  |         get_diagnostics_config | 
			
		
	
		
			
				
					|  |  |  |         get_diagnostics_config, | 
			
		
	
		
			
				
					|  |  |  |         resend_user_invite, | 
			
		
	
		
			
				
					|  |  |  |     ] | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -435,6 +436,24 @@ async fn remove_2fa(uuid: String, _token: AdminToken, mut conn: DbConn) -> Empty | 
			
		
	
		
			
				
					|  |  |  |     user.save(&mut conn).await | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | #[post("/users/<uuid>/invite/resend")] | 
			
		
	
		
			
				
					|  |  |  | async fn resend_user_invite(uuid: String, _token: AdminToken, mut conn: DbConn) -> EmptyResult { | 
			
		
	
		
			
				
					|  |  |  |     if let Some(user) = User::find_by_uuid(&uuid, &mut conn).await { | 
			
		
	
		
			
				
					|  |  |  |         //TODO: replace this with user.status check when it will be available (PR#3397)
 | 
			
		
	
		
			
				
					|  |  |  |         if !user.password_hash.is_empty() { | 
			
		
	
		
			
				
					|  |  |  |             err_code!("User already accepted invitation", Status::BadRequest.code); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         if CONFIG.mail_enabled() { | 
			
		
	
		
			
				
					|  |  |  |             mail::send_invite(&user.email, &user.uuid, None, None, &CONFIG.invitation_org_name(), None).await | 
			
		
	
		
			
				
					|  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |             Ok(()) | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |     } else { | 
			
		
	
		
			
				
					|  |  |  |         err_code!("User doesn't exist", Status::NotFound.code); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | #[derive(Deserialize, Debug)] | 
			
		
	
		
			
				
					|  |  |  | struct UserOrgTypeData { | 
			
		
	
		
			
				
					|  |  |  |     user_type: NumberOrString, | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -120,6 +120,24 @@ function inviteUser(event) { | 
			
		
	
		
			
				
					|  |  |  |     ); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | function resendUserInvite (event) { | 
			
		
	
		
			
				
					|  |  |  |     event.preventDefault(); | 
			
		
	
		
			
				
					|  |  |  |     event.stopPropagation(); | 
			
		
	
		
			
				
					|  |  |  |     const id = event.target.parentNode.dataset.vwUserUuid; | 
			
		
	
		
			
				
					|  |  |  |     const email = event.target.parentNode.dataset.vwUserEmail; | 
			
		
	
		
			
				
					|  |  |  |     if (!id || !email) { | 
			
		
	
		
			
				
					|  |  |  |         alert("Required parameters not found!"); | 
			
		
	
		
			
				
					|  |  |  |         return false; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     const confirmed = confirm(`Are you sure you want to resend invitation for "${email}"?`); | 
			
		
	
		
			
				
					|  |  |  |     if (confirmed) { | 
			
		
	
		
			
				
					|  |  |  |         _post(`${BASE_URL}/admin/users/${id}/invite/resend`, | 
			
		
	
		
			
				
					|  |  |  |             "Invite sent successfully", | 
			
		
	
		
			
				
					|  |  |  |             "Error resend invite" | 
			
		
	
		
			
				
					|  |  |  |         ); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | const ORG_TYPES = { | 
			
		
	
		
			
				
					|  |  |  |     "0": { | 
			
		
	
		
			
				
					|  |  |  |         "name": "Owner", | 
			
		
	
	
		
			
				
					|  |  | @ -228,6 +246,9 @@ function initUserTable() { | 
			
		
	
		
			
				
					|  |  |  |     document.querySelectorAll("button[vw-enable-user]").forEach(btn => { | 
			
		
	
		
			
				
					|  |  |  |         btn.addEventListener("click", enableUser); | 
			
		
	
		
			
				
					|  |  |  |     }); | 
			
		
	
		
			
				
					|  |  |  |     document.querySelectorAll("button[vw-resend-user-invite]").forEach(btn => { | 
			
		
	
		
			
				
					|  |  |  |         btn.addEventListener("click", resendUserInvite); | 
			
		
	
		
			
				
					|  |  |  |     }); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     if (jdenticon) { | 
			
		
	
		
			
				
					|  |  |  |         jdenticon(); | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -72,6 +72,9 @@ | 
			
		
	
		
			
				
					|  |  |  |                                 {{else}} | 
			
		
	
		
			
				
					|  |  |  |                                 <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-enable-user>Enable User</button><br> | 
			
		
	
		
			
				
					|  |  |  |                                 {{/if}} | 
			
		
	
		
			
				
					|  |  |  |                                 {{#case _Status 1}} | 
			
		
	
		
			
				
					|  |  |  |                                 <button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-resend-user-invite>Resend invite</button><br> | 
			
		
	
		
			
				
					|  |  |  |                                 {{/case}} | 
			
		
	
		
			
				
					|  |  |  |                             </span> | 
			
		
	
		
			
				
					|  |  |  |                         </td> | 
			
		
	
		
			
				
					|  |  |  |                     </tr> | 
			
		
	
	
		
			
				
					|  |  | 
 |