PasswordResetController.java

package com.ctrlbuy.webshop.controller;

import com.ctrlbuy.webshop.service.UserService;
import com.ctrlbuy.webshop.service.EmailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Controller
public class PasswordResetController {

    private static final Logger logger = LoggerFactory.getLogger(PasswordResetController.class);

    @Autowired
    private UserService userService;

    @Autowired
    private EmailService emailService;

    @GetMapping("/forgot-password")
    public String showForgotPasswordForm() {
        return "forgot-password";
    }

    @PostMapping("/forgot-password")
    public String processForgotPassword(@RequestParam("email") String email,
                                        @RequestParam("username") String username,
                                        Model model,
                                        RedirectAttributes redirectAttributes) {
        try {
            logger.info("🔐 BegĂ€ran om lösenordsĂ„terstĂ€llning för anvĂ€ndarnamn: {} och email: {}", username, email);

            // KrĂ€v BÅDE username OCH email för sĂ€kerhet
            String resetToken = userService.generateResetTokenWithUsernameAndEmail(
                    username.trim(),
                    email.trim().toLowerCase()
            );

            if (resetToken != null) {
                // Skicka email via EmailService
                boolean emailSent = emailService.sendPasswordResetEmail(email.trim().toLowerCase(), resetToken);

                if (emailSent) {
                    logger.info("✅ Reset-mail skickat till: {} för anvĂ€ndare: {}", email, username);
                    model.addAttribute("success",
                            "En ÄterstÀllningslÀnk har skickats till din registrerade e-postadress.");
                } else {
                    logger.warn("⚠ Kunde inte skicka reset-mail till: {} för anvĂ€ndare: {}", email, username);
                    model.addAttribute("error", "Ett tekniskt fel uppstod. Försök igen senare.");
                }
            } else {
                logger.warn("⚠ Ingen matchning för anvĂ€ndarnamn: {} och email: {}", username, email);
                model.addAttribute("error",
                        "Ingen anvÀndare hittades med denna kombination av anvÀndarnamn och e-postadress.");
            }

        } catch (Exception e) {
            logger.error("❌ Fel vid lösenordsĂ„terstĂ€llning för {} / {}: {}", username, email, e.getMessage());
            model.addAttribute("error", "Ett fel uppstod. Kontrollera dina uppgifter och försök igen.");
        }

        return "forgot-password";
    }

    @GetMapping("/reset-password")
    public String showResetPasswordForm(@RequestParam("token") String token, Model model) {
        if (!userService.isValidResetToken(token)) {
            model.addAttribute("error", "Ogiltigt eller utgÄnget ÄterstÀllningstoken.");
            return "reset-password-error";
        }

        model.addAttribute("token", token);
        return "reset-password";
    }

    @PostMapping("/reset-password")
    public String processResetPassword(@RequestParam("token") String token,
                                       @RequestParam("password") String password,
                                       @RequestParam("confirmPassword") String confirmPassword,
                                       Model model,
                                       RedirectAttributes redirectAttributes) {

        if (!userService.isValidResetToken(token)) {
            model.addAttribute("error", "Ogiltigt token.");
            return "reset-password-error";
        }

        if (password.length() < 6) {
            model.addAttribute("error", "Lösenordet mÄste vara minst 6 tecken lÄngt.");
            model.addAttribute("token", token);
            return "reset-password";
        }

        if (!password.equals(confirmPassword)) {
            model.addAttribute("error", "Lösenorden matchar inte.");
            model.addAttribute("token", token);
            return "reset-password";
        }

        boolean success = userService.resetPassword(token, password);

        if (success) {
            logger.info("✅ Lösenord Ă„terstĂ€llt framgĂ„ngsrikt för token: {}", token.substring(0, 8) + "...");
            redirectAttributes.addFlashAttribute("success", "Lösenord ÄterstÀllt framgÄngsrikt! Du kan nu logga in.");
            return "redirect:/user/login";
        } else {
            logger.error("❌ Kunde inte Ă„terstĂ€lla lösenordet för token: {}", token.substring(0, 8) + "...");
            model.addAttribute("error", "Kunde inte ÄterstÀlla lösenordet. Tokenets giltighetstid kan ha gÄtt ut.");
            return "reset-password-error";
        }
    }
}