Skip to content
This repository was archived by the owner on May 21, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/main/java/com/espacogeek/geek/batch/MovieItemWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,13 @@ public void write(List<? extends MediaModel> items) {

// fetch and persist alternative titles using the external API id (if present)
try {
String externalId = original.getExternalReference().get(0).getReference();
String externalId = original.getExternalReference().iterator().next().getReference();
if (externalId != null) {
var alts = movieApi.getAlternativeTitles(Integer.valueOf(externalId));
if (alts != null && !alts.isEmpty()) {
alts.forEach(a -> a.setMedia(persisted));
alternativeTitlesService.saveAll(alts);
persisted.setAlternativeTitles(alts);
persisted.setAlternativeTitles(new java.util.LinkedHashSet<>(alts));
}
}
} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public MediaModel process(JSONObject json) {
externalReference.setTypeReference(typeReference);
externalReference.setReference(idStr);

List<ExternalReferenceModel> refs = new ArrayList<>();
java.util.LinkedHashSet<ExternalReferenceModel> refs = new java.util.LinkedHashSet<>();
refs.add(externalReference);
media.setExternalReference(refs);

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/espacogeek/geek/batch/SerieItemWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,15 @@ public void write(List<? extends MediaModel> items) {
}

try {
String externalId = original.getExternalReference().get(0).getReference();
String externalId = original.getExternalReference().iterator().next().getReference();
if (externalId != null) {
List<AlternativeTitleModel> alts = tvSeriesApi.getAlternativeTitles(Integer.valueOf(externalId));
if (alts != null && !alts.isEmpty()) {
for (AlternativeTitleModel alternativeTitleModel : alts) {
alternativeTitleModel.setMedia(persisted);
}
alternativeTitlesService.saveAll(alts);
persisted.setAlternativeTitles(alts);
persisted.setAlternativeTitles(new java.util.LinkedHashSet<>(alts));
}
}
} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public MediaModel process(JSONObject json) {
externalReference.setTypeReference(typeReference);
externalReference.setReference(idStr);

List<ExternalReferenceModel> refs = new ArrayList<>();
java.util.LinkedHashSet<ExternalReferenceModel> refs = new java.util.LinkedHashSet<>();
refs.add(externalReference);
media.setExternalReference(refs);

Expand Down
3 changes: 1 addition & 2 deletions src/main/java/com/espacogeek/geek/config/JwtConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,7 @@ private List<String> buildRolesList(UserModel user) {
if (raw != null && !raw.isBlank()) {
String[] parts = raw.replaceAll("\\s", "").split(",");
rolesList.addAll(Arrays.stream(parts)
.map(s -> s == null ? null : s.trim())
.filter(s -> s != null && !s.isBlank())
.filter(s -> !s.isBlank())
.map(s -> {
if (s.startsWith("ROLE_") || s.startsWith("ID_")) return s;
return "ROLE_" + s;
Expand Down
165 changes: 158 additions & 7 deletions src/main/java/com/espacogeek/geek/controllers/MediaController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,40 @@

import lombok.RequiredArgsConstructor;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.BatchMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;

import com.espacogeek.geek.models.AlternativeTitleModel;
import com.espacogeek.geek.models.CompanyModel;
import com.espacogeek.geek.models.ExternalReferenceModel;
import com.espacogeek.geek.models.GenreModel;
import com.espacogeek.geek.models.MediaModel;
import com.espacogeek.geek.models.PeopleModel;
import com.espacogeek.geek.models.SeasonModel;
import com.espacogeek.geek.repositories.AlternativeTitlesRepository;
import com.espacogeek.geek.repositories.ExternalReferenceRepository;
import com.espacogeek.geek.repositories.MediaRepository;
import com.espacogeek.geek.repositories.SeasonRepository;
import com.espacogeek.geek.services.MediaService;
import com.espacogeek.geek.types.MediaPage;
import com.espacogeek.geek.utils.MediaUtils;
import com.espacogeek.geek.exception.GenericException;

import graphql.schema.DataFetchingEnvironment;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Controller
@RequiredArgsConstructor
public class MediaController {
private final MediaService mediaService;
private final SeasonRepository seasonRepository;
private final AlternativeTitlesRepository alternativeTitlesRepository;
private final ExternalReferenceRepository externalReferenceRepository;
private final MediaRepository mediaRepository;

/**
* Finds a MediaModel object by its ID.
Expand All @@ -43,7 +62,7 @@ public MediaModel getMediaById(@Argument(name = "id") Integer id) {
public MediaPage getMovie(@Argument(name = "id") Integer id, @Argument(name = "name") String name, DataFetchingEnvironment dataFetchingEnvironment) {
name = name == null ? null : name.trim();

if (name == null && id == null || name == "" && id == null) {
if (id == null && (name == null || name.isEmpty())) {
return new MediaPage();
}

Expand All @@ -62,7 +81,7 @@ public MediaPage getMovie(@Argument(name = "id") Integer id, @Argument(name = "n
public MediaPage getSerie(@Argument(name = "id") Integer id, @Argument(name = "name") String name, DataFetchingEnvironment dataFetchingEnvironment) {
name = name == null ? null : name.trim();

if (name == null && id == null || name == "" && id == null) {
if (id == null && (name == null || name.isEmpty())) {
return new MediaPage();
}

Expand All @@ -81,7 +100,7 @@ public MediaPage getSerie(@Argument(name = "id") Integer id, @Argument(name = "n
public MediaPage getGame(@Argument(name = "id") Integer id, @Argument(name = "name") String name, DataFetchingEnvironment dataFetchingEnvironment) {
name = name == null ? null : name.trim();

if (name == null && id == null || name == "" && id == null) {
if (id == null && (name == null || name.isEmpty())) {
return new MediaPage();
}

Expand All @@ -98,11 +117,10 @@ public MediaPage getGame(@Argument(name = "id") Integer id, @Argument(name = "na
*/
@QueryMapping(name = "vn")
public MediaPage getVisualNovel(@Argument(name = "id") Integer id, @Argument(name = "name") String name, DataFetchingEnvironment dataFetchingEnvironment) {
MediaPage response = new MediaPage();
name = name == null ? null : name.trim();

if (name == null && id == null || name == "" && id == null) {
return response;
if (id == null && (name == null || name.isEmpty())) {
return new MediaPage();
}

return this.mediaService.findVisualNovelByIdOrName(id, name, MediaUtils.getPageable(dataFetchingEnvironment));
Expand All @@ -119,10 +137,143 @@ public MediaPage getVisualNovel(@Argument(name = "id") Integer id, @Argument(nam
public MediaPage getAnime(@Argument(name = "id") Integer id, @Argument(name = "name") String name, DataFetchingEnvironment dataFetchingEnvironment) {
name = name == null ? null : name.trim();

if (name == null && id == null || name == "" && id == null) {
if (id == null && (name == null || name.isEmpty())) {
return new MediaPage();
}

return this.mediaService.findAnimeByIdOrName(id, name, MediaUtils.getPageable(dataFetchingEnvironment));
}

/**
* Batch-loads seasons for a list of MediaModel sources, resolving the N+1 problem.
*/
@BatchMapping
public Map<MediaModel, Set<SeasonModel>> season(List<MediaModel> medias) {
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
sourceById.putIfAbsent(m.getId(), m);
}
Map<MediaModel, Set<SeasonModel>> result = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
result.putIfAbsent(m, new HashSet<>());
}
for (SeasonModel season : seasonRepository.findByMediaIn(medias)) {
MediaModel source = sourceById.get(season.getMedia().getId());
if (source != null) {
result.get(source).add(season);
}
}
return result;
}

/**
* Batch-loads genres for a list of MediaModel sources, resolving the N+1 problem.
*/
@BatchMapping
public Map<MediaModel, Set<GenreModel>> genre(List<MediaModel> medias) {
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
sourceById.putIfAbsent(m.getId(), m);
}
Map<MediaModel, Set<GenreModel>> result = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
result.putIfAbsent(m, new HashSet<>());
}
for (MediaModel loaded : mediaRepository.findAllWithGenreByMediaIn(medias)) {
MediaModel source = sourceById.get(loaded.getId());
if (source != null && loaded.getGenre() != null) {
result.put(source, loaded.getGenre());
}
}
return result;
}

/**
* Batch-loads companies for a list of MediaModel sources, resolving the N+1 problem.
*/
@BatchMapping
public Map<MediaModel, Set<CompanyModel>> company(List<MediaModel> medias) {
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
sourceById.putIfAbsent(m.getId(), m);
}
Map<MediaModel, Set<CompanyModel>> result = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
result.putIfAbsent(m, new HashSet<>());
}
for (MediaModel loaded : mediaRepository.findAllWithCompanyByMediaIn(medias)) {
MediaModel source = sourceById.get(loaded.getId());
if (source != null && loaded.getCompany() != null) {
result.put(source, loaded.getCompany());
}
}
return result;
}

/**
* Batch-loads people for a list of MediaModel sources, resolving the N+1 problem.
*/
@BatchMapping
public Map<MediaModel, Set<PeopleModel>> people(List<MediaModel> medias) {
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
sourceById.putIfAbsent(m.getId(), m);
}
Map<MediaModel, Set<PeopleModel>> result = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
result.putIfAbsent(m, new HashSet<>());
}
for (MediaModel loaded : mediaRepository.findAllWithPeopleByMediaIn(medias)) {
MediaModel source = sourceById.get(loaded.getId());
if (source != null && loaded.getPeople() != null) {
result.put(source, loaded.getPeople());
}
}
return result;
}

/**
* Batch-loads external references for a list of MediaModel sources, resolving the N+1 problem.
*/
@BatchMapping
public Map<MediaModel, Set<ExternalReferenceModel>> externalReference(List<MediaModel> medias) {
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
sourceById.putIfAbsent(m.getId(), m);
}
Map<MediaModel, Set<ExternalReferenceModel>> result = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
result.putIfAbsent(m, new HashSet<>());
}
List<ExternalReferenceModel> refs = externalReferenceRepository.findAllByMediaIn(medias);
for (ExternalReferenceModel ref : refs) {
MediaModel source = sourceById.get(ref.getMedia().getId());
if (source != null) {
result.get(source).add(ref);
}
}
return result;
}

/**
* Batch-loads alternative titles for a list of MediaModel sources, resolving the N+1 problem.
*/
@BatchMapping
public Map<MediaModel, Set<AlternativeTitleModel>> alternativeTitles(List<MediaModel> medias) {
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
sourceById.putIfAbsent(m.getId(), m);
}
Map<MediaModel, Set<AlternativeTitleModel>> result = new java.util.LinkedHashMap<>();
for (MediaModel m : medias) {
result.putIfAbsent(m, new HashSet<>());
}
for (AlternativeTitleModel alt : alternativeTitlesRepository.findByMediaIn(medias)) {
MediaModel source = sourceById.get(alt.getMedia().getId());
if (source != null) {
result.get(source).add(alt);
}
}
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ public String editPasswordUserLogged(Authentication authentication, @Argument(na

Integer userId = UserUtils.getUserID(authentication);

UserModel userLogged = userService.findById(Integer.valueOf(userId)).get();
UserModel userLogged = userService.findById(userId).orElseThrow(() -> new GenericException(HttpStatus.NOT_FOUND.toString()));
boolean resultPassword = BCrypt.verifyer().verify(actualPassword.toCharArray(), userLogged.getPassword()).verified;

if (resultPassword) {
Expand All @@ -205,11 +205,11 @@ public String deleteUserLogged(Authentication authentication, @Argument(name = "

Integer userId = UserUtils.getUserID(authentication);

UserModel userLogged = userService.findById(userId).get();
UserModel userLogged = userService.findById(userId).orElseThrow(() -> new GenericException(HttpStatus.NOT_FOUND.toString()));
boolean resultPassword = BCrypt.verifyer().verify(password.toCharArray(), userLogged.getPassword()).verified;

if (resultPassword) {
userService.deleteById(Integer.valueOf(userId));
userService.deleteById(userId);
return HttpStatus.OK.toString();
}

Expand All @@ -222,7 +222,7 @@ public String editUsernameUserLogged(Authentication authentication, @Argument(na

Integer userId = UserUtils.getUserID(authentication);

UserModel userLogged = userService.findById(userId).get();
UserModel userLogged = userService.findById(userId).orElseThrow(() -> new GenericException(HttpStatus.NOT_FOUND.toString()));
boolean resultPassword = BCrypt.verifyer().verify(password.toCharArray(), userLogged.getPassword()).verified;

if (resultPassword) {
Expand All @@ -240,7 +240,7 @@ public String editEmailUserLogged(Authentication authentication, @Argument(name

Integer userId = UserUtils.getUserID(authentication);

UserModel userLogged = userService.findById(userId).get();
UserModel userLogged = userService.findById(userId).orElseThrow(() -> new GenericException(HttpStatus.NOT_FOUND.toString()));
boolean resultPassword = BCrypt.verifyer().verify(password.toCharArray(), userLogged.getPassword()).verified;

if (resultPassword) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public MediaModel getDetails(Integer id) {
genresName.add(genre.getName());
});

media.setGenre(genreService.findAllByNames(genresName));
media.setGenre(new java.util.LinkedHashSet<>(genreService.findAllByNames(genresName)));
media.setAbout(result.getSummary());
media.setName(result.getName());

Expand All @@ -112,8 +112,8 @@ public MediaModel getDetails(Integer id) {
for (proto.AlternativeName title : result.getAlternativeNamesList()) {
if (!title.getName().isEmpty()) alternativeTitles.add(new AlternativeTitleModel(null, title.getName(), media));
}
media.setAlternativeTitles(alternativeTitles);
media.setExternalReference(new ArrayList<>(List.of(reference)));
media.setAlternativeTitles(new java.util.LinkedHashSet<>(alternativeTitles));
media.setExternalReference(new java.util.LinkedHashSet<>(List.of(reference)));
media.setMediaCategory(category);
}
}
Expand Down Expand Up @@ -154,8 +154,8 @@ public List<MediaModel> doSearch(String search, MediaCategoryModel mediaCategory
for (proto.AlternativeName title : result.getGame().getAlternativeNamesList()) {
if (!title.getName().isEmpty()) alternativeTitles.add(new AlternativeTitleModel(null, title.getName(), media));
}
media.setAlternativeTitles(alternativeTitles);
media.setExternalReference(new ArrayList<>(List.of(reference)));
media.setAlternativeTitles(new java.util.LinkedHashSet<>(alternativeTitles));
media.setExternalReference(new java.util.LinkedHashSet<>(List.of(reference)));

media.setMediaCategory(category);

Expand Down
Loading