implemented forget password for desktop

This commit is contained in:
Alex
2026-04-14 22:15:15 -06:00
parent b3547b2971
commit 6848ab3586
3 changed files with 58 additions and 0 deletions

View File

@@ -5,6 +5,8 @@ import org.example.petshopdesktop.api.dto.auth.AvatarUploadResponse;
import org.example.petshopdesktop.api.dto.auth.UserInfoResponse;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
public class AuthApi {
private static final AuthApi INSTANCE = new AuthApi();
@@ -33,4 +35,10 @@ public class AuthApi {
public void deleteAvatar() throws Exception {
apiClient.delete("/api/v1/auth/me/avatar");
}
public void forgotPassword(String usernameOrEmail) throws Exception {
Map<String, String> body = new HashMap<>();
body.put("usernameOrEmail", usernameOrEmail);
apiClient.post("/api/v1/auth/forgot-password", body, Object.class);
}
}

View File

@@ -1,12 +1,15 @@
package org.example.petshopdesktop.controllers;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextInputDialog;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
@@ -14,6 +17,7 @@ import org.example.petshopdesktop.api.ApiClient;
import org.example.petshopdesktop.api.dto.auth.LoginRequest;
import org.example.petshopdesktop.api.dto.auth.LoginResponse;
import org.example.petshopdesktop.api.dto.auth.UserInfoResponse;
import org.example.petshopdesktop.api.endpoints.AuthApi;
import org.example.petshopdesktop.auth.Role;
import org.example.petshopdesktop.auth.UserSession;
import org.example.petshopdesktop.ui.SvgWebViewFactory;
@@ -105,6 +109,42 @@ public class LoginController {
}
}
@FXML
void lnkForgotPasswordClicked(ActionEvent event) {
TextInputDialog dialog = new TextInputDialog();
dialog.setTitle("Forgot Password");
dialog.setHeaderText("Reset your password");
dialog.setContentText("Enter your username or email:");
dialog.showAndWait().ifPresent(input -> {
if (input.trim().isEmpty()) return;
new Thread(() -> {
try {
AuthApi.getInstance().forgotPassword(input.trim());
Platform.runLater(() -> {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Reset Link Sent");
alert.setHeaderText(null);
alert.setContentText("If this account exists, a password reset link has been sent to the associated email.");
alert.showAndWait();
});
} catch (Exception e) {
ActivityLogger.getInstance().logException(
"LoginController.lnkForgotPasswordClicked",
e,
"Forgot password request for: " + input.trim());
Platform.runLater(() -> {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Error");
alert.setHeaderText(null);
alert.setContentText("Could not send reset link. Please try again.");
alert.showAndWait();
});
}
}).start();
});
}
private void openMainLayout() {
try {
FXMLLoader loader = new FXMLLoader(

View File

@@ -2,6 +2,7 @@
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Hyperlink?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
@@ -83,6 +84,15 @@
<Insets top="8.0" />
</VBox.margin>
</Button>
<Hyperlink maxWidth="Infinity" mnemonicParsing="false" onAction="#lnkForgotPasswordClicked"
text="Forgot Password?"
style="-fx-text-fill: #91a4b7; -fx-border-color: transparent; -fx-cursor: hand;"
alignment="CENTER_RIGHT">
<font>
<Font size="12.0" />
</font>
</Hyperlink>
</children>
</VBox>
</children>