commit dcaaa430f046a3c65b5c278d5c7f23b1092fe33e
parent 525e6bb65a6926e0f9de3fc5dafd5c5b63981f9f
Author: Nikolay Nikolaev <nikolaevn.home@gmail.com>
Date: Thu, 30 Mar 2023 15:23:16 +0300
support `/users/<uuid>/invite/resend` admin api
Diffstat:
3 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/src/api/admin.rs b/src/api/admin.rs
@@ -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,19 @@ 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 {
+ 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,
diff --git a/src/static/scripts/admin_users.js b/src/static/scripts/admin_users.js
@@ -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) {
+ 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();
diff --git a/src/static/templates/admin/users.hbs b/src/static/templates/admin/users.hbs
@@ -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>