feat: generate link for user

This commit is contained in:
Fu Zi Xiang 2023-10-13 15:50:43 +08:00
parent e9c476679f
commit 9458c7714c
No known key found for this signature in database
2 changed files with 76 additions and 11 deletions

View File

@ -9,7 +9,9 @@ use axum::Json;
use axum::{extract::State, routing::post, Router};
use axum_extra::extract::cookie::Cookie;
use axum_extra::extract::CookieJar;
use gotrue::params::{AdminDeleteUserParams, AdminUserParams};
use gotrue::params::{
AdminDeleteUserParams, AdminUserParams, GenerateLinkParams, GenerateLinkResponse,
};
use gotrue_entity::User;
pub fn router() -> Router<AppState> {
@ -18,6 +20,25 @@ pub fn router() -> Router<AppState> {
.route("/login", post(login_handler))
.route("/logout", post(logout_handler))
.route("/user/:param", post(post_user_handler).delete(delete_user_handler))
.route("/user/:email/generate-link", post(post_user_generate_link_handler))
}
pub async fn post_user_generate_link_handler(
State(state): State<AppState>,
session: UserSession,
Path(email): Path<String>,
) -> Result<WebApiResponse<GenerateLinkResponse>, WebApiError<'static>> {
let res = state
.gotrue_client
.generate_link(
&session.access_token,
&GenerateLinkParams {
email,
..Default::default()
},
)
.await?;
Ok(res.into())
}
pub async fn delete_user_handler(

View File

@ -1,13 +1,12 @@
<!doctype html>
<html lang="en">
<body>
<h1>User Detail</h1>
<h2>
{{ user.email|escape }}
<!-- Added Set Password Button -->
<button id="setPasswordBtn">Set Password</button>
</h2>
<a href="/web/admin/users">Back to User List</a>
<h1>User Detail</h1>
<h2>{{ user.email|escape }}</h2>
<button id="setPasswordBtn">Set Password</button>
<div id="passwordModal" style="display: none">
<label for="newPassword">New Password:</label>
<input type="password" id="newPassword" name="newPassword" />
@ -16,7 +15,13 @@
</div>
<br />
<br />
<button id="generateInviteLinkBtn">Generate Invite Link</button>
<textarea id="inviteLink" readonly style="display: none"></textarea>
<button id="copyInviteLinkBtn" style="display: none">Copy Link</button>
<br />
<br />
<p>Phone: {{ user.phone|escape }}</p>
<p>Email Confirmed At: {{ user.email_confirmed_at|default("-") }}</p>
<p>Phone Confirmed At: {{ user.phone_confirmed_at|default("-")|escape }}</p>
@ -24,21 +29,18 @@
<p>Created At: {{ user.created_at|escape }}</p>
<p>Updated At: {{ user.updated_at|escape }}</p>
<a href="/web/admin/users">Back to User List</a>
<script>
// Set password button
document
.getElementById("setPasswordBtn")
.addEventListener("click", function () {
document.getElementById("passwordModal").style.display = "block";
});
document
.getElementById("closePasswordModalBtn")
.addEventListener("click", function () {
document.getElementById("passwordModal").style.display = "none";
});
document
.getElementById("submitPasswordBtn")
.addEventListener("click", function () {
@ -71,6 +73,48 @@
});
}
});
// Generate invite link button
document
.getElementById("generateInviteLinkBtn")
.addEventListener("click", function () {
const userEmail = encodeURIComponent("{{ user.email|escape }}");
fetch(`/web-api/user/${userEmail}/generate-link`, {
method: "POST",
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
const inviteLink = data.data.action_link;
document.getElementById("inviteLink").style.display = "block";
document.getElementById("inviteLink").value = inviteLink;
document.getElementById("copyInviteLinkBtn").style.display =
"block";
})
.catch((error) => {
console.error("Error generating invite link:", error);
alert("Failed to generate invite link. Please try again later.");
});
});
document
.getElementById("copyInviteLinkBtn")
.addEventListener("click", function () {
const textarea = document.getElementById("inviteLink");
// Select the link text
textarea.select();
// Copy it to the clipboard
document.execCommand("copy");
// Optionally: Inform the user
alert("Invite link copied to clipboard!");
});
</script>
</body>
</html>