Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Rubén Ramírez
/
MangAffinity
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
cfb55e05
authored
May 14, 2025
by
Rubén Ramírez
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
feat: [Servicios+Controladores]: Comentadas las funciones que no tenían doxygen
parent
63651ab7
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
212 additions
and
55 deletions
src/main/java/com/ujaen/tfg/mangaffinity/rest/BibliotecaPersonalController.java
src/main/java/com/ujaen/tfg/mangaffinity/rest/RecursosController.java
src/main/java/com/ujaen/tfg/mangaffinity/rest/SeguimientoController.java
src/main/java/com/ujaen/tfg/mangaffinity/rest/UsuariosController.java
src/main/java/com/ujaen/tfg/mangaffinity/seguridad/ServicioSeguridad.java
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioBibliotecaPersonal.java
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioRecursos.java
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioSeguimiento.java
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioUsuarios.java
src/main/java/com/ujaen/tfg/mangaffinity/rest/BibliotecaPersonalController.java
View file @
cfb55e05
...
...
@@ -200,6 +200,15 @@ public class BibliotecaPersonalController {
}
}
/**
* Añade un recurso a la lista de favoritos de la biblioteca personal del usuario.
*
* Devuelve:
* - 200 OK si se añade correctamente.
* - 404 NOT FOUND si la biblioteca del usuario no existe.
* - 409 CONFLICT si se ha alcanzado el número máximo de favoritos permitidos.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@PutMapping
(
"/{usuarioId}/favoritos/{recursoId}"
)
public
ResponseEntity
<
Void
>
anadirAFavoritos
(
@PathVariable
Long
usuarioId
,
...
...
@@ -217,6 +226,14 @@ public class BibliotecaPersonalController {
}
}
/**
* Elimina un recurso de la lista de favoritos de la biblioteca personal del usuario.
*
* Devuelve:
* - 204 NO CONTENT si se elimina correctamente.
* - 404 NOT FOUND si la biblioteca del usuario no existe.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@DeleteMapping
(
"/{usuarioId}/favoritos/{recursoId}"
)
public
ResponseEntity
<
Void
>
eliminarDeFavoritos
(
@PathVariable
Long
usuarioId
,
...
...
@@ -232,6 +249,14 @@ public class BibliotecaPersonalController {
}
}
/**
* Obtiene la lista de recursos marcados como favoritos por el usuario.
*
* Devuelve:
* - 200 OK con la lista de recursos favoritos (vacía o no).
* - 404 NOT FOUND si la biblioteca del usuario no existe.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@GetMapping
(
"/{usuarioId}/favoritos"
)
public
ResponseEntity
<
List
<
DTORecurso
>>
obtenerFavoritos
(
@PathVariable
Long
usuarioId
)
{
...
...
src/main/java/com/ujaen/tfg/mangaffinity/rest/RecursosController.java
View file @
cfb55e05
...
...
@@ -52,9 +52,8 @@ public class RecursosController {
if
(
foto
!=
null
&&
!
foto
.
isEmpty
())
{
String
mimeType
=
foto
.
getContentType
();
if
(
mimeType
==
null
||
(!
mimeType
.
equals
(
"image/jpeg"
)
&&
!
mimeType
.
equals
(
"image/png"
)))
{
return
ResponseEntity
.
badRequest
().
build
();
}
if
(
mimeType
==
null
||
(!
mimeType
.
equals
(
"image/jpeg"
)
&&
!
mimeType
.
equals
(
"image/png"
)))
return
ResponseEntity
.
badRequest
().
build
();
fotoBytes
=
foto
.
getBytes
();
}
...
...
@@ -428,13 +427,9 @@ public class RecursosController {
public
ResponseEntity
<
List
<
DTORecurso
>>
obtenerRanking
()
{
List
<
Recurso
>
recursosTop
=
servicioRecursos
.
obtenerTopRecursosUltimaSemana
();
if
(
recursosTop
.
isEmpty
())
{
recursosTop
=
servicioRecursos
.
obtenerListadoRecursos
();
}
if
(
recursosTop
.
isEmpty
())
recursosTop
=
servicioRecursos
.
obtenerListadoRecursos
();
if
(
recursosTop
.
isEmpty
())
{
return
ResponseEntity
.
noContent
().
build
();
}
if
(
recursosTop
.
isEmpty
())
return
ResponseEntity
.
noContent
().
build
();
List
<
DTORecurso
>
dtoRecursosTop
=
recursosTop
.
stream
()
.
map
(
mapper:
:
dto
)
...
...
@@ -480,9 +475,8 @@ public class RecursosController {
public
ResponseEntity
<
List
<
DTOResena
>>
obtenerResenasDeRecurso
(
@PathVariable
Long
recursoId
)
{
try
{
List
<
Resena
>
resenas
=
servicioRecursos
.
obtenerResenasDeRecurso
(
recursoId
);
if
(
resenas
.
isEmpty
())
{
return
ResponseEntity
.
noContent
().
build
();
}
if
(
resenas
.
isEmpty
())
return
ResponseEntity
.
noContent
().
build
();
return
ResponseEntity
.
ok
(
mapper
.
dtoListaResenas
(
resenas
));
}
catch
(
Exception
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
INTERNAL_SERVER_ERROR
).
build
();
...
...
src/main/java/com/ujaen/tfg/mangaffinity/rest/SeguimientoController.java
View file @
cfb55e05
...
...
@@ -26,6 +26,12 @@ public class SeguimientoController {
/**
* Permite a un usuario seguir a otro.
*
* Devuelve:
* - 201 CREATED si el seguimiento se realiza correctamente.
* - 409 CONFLICT si ya existe el seguimiento.
* - 404 NOT FOUND si alguno de los usuarios no existe.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@PostMapping
(
"/{nombreSeguido}"
)
public
ResponseEntity
<?>
seguir
(
@RequestHeader
(
"nombreUsuario"
)
String
nombreSeguidor
,
...
...
@@ -43,7 +49,12 @@ public class SeguimientoController {
}
/**
* Permite dejar de seguir a un usuario.
* Permite a un usuario dejar de seguir a otro.
*
* Devuelve:
* - 204 NO CONTENT si el seguimiento se elimina correctamente.
* - 404 NOT FOUND si el seguimiento no existe o algún usuario no se encuentra.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@DeleteMapping
(
"/{nombreSeguido}"
)
public
ResponseEntity
<?>
dejarDeSeguir
(
@RequestHeader
(
"nombreUsuario"
)
String
nombreSeguidor
,
...
...
@@ -51,9 +62,7 @@ public class SeguimientoController {
try
{
servicioSeguimientos
.
dejarDeSeguir
(
nombreSeguidor
,
nombreSeguido
);
return
ResponseEntity
.
noContent
().
build
();
}
catch
(
SeguimientoNoExiste
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
NOT_FOUND
).
build
();
}
catch
(
UsuarioNoExiste
e
)
{
}
catch
(
SeguimientoNoExiste
|
UsuarioNoExiste
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
NOT_FOUND
).
build
();
}
catch
(
Exception
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
INTERNAL_SERVER_ERROR
).
build
();
...
...
@@ -61,7 +70,11 @@ public class SeguimientoController {
}
/**
* Lista de usuarios que sigue un usuario.
* Recupera la lista de usuarios que son seguidos por un usuario específico.
*
* - 200 OK y la lista de usuarios seguidos si la operación tiene éxito.
* - 404 NOT FOUND si el usuario no existe.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@GetMapping
(
"/seguidos/{nombreUsuario}"
)
public
ResponseEntity
<
List
<
DTOUsuario
>>
obtenerSeguidos
(
@PathVariable
String
nombreUsuario
)
{
...
...
@@ -71,11 +84,18 @@ public class SeguimientoController {
return
ResponseEntity
.
ok
(
dto
);
}
catch
(
UsuarioNoExiste
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
NOT_FOUND
).
build
();
}
catch
(
Exception
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
INTERNAL_SERVER_ERROR
).
build
();
}
}
/**
* Lista de seguidores de un usuario.
* Recupera la lista de usuarios que siguen a un usuario específico.
*
* - 200 OK y la lista de seguidores si la operación tiene éxito.
* - 404 NOT FOUND si el usuario no existe.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@GetMapping
(
"/seguidores/{nombreUsuario}"
)
public
ResponseEntity
<
List
<
DTOUsuario
>>
obtenerSeguidores
(
@PathVariable
String
nombreUsuario
)
{
...
...
@@ -85,11 +105,17 @@ public class SeguimientoController {
return
ResponseEntity
.
ok
(
dto
);
}
catch
(
UsuarioNoExiste
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
NOT_FOUND
).
build
();
}
catch
(
Exception
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
INTERNAL_SERVER_ERROR
).
build
();
}
}
/**
* Verifica si un usuario sigue a otro.
* Verifica si un usuario está siguiendo a otro.
*
* - 200 OK y un valor booleano indicando si existe el seguimiento.
* - 404 NOT FOUND si alguno de los usuarios no existe.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@GetMapping
(
"/existe"
)
public
ResponseEntity
<
Boolean
>
estaSiguiendo
(
@RequestParam
String
seguidor
,
...
...
@@ -99,6 +125,8 @@ public class SeguimientoController {
return
ResponseEntity
.
ok
(
resultado
);
}
catch
(
UsuarioNoExiste
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
NOT_FOUND
).
build
();
}
catch
(
Exception
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
INTERNAL_SERVER_ERROR
).
build
();
}
}
}
src/main/java/com/ujaen/tfg/mangaffinity/rest/UsuariosController.java
View file @
cfb55e05
...
...
@@ -96,9 +96,8 @@ public class UsuariosController {
public
ResponseEntity
<?>
obtenerBiblioteca
(
@PathVariable
Long
usuarioId
)
{
try
{
BibliotecaPersonal
biblioteca
=
servicioUsuarios
.
obtenerBibliotecaDeUsuario
(
usuarioId
);
if
(
biblioteca
==
null
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
NOT_FOUND
).
body
(
"No se encontró la biblioteca"
);
}
if
(
biblioteca
==
null
)
return
ResponseEntity
.
status
(
HttpStatus
.
NOT_FOUND
).
body
(
"No se encontró la biblioteca"
);
return
ResponseEntity
.
ok
(
new
DTOBibliotecaPersonal
(
biblioteca
));
}
catch
(
RuntimeException
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
INTERNAL_SERVER_ERROR
).
body
(
"Error inesperado"
);
...
...
@@ -125,6 +124,15 @@ public class UsuariosController {
}
}
/**
* Modifica los datos de un usuario autenticado a partir del token JWT proporcionado.
*
* - 200 OK y DTOLoginRespuesta si la modificación se realiza correctamente.
* - 409 CONFLICT si el correo electrónico o el nombre de usuario ya están registrados.
* - 404 NOT FOUND si el usuario no existe.
* - 403 FORBIDDEN si la contraseña actual es incorrecta.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@PutMapping
(
"/"
)
public
ResponseEntity
<?>
modificarUsuario
(
@Valid
@RequestBody
DTOModificarUsuario
dto
,
@RequestHeader
(
"Authorization"
)
String
token
)
{
...
...
@@ -150,6 +158,12 @@ public class UsuariosController {
return
ResponseEntity
.
status
(
HttpStatus
.
INTERNAL_SERVER_ERROR
).
body
(
"error inesperado"
);
}
}
/**
* Devuelve una lista de recursos recomendados para un usuario específico.
*
* - 200 OK y la lista de recursos recomendados en formato DTORecurso si la operación es exitosa.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado durante el proceso de recomendación.
*/
@GetMapping
(
"/{usuarioId}/recomendaciones"
)
public
ResponseEntity
<
List
<
DTORecurso
>>
obtenerRecomendaciones
(
@PathVariable
Long
usuarioId
)
{
try
{
...
...
@@ -176,6 +190,14 @@ public class UsuariosController {
}
}
/**
* Actualiza la descripción y/o la foto de perfil de un usuario concreto.
*
* - 204 NO CONTENT si la actualización se realiza correctamente.
* - 400 BAD REQUEST si los datos proporcionados no son válidos.
* - 404 NOT FOUND si el usuario no existe.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@PutMapping
(
"/{usuarioId}/perfil"
)
public
ResponseEntity
<
Void
>
actualizarPerfilUsuario
(
@PathVariable
Long
usuarioId
,
...
...
@@ -187,8 +209,20 @@ public class UsuariosController {
return
ResponseEntity
.
notFound
().
build
();
}
catch
(
IllegalArgumentException
e
)
{
return
ResponseEntity
.
badRequest
().
build
();
}
catch
(
Exception
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
INTERNAL_SERVER_ERROR
).
build
();
}
}
/**
* Recupera la información de un usuario a partir de su ID.
*
* @param usuarioId ID del usuario que se desea consultar.
* @return ResponseEntity con:
* - 200 OK y los datos del usuario en formato DTOUsuario si se encuentra correctamente.
* - 404 NOT FOUND si no existe ningún usuario con el ID proporcionado.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@GetMapping
(
"/{usuarioId}"
)
public
ResponseEntity
<
DTOUsuario
>
obtenerUsuarioPorId
(
@PathVariable
Long
usuarioId
)
{
try
{
...
...
@@ -196,9 +230,19 @@ public class UsuariosController {
return
ResponseEntity
.
ok
(
mapper
.
dto
(
usuario
));
}
catch
(
UsuarioNoExiste
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
NOT_FOUND
).
build
();
}
catch
(
Exception
e
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
INTERNAL_SERVER_ERROR
).
build
();
}
}
/**
* Filtra y devuelve una lista de usuarios cuyo nombre coincide (parcial o totalmente) con el valor indicado.
*
* - 200 OK y la lista de usuarios coincidentes si se encuentran resultados.
* - 204 NO CONTENT si no se encuentran usuarios con ese nombre.
* - 400 BAD REQUEST si no se proporciona el parámetro o está vacío.
* - 500 INTERNAL SERVER ERROR en caso de error inesperado.
*/
@GetMapping
public
ResponseEntity
<
List
<
DTOUsuario
>>
filtrarUsuarios
(
@RequestParam
(
required
=
false
)
String
nombre
)
{
try
{
...
...
src/main/java/com/ujaen/tfg/mangaffinity/seguridad/ServicioSeguridad.java
View file @
cfb55e05
...
...
@@ -37,46 +37,55 @@ public class ServicioSeguridad {
return
config
;
}))
.
authorizeHttpRequests
(
request
->
request
// Rutas públicas
.
requestMatchers
(
HttpMethod
.
GET
,
"/actuator/health"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
POST
,
"/usuarios/"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
POST
,
"/usuarios/{email}"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/usuarios"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/usuarios/email/{email}"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
POST
,
"/usuarios/"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
PUT
,
"/usuarios/"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
PUT
,
"/usuarios/{usuarioId}/perfil"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/usuarios/*"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/actuator/health"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/titulo/**"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/autor/**"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/genero/**"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/fecha"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/{id}"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/generos"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
POST
,
"/recursos/"
).
hasAuthority
(
"ROLE_ADMIN"
)
.
requestMatchers
(
HttpMethod
.
PUT
,
"/recursos/{id}"
).
hasAuthority
(
"ROLE_ADMIN"
)
.
requestMatchers
(
HttpMethod
.
DELETE
,
"/recursos/{id}"
).
hasAuthority
(
"ROLE_ADMIN"
)
.
requestMatchers
(
HttpMethod
.
POST
,
"/recursos/{id}/capitulos"
).
hasAuthority
(
"ROLE_ADMIN"
)
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/ranking"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/{id}"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/{id}/capitulos"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/{recursoId}/capitulos/{capituloId}"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/{recursoId}/resenas"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/usuarios/{usuarioId}/biblioteca"
).
permitAll
()
// Rutas autenticadas (usuarios registrados)
.
requestMatchers
(
HttpMethod
.
GET
,
"/usuarios"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
PUT
,
"/usuarios/"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
PUT
,
"/usuarios/{usuarioId}/perfil"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/usuarios/*"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/usuarios/{usuarioId}/recomendaciones"
).
authenticated
()
// Biblioteca personal
.
requestMatchers
(
HttpMethod
.
POST
,
"/biblioteca/{usuarioId}/recursos/{recursoId}/categoria"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/biblioteca/{usuarioId}/recursos/categoria/{categoria}"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
DELETE
,
"/biblioteca/{usuarioId}/recursos/{recursoId}"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
PUT
,
"/biblioteca/{usuarioId}/recursos/{recursoId}/categoria"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/{recursoId}/capitulos/{capituloId}"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
PUT
,
"/recursos/{recursoId}/capitulos/{capituloId}"
).
hasAuthority
(
"ROLE_ADMIN"
)
.
requestMatchers
(
HttpMethod
.
GET
,
"/biblioteca/{usuarioId}/recursos/{recursoId}"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/ranking"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
PUT
,
"/usuarios/{usuarioId}/perfil"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
POST
,
"/recursos/{recursoId}/resenas"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/{recursoId}/resenas"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/usuarios/{usuarioId}/recomendaciones"
).
authenticated
()
// Endpoints de seguimiento
// Seguimientos
.
requestMatchers
(
HttpMethod
.
POST
,
"/seguimientos/{nombreSeguido}"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
DELETE
,
"/seguimientos/{nombreSeguido}"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/seguimientos/seguidos/{nombreUsuario}"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/seguimientos/seguidores/{nombreUsuario}"
).
authenticated
()
.
requestMatchers
(
HttpMethod
.
GET
,
"/seguimientos/existe"
).
authenticated
()
// Rutas ADMIN
.
requestMatchers
(
HttpMethod
.
POST
,
"/recursos/"
).
hasAuthority
(
"ROLE_ADMIN"
)
.
requestMatchers
(
HttpMethod
.
PUT
,
"/recursos/{id}"
).
hasAuthority
(
"ROLE_ADMIN"
)
.
requestMatchers
(
HttpMethod
.
DELETE
,
"/recursos/{id}"
).
hasAuthority
(
"ROLE_ADMIN"
)
.
requestMatchers
(
HttpMethod
.
POST
,
"/recursos/{id}/capitulos"
).
hasAuthority
(
"ROLE_ADMIN"
)
.
requestMatchers
(
HttpMethod
.
PUT
,
"/recursos/{recursoId}/capitulos/{capituloId}"
).
hasAuthority
(
"ROLE_ADMIN"
)
// Cualquier otra petición
.
anyRequest
().
authenticated
()
)
.
addFilterBefore
(
new
JwtFilter
(
jwtUtil
),
UsernamePasswordAuthenticationFilter
.
class
)
...
...
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioBibliotecaPersonal.java
View file @
cfb55e05
...
...
@@ -115,6 +115,13 @@ public class ServicioBibliotecaPersonal {
return
repositorioBibliotecaPersonalRecurso
.
buscarRecursoEnBiblioteca
(
bibliotecaPersonalId
,
recursoId
);
}
/**
* @brief Añade un recurso a la lista de favoritos del usuario.
* @param bibliotecaPersonalId ID de la biblioteca personal del usuario.
* @param recursoId ID del recurso que se desea marcar como favorito.
* @throws UsuarioSinBiblioteca Si no existe una biblioteca asociada al usuario.
* @throws RecursoNoExiste Si el recurso no existe en la base de datos.
*/
@Transactional
public
void
anadirFavorito
(
Long
bibliotecaPersonalId
,
Long
recursoId
)
{
BibliotecaPersonal
biblioteca
=
repositorioBibliotecaPersonalRecurso
...
...
@@ -128,6 +135,13 @@ public class ServicioBibliotecaPersonal {
biblioteca
.
anadirFavorito
(
recurso
.
getId
());
}
/**
* @brief Elimina un recurso de la lista de favoritos del usuario.
*
* @param bibliotecaPersonalId ID de la biblioteca personal del usuario.
* @param recursoId ID del recurso que se desea eliminar de favoritos.
* @throws UsuarioSinBiblioteca Si no existe una biblioteca asociada al usuario.
*/
@Transactional
public
void
eliminarFavorito
(
Long
bibliotecaPersonalId
,
Long
recursoId
)
{
BibliotecaPersonal
biblioteca
=
repositorioBibliotecaPersonalRecurso
...
...
@@ -137,6 +151,12 @@ public class ServicioBibliotecaPersonal {
biblioteca
.
eliminarFavorito
(
recursoId
);
}
/**
* @brief Obtiene la lista de IDs de los recursos marcados como favoritos por el usuario.
* @param bibliotecaPersonalId ID de la biblioteca personal del usuario.
* @return Lista de IDs de recursos que el usuario ha marcado como favoritos.
* @throws UsuarioSinBiblioteca Si no existe una biblioteca asociada al usuario.
*/
@Transactional
(
readOnly
=
true
)
public
List
<
Long
>
obtenerFavoritos
(
Long
bibliotecaPersonalId
)
{
BibliotecaPersonal
biblioteca
=
repositorioBibliotecaPersonalRecurso
...
...
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioRecursos.java
View file @
cfb55e05
...
...
@@ -231,7 +231,7 @@ public class ServicioRecursos {
}
/**
* Modifica un capítulo existente dentro de un recurso.
*
@brief
Modifica un capítulo existente dentro de un recurso.
* @param recursoId ID del recurso al que pertenece el capítulo.
* @param capituloModificado Entidad Capitulo con los nuevos datos.
* @return Capítulo actualizado.
...
...
@@ -299,7 +299,6 @@ public class ServicioRecursos {
/**
* @brief Elimina una fuente de un capítulo por su ID.
* @param id Identificador de la fuente a eliminar.
* Si la fuente existe, se elimina; en caso contrario, no realiza ninguna acción.
*/
@Transactional
public
void
eliminarFuentePorId
(
Long
id
)
{
...
...
@@ -381,7 +380,7 @@ public class ServicioRecursos {
}
/**
* Añade una nueva reseña a un recurso.
*
@brief
Añade una nueva reseña a un recurso.
* @param resena Objeto Resena con los datos de la reseña a añadir.
*/
@Transactional
...
...
@@ -401,10 +400,8 @@ public class ServicioRecursos {
repositorioRecurso
.
actualiza
(
recurso
);
}
/**
* Obtiene las reseñas de un recurso específico, ordenadas por fecha de publicación de manera descendente.
*
@brief
Obtiene las reseñas de un recurso específico, ordenadas por fecha de publicación de manera descendente.
* @param recursoId Identificador del recurso cuyo listado de reseñas se desea obtener.
* @return Lista de reseñas del recurso, ordenadas por fecha de publicación.
*/
...
...
@@ -415,6 +412,12 @@ public class ServicioRecursos {
.
collect
(
Collectors
.
toList
());
}
/**
* @brief Genera una lista de recomendaciones personalizadas de recursos para un usuario,
* @param usuarioId ID del usuario para el que se desean obtener recomendaciones.
* @return Lista de hasta 4 recursos recomendados que no estén ni en la biblioteca ni en favoritos.
* @throws UsuarioSinBiblioteca Si el usuario no tiene una biblioteca personal asociada.
*/
public
List
<
Recurso
>
obtenerRecomendacionesParaUsuario
(
Long
usuarioId
)
{
BibliotecaPersonal
biblioteca
=
repositorioBibliotecaPersonalRecurso
.
obtenerBibliotecaPorUsuarioId
(
usuarioId
)
...
...
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioSeguimiento.java
View file @
cfb55e05
...
...
@@ -27,11 +27,11 @@ public class ServicioSeguimiento {
private
RepositorioUsuario
repositorioUsuario
;
/**
* @brief Permite a un usuario seguir a otro.
* @param nombreSeguidor nombre de usuario que realiza el seguimiento.
* @param nombreSeguido nombre de usuario que será seguido.
* @throws UsuarioNoExiste si alguno de los dos usuarios no existe.
* @throws SeguimientoExiste si ya existe el seguimiento.
* @brief Permite a un usuario seguir a otro.
*/
@Transactional
public
void
seguir
(
String
nombreSeguidor
,
String
nombreSeguido
)
{
...
...
@@ -57,11 +57,11 @@ public class ServicioSeguimiento {
}
/**
* @brief Permite dejar de seguir a un usuario.
* @param nombreSeguidor nombre de usuario que dejará de seguir.
* @param nombreSeguido nombre del usuario seguido.
* @throws UsuarioNoExiste si alguno no existe.
* @throws SeguimientoNoExiste si la relación no existe.
* @brief Permite dejar de seguir a un usuario.
*/
@Transactional
public
void
dejarDeSeguir
(
String
nombreSeguidor
,
String
nombreSeguido
)
{
...
...
@@ -78,10 +78,10 @@ public class ServicioSeguimiento {
}
/**
* @brief Obtiene los usuarios que sigue un usuario dado.
* @param nombreSeguidor nombre de usuario que realiza seguimientos.
* @return Lista de usuarios seguidos.
* @throws UsuarioNoExiste si el usuario no existe.
* @brief Obtiene los usuarios que sigue un usuario dado.
*/
@Transactional
(
readOnly
=
true
)
public
List
<
Usuario
>
obtenerSeguidos
(
String
nombreSeguidor
)
{
...
...
@@ -110,11 +110,11 @@ public class ServicioSeguimiento {
}
/**
* @brief Verifica si un usuario sigue a otro.
* @param nombreSeguidor quien realiza el seguimiento.
* @param nombreSeguido quien es seguido.
* @return true si lo sigue, false si no.
* @throws UsuarioNoExiste si no existe alguno de los usuarios.
* @brief Verifica si un usuario sigue a otro.
*/
@Transactional
(
readOnly
=
true
)
public
boolean
estaSiguiendo
(
String
nombreSeguidor
,
String
nombreSeguido
)
{
...
...
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioUsuarios.java
View file @
cfb55e05
...
...
@@ -55,7 +55,6 @@ public class ServicioUsuarios {
* @return DTOLoginRespuesta con el token, email y nombre de usuario.
* @throws UsuarioYaRegistrado Si el email ya está registrado o es del admin.
* @throws NombreUsuarioYaCogido Si el nombre de usuario ya está en uso.
* Encripta la contraseña, asigna una biblioteca personal y genera un token JWT.
*/
public
DTOLoginRespuesta
crearUsuario
(
Usuario
usuario
)
{
usuario
.
setContrasenia
(
passwordEncoder
.
encode
(
usuario
.
getContrasenia
()));
...
...
@@ -85,7 +84,6 @@ public class ServicioUsuarios {
* @param email Correo electrónico del usuario.
* @param contrasenia Contraseña en texto plano.
* @return DTOLoginRespuesta con el token, email y nombre de usuario, o null si falla la autenticación.
* Devuelve null si el usuario no existe, la contraseña es incorrecta o no tiene permisos de administrador.
*/
public
DTOLoginRespuesta
autenticarUsuario
(
String
email
,
String
contrasenia
)
{
Optional
<
Usuario
>
usuarioOpt
=
repositorioUsuario
.
findByEmail
(
email
);
...
...
@@ -111,7 +109,6 @@ public class ServicioUsuarios {
* @param email Correo electrónico del usuario.
* @return Usuario encontrado.
* @throws UsuarioNoExiste Si el usuario no está registrado.
* Devuelve el usuario administrador si el email coincide con el del admin.
*/
public
Usuario
buscaUsuario
(
String
email
)
{
if
(
email
.
equals
(
admin
.
getEmail
()))
return
admin
;
...
...
@@ -136,7 +133,6 @@ public class ServicioUsuarios {
* @param id ID del usuario.
* @return Usuario encontrado.
* @throws UsuarioNoExiste Si el usuario no está registrado.
* Devuelve el usuario administrador si el ID coincide con el del admin.
*/
public
Usuario
buscaUsuario
(
Long
id
)
{
if
(
id
.
equals
(
admin
.
getId
()))
return
admin
;
...
...
@@ -144,6 +140,19 @@ public class ServicioUsuarios {
return
repositorioUsuario
.
findById
(
id
).
orElseThrow
(
UsuarioNoExiste:
:
new
);
}
/**
* @brief Modifica los datos básicos de un usuario (email, nombre de usuario y/o contraseña).
* @param emailActual Email actual del usuario.
* @param nuevoEmail Nuevo email propuesto.
* @param nuevoNombreUsuario Nuevo nombre de usuario propuesto.
* @param nuevaContrasenia Nueva contraseña (puede ser null o vacía si no se desea cambiar).
* @param contraseniaActual Contraseña actual del usuario, necesaria para validar el cambio.
* @return DTOLoginRespuesta con un nuevo token JWT y los datos actualizados.
* @throws UsuarioNoExiste Si el usuario no está registrado.
* @throws UsuarioYaRegistrado Si el nuevo email ya está en uso por otro usuario.
* @throws NombreUsuarioYaCogido Si el nuevo nombre de usuario ya está en uso.
* @throws IllegalArgumentException Si la contraseña actual es incorrecta.
*/
public
DTOLoginRespuesta
modificarUsuario
(
String
emailActual
,
String
nuevoEmail
,
String
nuevoNombreUsuario
,
String
nuevaContrasenia
,
String
contraseniaActual
)
{
Usuario
usuario
=
repositorioUsuario
.
findByEmail
(
emailActual
)
.
orElseThrow
(
UsuarioNoExiste:
:
new
);
...
...
@@ -190,11 +199,31 @@ public class ServicioUsuarios {
return
new
DTOLoginRespuesta
(
token
,
usuario
.
getEmail
(),
usuario
.
getNombreUsuario
());
}
/**
* @brief Modifica los datos de un usuario autenticado, utilizando un token JWT como identificador.
* @param token Token JWT del usuario autenticado.
* @param nuevoEmail Nuevo correo electrónico (puede ser el mismo o diferente).
* @param nuevoNombreUsuario Nuevo nombre de usuario (puede ser el mismo o diferente).
* @param nuevaContrasenia Nueva contraseña en texto plano (puede ser null o vacía si no se desea modificar).
* @param contraseniaActual Contraseña actual del usuario para validación.
* @return DTOLoginRespuesta con un nuevo token JWT, el email y el nombre de usuario actualizados.
* @throws UsuarioNoExiste Si el usuario no existe.
* @throws UsuarioYaRegistrado Si el nuevo email ya está en uso.
* @throws NombreUsuarioYaCogido Si el nuevo nombre de usuario ya está en uso.
* @throws IllegalArgumentException Si la contraseña actual no es válida.
*/
public
DTOLoginRespuesta
modificarUsuarioDesdeToken
(
String
token
,
String
nuevoEmail
,
String
nuevoNombreUsuario
,
String
nuevaContrasenia
,
String
contraseniaActual
)
{
String
emailActual
=
jwtUtil
.
extractUsername
(
token
.
replace
(
"Bearer "
,
""
));
return
modificarUsuario
(
emailActual
,
nuevoEmail
,
nuevoNombreUsuario
,
nuevaContrasenia
,
contraseniaActual
);
}
/**
* @brief Actualiza la descripción y/o la foto de perfil de un usuario.
* @param id ID del usuario que desea actualizar su perfil.
* @param nuevaDescripcion Nueva descripción textual para el perfil del usuario.
* @param fotoBase64 Imagen en formato base64 para la nueva foto de perfil (puede ser null o vacía si no se actualiza).
* @throws UsuarioNoExiste Si el usuario no se encuentra registrado en el sistema.
*/
public
void
actualizarPerfil
(
Long
id
,
String
nuevaDescripcion
,
String
fotoBase64
)
{
Usuario
usuario
=
repositorioUsuario
.
findById
(
id
)
.
orElseThrow
(
UsuarioNoExiste:
:
new
);
...
...
@@ -205,6 +234,11 @@ public class ServicioUsuarios {
repositorioUsuario
.
actualizar
(
usuario
);
}
/**
* @brief Busca una lista de usuarios cuyo nombre de usuario contenga una subcadena dada.
* @param filtro Cadena parcial a buscar dentro del nombre de usuario.
* @return Lista de usuarios cuyo nombre coincide parcial o totalmente con el filtro.
*/
public
List
<
Usuario
>
buscarPorNombre
(
String
filtro
)
{
return
repositorioUsuario
.
buscarPorNombreParcial
(
filtro
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment