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
2 years ago
committed by
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> |
|
|
|