Commit 1305bf86 by Rubén Ramírez

feat: [RecursosController]: Implementadas las funciones para las búsquedas por…

feat: [RecursosController]: Implementadas las funciones para las búsquedas por id y borrar el recurso en el controlador
parent 6836f43d
...@@ -2,6 +2,7 @@ package com.ujaen.tfg.mangaffinity.rest; ...@@ -2,6 +2,7 @@ package com.ujaen.tfg.mangaffinity.rest;
import com.ujaen.tfg.mangaffinity.entidades.Genero; import com.ujaen.tfg.mangaffinity.entidades.Genero;
import com.ujaen.tfg.mangaffinity.entidades.Recurso; import com.ujaen.tfg.mangaffinity.entidades.Recurso;
import com.ujaen.tfg.mangaffinity.excepciones.RecursoNoExiste;
import com.ujaen.tfg.mangaffinity.rest.DTO.DTORecurso; import com.ujaen.tfg.mangaffinity.rest.DTO.DTORecurso;
import com.ujaen.tfg.mangaffinity.rest.DTO.Mapper; import com.ujaen.tfg.mangaffinity.rest.DTO.Mapper;
import com.ujaen.tfg.mangaffinity.servicios.ServicioRecursos; import com.ujaen.tfg.mangaffinity.servicios.ServicioRecursos;
...@@ -38,40 +39,89 @@ public class RecursosController { ...@@ -38,40 +39,89 @@ public class RecursosController {
@GetMapping("/titulo/{titulo}") @GetMapping("/titulo/{titulo}")
public ResponseEntity<List<DTORecurso>> buscarPorTitulo(@PathVariable String titulo) { public ResponseEntity<List<DTORecurso>> buscarPorTitulo(@PathVariable String titulo) {
List<Recurso> recursos = servicioRecursos.buscarRecursoPorTitulo(titulo); try {
if (recursos.isEmpty()) { List<Recurso> recursos = servicioRecursos.buscarRecursoPorTitulo(titulo);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Collections.emptyList()); if (recursos.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Collections.emptyList());
}
List<DTORecurso> dtoRecursos = recursos.stream().map(mapper::dto).toList();
return ResponseEntity.ok(dtoRecursos);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
} }
return ResponseEntity.ok(recursos.stream().map(mapper::dto).toList());
} }
@GetMapping("/genero/{genero}") @GetMapping("/genero/{genero}")
public ResponseEntity<List<DTORecurso>> buscarPorGenero(@PathVariable Genero genero) { public ResponseEntity<List<DTORecurso>> buscarPorGenero(@PathVariable Genero genero) {
List<Recurso> recursos = servicioRecursos.buscarRecursoPorGenero(genero); try {
if (recursos.isEmpty()) { List<Recurso> recursos = servicioRecursos.buscarRecursoPorGenero(genero);
return ResponseEntity.ok(Collections.emptyList()); // ✅ Devuelve [] List<DTORecurso> dtoRecursos = recursos.stream().map(mapper::dto).toList();
return ResponseEntity.ok(dtoRecursos);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
} }
return ResponseEntity.ok(recursos.stream().map(mapper::dto).toList());
} }
@GetMapping("/fecha") @GetMapping("/fecha")
public ResponseEntity<List<DTORecurso>> buscarPorRangoFechas(@RequestParam LocalDate inicio, @RequestParam LocalDate fin) { public ResponseEntity<List<DTORecurso>> buscarPorRangoFechas(@RequestParam LocalDate inicio, @RequestParam LocalDate fin) {
List<Recurso> recursos = servicioRecursos.buscarRecursoPorRangoFechas(inicio, fin); try {
if (recursos.isEmpty()) { List<Recurso> recursos = servicioRecursos.buscarRecursoPorRangoFechas(inicio, fin);
return ResponseEntity.ok(Collections.emptyList()); // ✅ Devuelve [] List<DTORecurso> dtoRecursos = recursos.stream().map(mapper::dto).toList();
return ResponseEntity.ok(dtoRecursos);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
} }
return ResponseEntity.ok(recursos.stream().map(mapper::dto).toList());
} }
@GetMapping("/autor/{autor}") @GetMapping("/autor/{autor}")
public ResponseEntity<List<DTORecurso>> buscarPorAutor(@PathVariable String autor) { public ResponseEntity<List<DTORecurso>> buscarPorAutor(@PathVariable String autor) {
List<Recurso> recursos = servicioRecursos.buscarRecursoPorAutor(autor); try {
if (recursos.isEmpty()) { List<Recurso> recursos = servicioRecursos.buscarRecursoPorAutor(autor);
return ResponseEntity.ok(Collections.emptyList()); // ✅ Devuelve [] List<DTORecurso> dtoRecursos = recursos.stream().map(mapper::dto).toList();
return ResponseEntity.ok(dtoRecursos);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
} }
return ResponseEntity.ok(recursos.stream().map(mapper::dto).toList());
} }
@GetMapping("/{id}")
public ResponseEntity<DTORecurso> buscarRecursoPorId(@PathVariable Long id) {
try {
Recurso recurso = servicioRecursos.buscarRecursoPorId(id);
if (recurso == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
return ResponseEntity.ok(mapper.dto(recurso));
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> borrarRecurso(@PathVariable Long id) {
try {
Recurso recurso = servicioRecursos.buscarRecursoPorId(id);
if (recurso == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
servicioRecursos.borrarRecurso(id);
return ResponseEntity.noContent().build();
} catch (SecurityException e) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
} }
\ No newline at end of file
...@@ -30,19 +30,19 @@ public class ServicioSeguridad { ...@@ -30,19 +30,19 @@ public class ServicioSeguridad {
.authorizeHttpRequests(request -> request .authorizeHttpRequests(request -> request
.requestMatchers(HttpMethod.POST, "/usuarios/{email}").permitAll() .requestMatchers(HttpMethod.POST, "/usuarios/{email}").permitAll()
.requestMatchers(HttpMethod.POST, "/usuarios/").permitAll() .requestMatchers(HttpMethod.POST, "/usuarios/").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos/titulo/**").permitAll() // 🔓 Permitir búsquedas .requestMatchers(HttpMethod.GET, "/recursos/titulo/**").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos/autor/**").permitAll() .requestMatchers(HttpMethod.GET, "/recursos/autor/**").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos/genero/**").permitAll() .requestMatchers(HttpMethod.GET, "/recursos/genero/**").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos/fecha").permitAll() .requestMatchers(HttpMethod.GET, "/recursos/fecha").permitAll()
.requestMatchers(HttpMethod.POST, "/recursos/").hasAuthority("ROLE_ADMIN") // <--- Aquí usamos ROLE_ADMIN .requestMatchers(HttpMethod.GET, "/recursos/{id}").permitAll() // ✅ Nueva ruta para buscar por ID
.requestMatchers(HttpMethod.POST, "/recursos/").hasAuthority("ROLE_ADMIN")
.requestMatchers(HttpMethod.DELETE, "/recursos/{id}").hasAuthority("ROLE_ADMIN") // ✅ Solo admins pueden borrar
.anyRequest().authenticated() .anyRequest().authenticated()
) )
.addFilterBefore(new JwtFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class) .addFilterBefore(new JwtFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class)
.build(); .build();
} }
@Bean @Bean
public PasswordEncoder passwordEncoder() { public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); return new BCryptPasswordEncoder();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment