Acabando con menus para el administrador y usuario, manegando fallos posible de si administrador borra a si mismo, que manda atras y dice que no puede. Cambio de formulario de crear de alumno para que los keywords tiene un campo tag que ayuda a separar las palabras cuando ponemos comas. De momento no funciona que ,os keywords aparece vacio, queda para areglar el apso de html a controlador de campo renovado
parent
94183d4ab9
commit
d4ec5ea057
@ -0,0 +1,178 @@
|
|||||||
|
package com.example.proyectofinal.controllers;
|
||||||
|
|
||||||
|
import com.example.proyectofinal.models.empresas.Alumno;
|
||||||
|
import com.example.proyectofinal.models.empresas.Ciclo;
|
||||||
|
import com.example.proyectofinal.models.empresas.Skill;
|
||||||
|
import com.example.proyectofinal.models.login.Usuario;
|
||||||
|
import com.example.proyectofinal.servicios.empresa.AlumnoService;
|
||||||
|
import com.example.proyectofinal.servicios.empresa.CicloService;
|
||||||
|
import com.example.proyectofinal.servicios.empresa.SkillService;
|
||||||
|
import com.example.proyectofinal.servicios.user.UsuarioService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.security.core.Authentication;
|
||||||
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
|
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.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
public class AdminController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UsuarioService usuarioService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AlumnoService alumnoService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CicloService cicloService;
|
||||||
|
@Autowired
|
||||||
|
private SkillService skillService;
|
||||||
|
|
||||||
|
@GetMapping("/admin/alta_admin_nuevo")
|
||||||
|
public String showCreateFormAdmin(Model model, Authentication authentication) {
|
||||||
|
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
|
||||||
|
boolean isAdmin = authorities.stream()
|
||||||
|
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
|
||||||
|
if (!isAdmin) {
|
||||||
|
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
|
||||||
|
}
|
||||||
|
|
||||||
|
model.addAttribute("usuario", new Usuario()); // Add this line
|
||||||
|
|
||||||
|
return "admin/usuario/create";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/admin/alta_admin_nuevo")
|
||||||
|
public String saveNewAdmin(@ModelAttribute Usuario usuario, Authentication authentication) {
|
||||||
|
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
|
||||||
|
boolean isAdmin = authorities.stream()
|
||||||
|
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
|
||||||
|
if (!isAdmin) {
|
||||||
|
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
|
||||||
|
}
|
||||||
|
usuario.setRol(usuarioService.getRolById(1));
|
||||||
|
|
||||||
|
if(usuarioService.getUserByLogInName(usuario.getNombreLogIn()) == null){
|
||||||
|
usuarioService.createUsuario(usuario.getNombreUsuario(), usuario.getNombreLogIn(), usuario.getEmail(), usuario.getPassword(), usuario.isLogedIn(), usuario.getRol().getId());
|
||||||
|
return "redirect:/buscador?userCreated=true";
|
||||||
|
}else {
|
||||||
|
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario ya existe");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/api/currentUser")
|
||||||
|
public ResponseEntity<Usuario> getCurrentUser(Authentication authentication) {
|
||||||
|
String username = authentication.getName();
|
||||||
|
Usuario usuario = usuarioService.findByLogInName(username);
|
||||||
|
return ResponseEntity.ok(usuario);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/admin/editar_usuario")
|
||||||
|
public String showUpdateFormAdmin(Model model, Authentication authentication) {
|
||||||
|
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
|
||||||
|
boolean isAdmin = authorities.stream()
|
||||||
|
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
|
||||||
|
if (!isAdmin) {
|
||||||
|
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
|
||||||
|
}
|
||||||
|
List<Usuario> users = usuarioService.findAll();
|
||||||
|
model.addAttribute("users", users);
|
||||||
|
model.addAttribute("usuario", new Usuario());
|
||||||
|
return "admin/usuario/update";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/admin/update_usuario")
|
||||||
|
public String updateUser(@ModelAttribute Usuario usuario, Authentication authentication) {
|
||||||
|
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
|
||||||
|
boolean isAdmin = authorities.stream()
|
||||||
|
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
|
||||||
|
if (!isAdmin) {
|
||||||
|
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
|
||||||
|
}
|
||||||
|
Usuario existingUser = usuarioService.findUserById(usuario.getId());
|
||||||
|
if (existingUser == null) {
|
||||||
|
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario no existe");
|
||||||
|
}
|
||||||
|
// Check if the password field is empty
|
||||||
|
if (usuario.getPassword().isEmpty()) {
|
||||||
|
// If the password field is empty, keep the original password
|
||||||
|
usuario.setPassword(existingUser.getPassword());
|
||||||
|
} else {
|
||||||
|
// If the password field is not empty, encrypt the new password
|
||||||
|
String password = usuario.getPassword();
|
||||||
|
existingUser.setPassword(passwordEncoder.encode(password));
|
||||||
|
}
|
||||||
|
usuarioService.saveUser(usuario);
|
||||||
|
return "redirect:/buscador?userUpdated=true";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/admin/user/{id}")
|
||||||
|
public ResponseEntity<Usuario> getUser(@PathVariable Long id) {
|
||||||
|
Usuario usuario = usuarioService.findUserById(id);
|
||||||
|
return ResponseEntity.ok(usuario);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/admin/delete_usuario")
|
||||||
|
public String showDeleteFormAdmin(Model model, Authentication authentication) {
|
||||||
|
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
|
||||||
|
boolean isAdmin = authorities.stream()
|
||||||
|
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
|
||||||
|
if (!isAdmin) {
|
||||||
|
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
|
||||||
|
}
|
||||||
|
List<Usuario> users = usuarioService.findAll();
|
||||||
|
model.addAttribute("users", users);
|
||||||
|
model.addAttribute("usuario", new Usuario());
|
||||||
|
return "admin/usuario/delete";
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/admin/delete_usuario/{id}")
|
||||||
|
public ResponseEntity<String> deleteUser(@PathVariable Long id, Authentication authentication) {
|
||||||
|
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
|
||||||
|
boolean isAdmin = authorities.stream()
|
||||||
|
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
|
||||||
|
if (!isAdmin) {
|
||||||
|
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
|
||||||
|
}
|
||||||
|
Usuario existingUser = usuarioService.findUserById(id);
|
||||||
|
if (existingUser == null) {
|
||||||
|
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario no existe");
|
||||||
|
}
|
||||||
|
// Get the currently authenticated user
|
||||||
|
String username = authentication.getName();
|
||||||
|
Usuario currentUser = usuarioService.findByLogInName(username);
|
||||||
|
// Check if the user to be deleted is the currently authenticated user
|
||||||
|
// ...
|
||||||
|
if (currentUser.getId().equals(id)) {
|
||||||
|
return ResponseEntity.ok("selfDelete");
|
||||||
|
}
|
||||||
|
Usuario user = usuarioService.findUserById(id);
|
||||||
|
if(user.getRol().getId() == 2){
|
||||||
|
Alumno alumno = alumnoService.findByEmail(user.getEmail());
|
||||||
|
System.out.println("TEST DELETING ALUMNO WITH ID: " + alumno.getId()+" AND EMAIL: "+alumno.getCorreo()+" AND NAME: "+alumno.getNombre());
|
||||||
|
alumnoService.deleteById(alumno.getId());
|
||||||
|
}
|
||||||
|
usuarioService.deleteUser(id);
|
||||||
|
return ResponseEntity.ok("userDeleted");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,145 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Informacion usuario</title>
|
||||||
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
|
||||||
|
<style>
|
||||||
|
|
||||||
|
.logout-button {
|
||||||
|
position: fixed;
|
||||||
|
top: 0px;
|
||||||
|
right: 0px;
|
||||||
|
background-color: red;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 20px;
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
border-radius: 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: underline;
|
||||||
|
background-color: #007BFF;
|
||||||
|
font-family: Verdana, Geneva, Tahoma, sans-serif;
|
||||||
|
font-size: 50px;
|
||||||
|
color: white;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
padding-top: 0;
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
width: 100%;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
.card {
|
||||||
|
box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
|
||||||
|
transition: 0.3s;
|
||||||
|
width: 40%;
|
||||||
|
margin: auto;
|
||||||
|
margin-top: 2rem; /* Add this line to create space at the top */
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
padding: 2rem;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
max-width: none;
|
||||||
|
margin: auto;
|
||||||
|
padding: 25px;
|
||||||
|
margin-top: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scrollable-list {
|
||||||
|
height: 50px; /* Adjust as needed */
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.edit-buttons {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>
|
||||||
|
<i class="fas fa-arrow-left" onclick="arrowBack()" style="cursor:pointer;"></i>
|
||||||
|
INFORMACION
|
||||||
|
<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<div class="card">
|
||||||
|
<h2>Usuario</h2>
|
||||||
|
<h5 class="card-title">Nombre Usuario:</h5>
|
||||||
|
<p class="card-text"><span th:text="${usuario.nombreUsuario}"></span></p>
|
||||||
|
<h5 class="card-title">Nombre LogIn:</h5>
|
||||||
|
<p class="card-text"><span th:text="${usuario.nombreLogIn}"></span></p>
|
||||||
|
<h5 class="card-title">Email:</h5>
|
||||||
|
<p class="card-text"><span th:text="${usuario.email}"></span></p>
|
||||||
|
<div class="edit-buttons">
|
||||||
|
<button type="button" onclick="location.href='/usuario/usuario_norm_update_form'">Edit Usuario</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card">
|
||||||
|
<h2>Alumno Information</h2>
|
||||||
|
<h5 class="card-title">Nombre:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.nombre}"></span></p>
|
||||||
|
<h5 class="card-title">Apellido:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.apellido}"></span></p>
|
||||||
|
<h5 class="card-title">Apellido2:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.apellido2}"></span></p>
|
||||||
|
<h5 class="card-title">Fecha Nacimiento:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.fechaNacimiento}"></span></p>
|
||||||
|
<h5 class="card-title">Genero:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.genero}"></span></p>
|
||||||
|
<h5 class="card-title">NIA:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.nia}"></span></p>
|
||||||
|
<h5 class="card-title">DNI:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.dni}"></span></p>
|
||||||
|
<h5 class="card-title">Correo:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.correo}"></span></p>
|
||||||
|
<h5 class="card-title">Correo2:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.correo2}"></span></p>
|
||||||
|
<h5 class="card-title">Nacionalidad:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.nacionalidad}"></span></p>
|
||||||
|
<h5 class="card-title">Keywords:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.keywords}"></span></p>
|
||||||
|
<h5 class="card-title">Ciclo:</h5>
|
||||||
|
<p class="card-text"><span th:text="${alumno.ciclo.nombre}"></span></p>
|
||||||
|
<h5 class="card-title">Skills:</h5>
|
||||||
|
<div class="scrollable-list">
|
||||||
|
<ul class="list-group">
|
||||||
|
<li class="list-group-item" th:each="skill : ${alumno.skills}" th:text="${skill.nombre}"></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="edit-buttons">
|
||||||
|
<button type="button" onclick="location.href='/usuario/alu_update_form'">Edit Alumno</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
function arrowBack() {
|
||||||
|
window.history.back();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,117 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<title>Editar Usuario</title>
|
||||||
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" th:href="@{/top.css}">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
max-width: none;
|
||||||
|
margin: auto;
|
||||||
|
padding: 25px;
|
||||||
|
margin-top: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-right: 5px;
|
||||||
|
width: 120px;
|
||||||
|
height: 40px;
|
||||||
|
font-family: Verdana, Geneva, Tahoma, sans-serif
|
||||||
|
}
|
||||||
|
form input[type="submit"], form input[type="button"] {
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
form label{
|
||||||
|
font-size: 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-family: Verdana, Geneva, Tahoma, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
body, h1 {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
input[type="text"], input[type="password"], input[type="email"] {
|
||||||
|
width: 350px;
|
||||||
|
height: 25px;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1>Editar Usuario</h1>
|
||||||
|
<form th:action="@{/usuario/update_usuario_normal}" th:object="${usuario}" method="post">
|
||||||
|
<input type="hidden" th:field="*{id}" id="userId">
|
||||||
|
|
||||||
|
<div class="form-group row">
|
||||||
|
<label class="col-sm-3 col-form-label" for="nombreUsuario">Username:</label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<input type="text" th:field="*{nombreUsuario}" id="nombreUsuario" required class="form-control">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group row">
|
||||||
|
<label class="col-sm-3 col-form-label" for="nombreLogIn">Login Name:</label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<input type="text" th:field="*{nombreLogIn}" id="nombreLogIn" required class="form-control">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group row">
|
||||||
|
<label class="col-sm-3 col-form-label" for="email">Email:</label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<input type="email" th:field="*{email}" id="email" required class="form-control">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group row">
|
||||||
|
<label class="col-sm-3 col-form-label" for="password">Password:</label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<input type="password" th:field="*{password}" id="password" class="form-control" value="" placeholder="Complete esto solo si desea cambiar la contraseña.">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group row">
|
||||||
|
<label class="col-sm-3 col-form-label" for="confirmPassword">Confirm Password:</label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<input type="password" id="confirmPassword" required class="form-control" value="" placeholder=" Confirmar contraseña" disabled>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="text-center">
|
||||||
|
<input type="submit" value="Guardar" class="btn"/>
|
||||||
|
<input type="button" value="Cancelar" id="btnCancelar" class="btn" onclick="goBack()"/>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<script>
|
||||||
|
function goBack() {
|
||||||
|
window.location.href = "/buscador";
|
||||||
|
}
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#password, #confirmPassword').on('input', function() {
|
||||||
|
var password = $('#password').val();
|
||||||
|
var confirmPassword = $('#confirmPassword').val();
|
||||||
|
|
||||||
|
if (password && confirmPassword && password !== confirmPassword) {
|
||||||
|
$('#confirmPassword').prop('disabled', false);
|
||||||
|
} else {
|
||||||
|
$('#confirmPassword').prop('disabled', true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in new issue