package com.astalange.web.controller; import com.astalange.core.entity.AppUser; import com.astalange.core.entity.Role; import com.astalange.core.repository.AppUserRepository; import com.astalange.core.repository.RoleRepository; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.util.List; import java.util.Set; @Controller @RequestMapping("/utilisateurs") public class UtilisateurController { private final AppUserRepository userRepository; private final RoleRepository roleRepository; private final PasswordEncoder passwordEncoder; public UtilisateurController(AppUserRepository userRepository, RoleRepository roleRepository, PasswordEncoder passwordEncoder) { this.userRepository = userRepository; this.roleRepository = roleRepository; this.passwordEncoder = passwordEncoder; } @GetMapping public String listUsers(Model model) { List users = userRepository.findAll(); model.addAttribute("users", users); return "utilisateurs/list"; } @GetMapping("/ajouter") public String showAddForm(Model model) { model.addAttribute("username", ""); model.addAttribute("defaultPassword", "AsTalange123"); model.addAttribute("roles", roleRepository.findAll()); return "utilisateurs/form"; } @PostMapping("/ajouter") public String addUser( @RequestParam String username, @RequestParam String password, @RequestParam Long roleId, RedirectAttributes redirectAttributes, Model model) { if (userRepository.findByUsername(username).isPresent()) { model.addAttribute("error", "Nom d'utilisateur déjà utilisé."); model.addAttribute("username", username); model.addAttribute("defaultPassword", password); model.addAttribute("roles", roleRepository.findAll()); return "utilisateurs/form"; } Role role = roleRepository.findById(roleId) .orElseThrow(() -> new IllegalArgumentException("Rôle invalide: " + roleId)); AppUser appUser = new AppUser(); appUser.setUsername(username); appUser.setPassword(passwordEncoder.encode(password)); appUser.setEnabled(true); appUser.setMustChangePassword(true); appUser.setRoles(Set.of(role)); userRepository.save(appUser); redirectAttributes.addFlashAttribute("success", "Utilisateur créé avec succès !"); return "redirect:/utilisateurs"; } @PostMapping("/{id}/delete") public String deleteUser(@PathVariable Long id, RedirectAttributes redirectAttributes) { AppUser appUser = userRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("Utilisateur non trouvé")); org.springframework.security.core.Authentication auth = org.springframework.security.core.context.SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getName().equals(appUser.getUsername())) { redirectAttributes.addFlashAttribute("error", "Vous ne pouvez pas supprimer votre propre compte."); return "redirect:/utilisateurs"; } userRepository.delete(appUser); redirectAttributes.addFlashAttribute("success", "Utilisateur supprimé avec succès."); return "redirect:/utilisateurs"; } }