RegisterController.java
package com.ctrlbuy.webshop.controller;
import com.ctrlbuy.webshop.dto.RegisterRequest;
import com.ctrlbuy.webshop.dto.RegistrationResult;
import com.ctrlbuy.webshop.service.EmailService;
import com.ctrlbuy.webshop.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import jakarta.validation.Valid;
@Controller
@RequiredArgsConstructor
@Slf4j
public class RegisterController {
private final UserService userService;
private final EmailService emailService;
@GetMapping("/register")
public String showRegisterForm(Model model) {
model.addAttribute("registerRequest", new RegisterRequest());
return "register";
}
@PostMapping("/register")
public String registerUser(@Valid @ModelAttribute RegisterRequest registerRequest,
BindingResult bindingResult,
Model model,
RedirectAttributes redirectAttributes) {
log.info("đ Registreringsförsök för anvĂ€ndare: {}", registerRequest.getUsername());
// đ§ TRIMMA FĂLT INNAN VALIDERING
registerRequest.trimAllFields();
registerRequest.normalizeEmail();
// Kontrollera om nÄgra kritiska fÀlt Àr null EFTER trimning
if (registerRequest.getUsername() == null || registerRequest.getUsername().isEmpty()) {
bindingResult.rejectValue("username", "username.required", "AnvÀndarnamn Àr obligatoriskt");
}
if (registerRequest.getEmail() == null || registerRequest.getEmail().isEmpty()) {
bindingResult.rejectValue("email", "email.required", "E-post Àr obligatorisk");
}
// Kör egen validering
validateRegistration(registerRequest, bindingResult);
if (bindingResult.hasErrors()) {
log.warn("â ïž Valideringsfel vid registrering för: {}", registerRequest.getUsername());
bindingResult.getAllErrors().forEach(error -> {
log.debug("Valideringsfel: {}", error.getDefaultMessage());
});
return "register";
}
try {
log.info("â
Validering OK, försöker registrera anvÀndare: {}", registerRequest.getUsername());
// â
ANVĂND ENKEL REGISTRERING UTAN EMAIL-VERIFIERING
RegistrationResult registrationResult = userService.registerUser(registerRequest);
if (registrationResult.isSuccess()) {
log.info("đ Registrering lyckades för anvĂ€ndare: {}", registerRequest.getUsername());
// â
ANVĂNDAREN KAN LOGGA IN DIREKT - INGEN EMAIL KRĂVS
redirectAttributes.addFlashAttribute("success",
"Registrering lyckades! Du kan nu logga in direkt med ditt anvÀndarnamn och lösenord.");
return "redirect:/login";
} else {
log.warn("â Registrering misslyckades för anvĂ€ndare: {} - {}",
registerRequest.getUsername(), registrationResult.getMessage());
model.addAttribute("error", registrationResult.getMessage());
return "register";
}
} catch (RuntimeException e) {
log.error("â RuntimeException vid registrering för anvĂ€ndare: {}",
registerRequest.getUsername(), e);
model.addAttribute("error", "Registreringsfel: " + e.getMessage());
return "register";
} catch (Exception e) {
log.error("â OvĂ€ntat fel vid registrering för anvĂ€ndare: {}",
registerRequest.getUsername(), e);
model.addAttribute("error", "Ett ovÀntat fel intrÀffade. Försök igen senare.");
return "register";
}
}
/**
* Validerar registreringsdata
*/
private void validateRegistration(RegisterRequest registerRequest, BindingResult bindingResult) {
// Validera lösenordsmatchning
if (registerRequest.getPassword() != null && registerRequest.getConfirmPassword() != null) {
if (!registerRequest.getPassword().equals(registerRequest.getConfirmPassword())) {
bindingResult.rejectValue("confirmPassword", "password.mismatch",
"Lösenorden matchar inte. Kontrollera att du har skrivit samma lösenord i bÄda fÀlten.");
}
}
// Kontrollera om anvÀndarnamn redan finns
if (registerRequest.getUsername() != null &&
userService.existsByUsernameIncludingInactive(registerRequest.getUsername())) {
bindingResult.rejectValue("username", "username.exists",
"Detta anvÀndarnamn Àr redan upptaget. VÀlj ett annat anvÀndarnamn.");
}
// Kontrollera om e-post redan finns
if (registerRequest.getEmail() != null &&
userService.existsByEmailIncludingInactive(registerRequest.getEmail())) {
bindingResult.rejectValue("email", "email.exists",
"Denna e-postadress Àr redan registrerad. Om du har glömt ditt lösenord kan du ÄterstÀlla det hÀr.");
}
}
@GetMapping("/verify-email")
public String verifyEmail(@RequestParam("token") String token, Model model) {
// â
EMAIL-VERIFIERING DISABLED - VISA MEDDELANDE
model.addAttribute("message", "Email-verifiering Àr för nÀrvarande inaktiverad. Alla nya konton aktiveras automatiskt.");
model.addAttribute("messageType", "info");
model.addAttribute("showLoginButton", true);
return "verification-result";
}
@GetMapping("/resend-verification")
public String showResendForm(Model model) {
// â
EMAIL-VERIFIERING DISABLED - VISA MEDDELANDE
model.addAttribute("title", "Email-verifiering inaktiverad");
model.addAttribute("message", "Email-verifiering Àr för nÀrvarande inaktiverad. Alla nya konton aktiveras automatiskt vid registrering.");
model.addAttribute("messageType", "info");
return "resend-verification";
}
@PostMapping("/resend-verification")
public String resendVerification(@RequestParam("email") String email, Model model) {
// â
EMAIL-VERIFIERING DISABLED - VISA MEDDELANDE
model.addAttribute("message", "Email-verifiering Àr för nÀrvarande inaktiverad. Alla nya konton aktiveras automatiskt vid registrering.");
model.addAttribute("messageType", "info");
return "resend-verification";
}
/**
* API-endpoint för att kontrollera om anvÀndarnamn Àr tillgÀngligt
*/
@GetMapping("/api/check-username")
@ResponseBody
public boolean checkUsernameAvailability(@RequestParam("username") String username) {
if (username == null || username.trim().length() < 3) {
return false;
}
return !userService.existsByUsernameIncludingInactive(username.trim());
}
/**
* API-endpoint för att kontrollera om e-post Àr tillgÀnglig
*/
@GetMapping("/api/check-email")
@ResponseBody
public boolean checkEmailAvailability(@RequestParam("email") String email) {
if (email == null || email.trim().isEmpty() || !email.matches("^[A-Za-z0-9+_.-]+@(.+)$")) {
return false;
}
return !userService.existsByEmailIncludingInactive(email.trim());
}
}