From 8146848e8fe63c5d9d8e9196e2d1a649e9822605 Mon Sep 17 00:00:00 2001 From: jon ander Date: Mon, 14 Apr 2025 19:30:42 +0200 Subject: [PATCH] Add generic list functionality for users and departments; implement new endpoints and update security configuration --- .../GestionInventario/DataInitializer.java | 12 ++-- .../GestionInventario/SecurityConfig.java | 2 +- .../controllers/UserController.java | 53 +++++++++++++++++- .../services/DepartamentoService.java | 6 ++ src/main/resources/db/Inventario_bueno_v1.sql | 6 +- src/main/resources/db/Modelo_Inventario.mwb | Bin 18333 -> 18224 bytes .../resources/templates/fragments/list.html | 13 ----- .../resources/templates/generic_list.html | 44 +++++++++++++++ 8 files changed, 114 insertions(+), 22 deletions(-) delete mode 100644 src/main/resources/templates/fragments/list.html create mode 100644 src/main/resources/templates/generic_list.html diff --git a/src/main/java/com/ieslamar/GestionInventario/DataInitializer.java b/src/main/java/com/ieslamar/GestionInventario/DataInitializer.java index c8f112c..dcdb97b 100644 --- a/src/main/java/com/ieslamar/GestionInventario/DataInitializer.java +++ b/src/main/java/com/ieslamar/GestionInventario/DataInitializer.java @@ -2,6 +2,7 @@ package com.ieslamar.GestionInventario; import com.ieslamar.GestionInventario.dto.BotonDTO; import com.ieslamar.GestionInventario.entities.Role; +import com.ieslamar.GestionInventario.services.DepartamentoService; import com.ieslamar.GestionInventario.services.UserService; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Bean; @@ -17,10 +18,13 @@ public class DataInitializer { // userService.registerUser("user", "user123", Role.USER.name(), "user123@ejemplo.com",null); // }; // } -// public static void test(){ -// BotonDTO boton1 = new BotonDTO("Inventario", "/Inventario/management"); -// boton1.isRequireAdmin(); -// + +// @Bean +// public CommandLineRunner initData(DepartamentoService departamentoService) { +// return args -> { +// departamentoService.registerDepartamento("Informática"); +// departamentoService.registerDepartamento("Ciencias"); +// }; // } } diff --git a/src/main/java/com/ieslamar/GestionInventario/SecurityConfig.java b/src/main/java/com/ieslamar/GestionInventario/SecurityConfig.java index 6c36a3d..ab3c0bf 100644 --- a/src/main/java/com/ieslamar/GestionInventario/SecurityConfig.java +++ b/src/main/java/com/ieslamar/GestionInventario/SecurityConfig.java @@ -25,7 +25,7 @@ public class SecurityConfig { .requestMatchers("/css/**", "/js/**", "/images/**").permitAll() // Permitir acceso a CSS, JS e imágenes .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**").hasAnyRole("USER", "ADMIN") - .requestMatchers("/management", "/user_management", "/register").hasRole("ADMIN") + .requestMatchers("/management", "/user_management", "/register","/generic_list","generic_list_departamento").hasRole("ADMIN") .requestMatchers("/", "/login").permitAll() .anyRequest().authenticated() ) diff --git a/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java b/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java index 042277e..808ef4c 100644 --- a/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java +++ b/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java @@ -3,6 +3,7 @@ package com.ieslamar.GestionInventario.controllers; import com.ieslamar.GestionInventario.dto.BotonDTO; import com.ieslamar.GestionInventario.entities.User; +import com.ieslamar.GestionInventario.services.DepartamentoService; import com.ieslamar.GestionInventario.services.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; @@ -20,15 +21,18 @@ import java.util.ArrayList; import java.util.ArrayList; import java.util.List; +import java.util.Map; @Controller public class UserController { private final UserService userService; + private final DepartamentoService departamentoService; - public UserController(UserService userService) { + public UserController(UserService userService, DepartamentoService departamentoService) { this.userService = userService; + this.departamentoService = departamentoService; } private final BotonDTO gestionUsuarios = new BotonDTO("Gestión de usuarios", "/user_management", true, null); @@ -128,4 +132,51 @@ public class UserController { return "redirect:/user_management"; } + + + + + + + + + @GetMapping("/generic_list") + public String genericPage(Model model) { + model.addAttribute("title", "Gestión Genérica"); + model.addAttribute("headers", List.of("ID", "Nombre", "Rol", "Email", "Acciones")); + model.addAttribute("items", userService.getAllUsers().stream() + .map(user -> Map.of( + "id", user.getId(), + "values", List.of(user.getId(), user.getNombre(), user.getRole(), user.getMail()) + )) + .toList()); + model.addAttribute("actionsUrl", Map.of( + "edit", "/edit_user", + "delete", "/delete_user" + )); + model.addAttribute("backUrl", "/Inventario/home"); + model.addAttribute("addUrl", "/Inventario/register"); + return "generic_list"; + } + + @GetMapping("/generic_list_departamento") + public String genericPageDepartamento(Model model) { + model.addAttribute("title", "Gestión Genérica"); + model.addAttribute("headers", List.of("ID", "Nombre","Acciones")); + model.addAttribute("items", departamentoService.getAllDepartamentos().stream() + .map(departamento -> Map.of( + "id", departamento.getId(), + "values", List.of(departamento.getId(), departamento.getNombre()) + )) + .toList()); + model.addAttribute("actionsUrl", Map.of( + "edit", "/edit_user", + "delete", "/delete_user" + )); + model.addAttribute("backUrl", "/Inventario/home"); + model.addAttribute("addUrl", "/Inventario/register"); + return "generic_list"; + } + + } diff --git a/src/main/java/com/ieslamar/GestionInventario/services/DepartamentoService.java b/src/main/java/com/ieslamar/GestionInventario/services/DepartamentoService.java index 465bd1d..e080658 100644 --- a/src/main/java/com/ieslamar/GestionInventario/services/DepartamentoService.java +++ b/src/main/java/com/ieslamar/GestionInventario/services/DepartamentoService.java @@ -16,4 +16,10 @@ public class DepartamentoService { public List getAllDepartamentos() { return departamentoRepository.findAll(); } + + public void registerDepartamento(String nombre) { + Departamento departamento = new Departamento(); + departamento.setNombre(nombre); + departamentoRepository.save(departamento); + } } diff --git a/src/main/resources/db/Inventario_bueno_v1.sql b/src/main/resources/db/Inventario_bueno_v1.sql index cb57562..c7b4443 100644 --- a/src/main/resources/db/Inventario_bueno_v1.sql +++ b/src/main/resources/db/Inventario_bueno_v1.sql @@ -23,7 +23,7 @@ USE `inventario` ; DROP TABLE IF EXISTS `inventario`.`departamentos` ; CREATE TABLE IF NOT EXISTS `inventario`.`departamentos` ( - `iddepartamentos` INT NOT NULL, + `iddepartamentos` INT NOT NULL AUTO_INCREMENT, `Nombre` VARCHAR(45) NULL, PRIMARY KEY (`iddepartamentos`)) ENGINE = InnoDB; @@ -147,7 +147,7 @@ ENGINE = InnoDB; DROP TABLE IF EXISTS `inventario`.`proveedores` ; CREATE TABLE IF NOT EXISTS `inventario`.`proveedores` ( - `idproveedores` INT NOT NULL, + `idproveedores` INT NOT NULL AUTO_INCREMENT, `nombre` VARCHAR(45) NOT NULL, PRIMARY KEY (`idproveedores`)) ENGINE = InnoDB; @@ -159,7 +159,7 @@ ENGINE = InnoDB; DROP TABLE IF EXISTS `inventario`.`factura` ; CREATE TABLE IF NOT EXISTS `inventario`.`factura` ( - `idfactura` INT NOT NULL, + `idfactura` INT NOT NULL AUTO_INCREMENT, `foto` LONGBLOB NULL, `fecha` DATE NOT NULL, `fin_garantia` DATE NOT NULL, diff --git a/src/main/resources/db/Modelo_Inventario.mwb b/src/main/resources/db/Modelo_Inventario.mwb index bb62a4ddf3d350b4d7f90720f0f02f620167d852..18be9713840bd6f026abdc8acffe0bcfe6bca1b7 100644 GIT binary patch delta 15472 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 delta 15556 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 diff --git a/src/main/resources/templates/fragments/list.html b/src/main/resources/templates/fragments/list.html deleted file mode 100644 index 9708975..0000000 --- a/src/main/resources/templates/fragments/list.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - -
- -
- - - - - - diff --git a/src/main/resources/templates/generic_list.html b/src/main/resources/templates/generic_list.html new file mode 100644 index 0000000..64fde65 --- /dev/null +++ b/src/main/resources/templates/generic_list.html @@ -0,0 +1,44 @@ + + + + Página Genérica + + + +
+ + \ No newline at end of file