geforkt von mirrored/vaultwarden
Merge pull request #3397 from nikolaevn/feature/add-admin-reinvite-endpoint
support `/users/<uuid>/invite/resend` admin api
Dieser Commit ist enthalten in:
Commit
d1ecf03f44
3 geänderte Dateien mit 44 neuen und 1 gelöschten Zeilen
|
@ -53,7 +53,8 @@ pub fn routes() -> Vec<Route> {
|
||||||
organizations_overview,
|
organizations_overview,
|
||||||
delete_organization,
|
delete_organization,
|
||||||
diagnostics,
|
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
|
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)]
|
#[derive(Deserialize, Debug)]
|
||||||
struct UserOrgTypeData {
|
struct UserOrgTypeData {
|
||||||
user_type: NumberOrString,
|
user_type: NumberOrString,
|
||||||
|
|
21
src/static/scripts/admin_users.js
gevendort
21
src/static/scripts/admin_users.js
gevendort
|
@ -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 = {
|
const ORG_TYPES = {
|
||||||
"0": {
|
"0": {
|
||||||
"name": "Owner",
|
"name": "Owner",
|
||||||
|
@ -228,6 +246,9 @@ function initUserTable() {
|
||||||
document.querySelectorAll("button[vw-enable-user]").forEach(btn => {
|
document.querySelectorAll("button[vw-enable-user]").forEach(btn => {
|
||||||
btn.addEventListener("click", enableUser);
|
btn.addEventListener("click", enableUser);
|
||||||
});
|
});
|
||||||
|
document.querySelectorAll("button[vw-resend-user-invite]").forEach(btn => {
|
||||||
|
btn.addEventListener("click", resendUserInvite);
|
||||||
|
});
|
||||||
|
|
||||||
if (jdenticon) {
|
if (jdenticon) {
|
||||||
jdenticon();
|
jdenticon();
|
||||||
|
|
|
@ -72,6 +72,9 @@
|
||||||
{{else}}
|
{{else}}
|
||||||
<button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-enable-user>Enable User</button><br>
|
<button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-enable-user>Enable User</button><br>
|
||||||
{{/if}}
|
{{/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>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
Laden …
In neuem Issue referenzieren