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
98238240
authored
Mar 09, 2025
by
Rubén Ramírez
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
feat: [Capitulo]: Añadidos métodos para obtener y trabajar con capítulos
parent
1f435592
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
118 additions
and
20 deletions
src/main/java/com/ujaen/tfg/mangaffinity/entidades/Recurso.java
src/main/java/com/ujaen/tfg/mangaffinity/repositorios/RepositorioRecurso.java
src/main/java/com/ujaen/tfg/mangaffinity/rest/RecursosController.java
src/main/java/com/ujaen/tfg/mangaffinity/seguridad/ServicioSeguridad.java
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioRecursos.java
src/main/java/com/ujaen/tfg/mangaffinity/entidades/Recurso.java
View file @
98238240
...
...
@@ -49,9 +49,11 @@ public class Recurso {
private
Set
<
Genero
>
generos
=
new
HashSet
<>();
// Relación con Capítulo; un recurso tiene varios capítulos
@OneToMany
(
mappedBy
=
"recurso"
)
private
List
<
Capitulo
>
capitulos
=
new
ArrayList
<>();
@OneToMany
(
mappedBy
=
"recurso"
,
cascade
=
CascadeType
.
ALL
,
orphanRemoval
=
true
)
private
List
<
Capitulo
>
capitulosManga
=
new
ArrayList
<>();
@OneToMany
(
mappedBy
=
"recurso"
,
cascade
=
CascadeType
.
ALL
,
orphanRemoval
=
true
)
private
List
<
Capitulo
>
capitulosAnime
=
new
ArrayList
<>();
public
Recurso
(
String
titulo
,
String
descripcion
,
LocalDate
fechaPublicacion
,
String
autor
,
String
fotoUrl
)
{
this
.
titulo
=
titulo
;
...
...
src/main/java/com/ujaen/tfg/mangaffinity/repositorios/RepositorioRecurso.java
View file @
98238240
...
...
@@ -70,6 +70,9 @@ public class RepositorioRecurso {
@Transactional
public
void
borrarRecurso
(
Recurso
recurso
)
{
recurso
=
em
.
merge
(
recurso
);
recurso
.
getCapitulosManga
().
clear
();
recurso
.
getCapitulosAnime
().
clear
();
em
.
flush
();
em
.
remove
(
recurso
);
}
...
...
@@ -80,8 +83,6 @@ public class RepositorioRecurso {
@Transactional
(
readOnly
=
true
)
public
List
<
Recurso
>
listarRecursos
()
{
return
em
.
createQuery
(
"SELECT r FROM Recurso r"
,
Recurso
.
class
)
.
setMaxResults
(
15
)
.
getResultList
();
return
em
.
createQuery
(
"SELECT r FROM Recurso r"
,
Recurso
.
class
).
getResultList
();
}
}
\ No newline at end of file
src/main/java/com/ujaen/tfg/mangaffinity/rest/RecursosController.java
View file @
98238240
This diff is collapsed.
Click to expand it.
src/main/java/com/ujaen/tfg/mangaffinity/seguridad/ServicioSeguridad.java
View file @
98238240
...
...
@@ -47,6 +47,7 @@ public class ServicioSeguridad {
.
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"
)
...
...
@@ -58,7 +59,10 @@ public class ServicioSeguridad {
.
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
()
.
anyRequest
().
authenticated
()
// Todo lo demás requiere autenticación
.
requestMatchers
(
HttpMethod
.
GET
,
"/recursos/{recursoId}/capitulos/{capituloId}"
).
permitAll
()
.
requestMatchers
(
HttpMethod
.
PUT
,
"/recursos/{recursoId}/capitulos/{capituloId}"
).
hasAuthority
(
"ROLE_ADMIN"
)
.
anyRequest
().
authenticated
()
)
.
addFilterBefore
(
new
JwtFilter
(
jwtUtil
),
UsernamePasswordAuthenticationFilter
.
class
)
// Usar solo JWT
.
build
();
...
...
src/main/java/com/ujaen/tfg/mangaffinity/servicios/ServicioRecursos.java
View file @
98238240
package
com
.
ujaen
.
tfg
.
mangaffinity
.
servicios
;
import
com.ujaen.tfg.mangaffinity.entidades.Capitulo
;
import
com.ujaen.tfg.mangaffinity.entidades.FuenteCapitulo
;
import
com.ujaen.tfg.mangaffinity.entidades.Genero
;
import
com.ujaen.tfg.mangaffinity.entidades.Recurso
;
import
com.ujaen.tfg.mangaffinity.entidades.*
;
import
com.ujaen.tfg.mangaffinity.excepciones.CapituloNoExiste
;
import
com.ujaen.tfg.mangaffinity.excepciones.RecursoNoExiste
;
import
com.ujaen.tfg.mangaffinity.repositorios.RepositorioCapitulo
;
import
com.ujaen.tfg.mangaffinity.repositorios.RepositorioRecurso
;
...
...
@@ -15,7 +13,11 @@ import org.springframework.transaction.annotation.Transactional;
import
java.time.LocalDate
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
@Service
public
class
ServicioRecursos
{
@Autowired
...
...
@@ -100,32 +102,120 @@ public class ServicioRecursos {
if
(
recurso
==
null
)
{
throw
new
RecursoNoExiste
();
}
List
<
Capitulo
>
capitulos
=
repositorioCapitulo
.
obtenerCapitulosRecurso
(
recursoId
);
if
(
capitulos
.
size
()
<
4
)
{
repositorioCapitulo
.
crearCapitulo
(
nuevoCapitulo
);
List
<
Capitulo
>
listaCapitulos
=
(
nuevoCapitulo
.
getTipo
()
==
TipoRecurso
.
MANGA
)
?
recurso
.
getCapitulosManga
()
:
recurso
.
getCapitulosAnime
();
// Asociar fuentes al capítulo
for
(
FuenteCapitulo
fuente
:
nuevoCapitulo
.
getFuentes
())
{
fuente
.
setCapitulo
(
nuevoCapitulo
);
}
if
(
listaCapitulos
.
size
()
<
4
)
{
listaCapitulos
.
add
(
nuevoCapitulo
);
}
else
{
Capitulo
penultimo
=
capitulos
.
get
(
2
);
Capitulo
ultimo
=
capitulos
.
get
(
3
);
Capitulo
penultimo
=
listaCapitulos
.
get
(
2
);
Capitulo
ultimo
=
listaCapitulos
.
get
(
3
);
List
<
FuenteCapitulo
>
nuevasFuentes
=
new
ArrayList
<>();
for
(
FuenteCapitulo
fuente
:
ultimo
.
getFuentes
())
{
nuevasFuentes
.
add
(
new
FuenteCapitulo
(
fuente
.
getNombreFuente
(),
fuente
.
getUrlFuente
()));
FuenteCapitulo
nuevaFuente
=
new
FuenteCapitulo
(
null
,
fuente
.
getNombreFuente
(),
fuente
.
getUrlFuente
(),
penultimo
);
nuevasFuentes
.
add
(
nuevaFuente
);
}
penultimo
.
setNumero
(
ultimo
.
getNumero
());
penultimo
.
setTitulo
(
ultimo
.
getTitulo
());
penultimo
.
setTipo
(
ultimo
.
getTipo
());
penultimo
.
setFuentes
(
nuevasFuentes
);
repositorioCapitulo
.
borrarCapitulo
(
ultimo
);
repositorioCapitulo
.
actualizarCapitulo
(
pen
ultimo
);
repositorioCapitulo
.
crearCapitulo
(
nuevoCapitulo
);
listaCapitulos
.
remove
(
ultimo
);
listaCapitulos
.
add
(
nuevoCapitulo
);
}
repositorioRecurso
.
merge
(
recurso
);
}
@Transactional
public
List
<
Capitulo
>
obtenerCapitulosDeRecurso
(
Long
recursoId
)
{
List
<
Capitulo
>
capitulos
=
repositorioCapitulo
.
obtenerCapitulosRecurso
(
recursoId
);
capitulos
.
forEach
(
capitulo
->
capitulo
.
getFuentes
().
size
());
return
capitulos
;
}
public
List
<
String
>
obtenerGeneros
()
{
return
Arrays
.
stream
(
Genero
.
values
())
.
map
(
Enum:
:
name
)
.
collect
(
Collectors
.
toList
());
}
@Transactional
public
void
modificarCapitulo
(
Capitulo
capituloModificado
)
{
Capitulo
capitulo
=
repositorioCapitulo
.
buscarPorId
(
capituloModificado
.
getId
());
if
(
capitulo
==
null
)
{
throw
new
CapituloNoExiste
();
}
// Asegurar que el capítulo pertenece a un recurso antes de modificarlo
if
(
capitulo
.
getRecurso
()
==
null
)
{
throw
new
IllegalStateException
(
"El capítulo no está asociado a ningún recurso."
);
}
// Modificar solo si los valores no son nulos o inválidos
if
(
capituloModificado
.
getNumero
()
>
0
)
{
capitulo
.
setNumero
(
capituloModificado
.
getNumero
());
}
if
(
capituloModificado
.
getTitulo
()
!=
null
&&
!
capituloModificado
.
getTitulo
().
isBlank
())
{
capitulo
.
setTitulo
(
capituloModificado
.
getTitulo
());
}
if
(
capituloModificado
.
getTipo
()
!=
null
)
{
capitulo
.
setTipo
(
capituloModificado
.
getTipo
());
}
if
(
capituloModificado
.
getFuentes
()
!=
null
)
{
// Crear un mapa con las fuentes existentes para facilitar la comparación
Map
<
Long
,
FuenteCapitulo
>
fuentesExistentes
=
capitulo
.
getFuentes
().
stream
()
.
collect
(
Collectors
.
toMap
(
FuenteCapitulo:
:
getId
,
f
->
f
));
List
<
FuenteCapitulo
>
nuevasFuentes
=
new
ArrayList
<>();
for
(
FuenteCapitulo
fuenteNueva
:
capituloModificado
.
getFuentes
())
{
if
(
fuenteNueva
.
getId
()
!=
null
&&
fuentesExistentes
.
containsKey
(
fuenteNueva
.
getId
()))
{
// Si la fuente ya existe, actualizamos su información
FuenteCapitulo
fuenteExistente
=
fuentesExistentes
.
get
(
fuenteNueva
.
getId
());
fuenteExistente
.
setNombreFuente
(
fuenteNueva
.
getNombreFuente
());
fuenteExistente
.
setUrlFuente
(
fuenteNueva
.
getUrlFuente
());
nuevasFuentes
.
add
(
fuenteExistente
);
}
else
{
// Si la fuente es nueva, la agregamos correctamente
fuenteNueva
.
setCapitulo
(
capitulo
);
nuevasFuentes
.
add
(
fuenteNueva
);
}
}
// Remover las fuentes que no están en la nueva lista
capitulo
.
getFuentes
().
clear
();
capitulo
.
getFuentes
().
addAll
(
nuevasFuentes
);
}
repositorioCapitulo
.
actualizarCapitulo
(
capitulo
);
}
@Transactional
(
readOnly
=
true
)
public
Capitulo
buscarCapituloPorId
(
Long
id
)
{
Capitulo
capitulo
=
repositorioCapitulo
.
buscarPorId
(
id
);
if
(
capitulo
==
null
)
{
throw
new
CapituloNoExiste
();
}
return
capitulo
;
}
}
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