Skip to content
This repository was archived by the owner on May 21, 2026. It is now read-only.

Commit 0a924de

Browse files
Copilotvitorhugo-javaCopilot
authored
Fix 43 Qodana static analysis warnings across 14 files (#59)
* Initial plan * Refactor MediaModel: fix equals bug, List->Set, remove SUBSELECT, add BatchMapping Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com> * Address code review: descriptive exception message, remove unnecessary cast Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com> * Update src/main/java/com/espacogeek/geek/controllers/MediaController.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix duplicate key crash in @BatchMapping methods by using loop-based map building Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com> * Fix NPE in updateGenres/updateSeason; remove unused generic from ExternalReferenceRepository Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com> * Fix all 43 Qodana static analysis warnings Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com> * Update src/test/java/com/espacogeek/geek/query/media/AnimeQueryTest.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/main/java/com/espacogeek/geek/data/impl/GenericMediaDataControllerImpl.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/test/java/com/espacogeek/geek/cors/BrowserCorsRequestTest.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Address PR review: fix assert in QuoteApiImpl, orElseGet(null) in TvSeriesApiImpl, searchMedia empty-collection guard, remove redundant @SuppressWarnings Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com> * Fix conflict: restore if-guard in searchMedia empty-collection check Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com> Co-authored-by: Vitor Hugo <vitorhugoalvesferreira@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 779cd33 commit 0a924de

36 files changed

Lines changed: 456 additions & 154 deletions

src/main/java/com/espacogeek/geek/batch/MovieItemWriter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,13 @@ public void write(List<? extends MediaModel> items) {
7575

7676
// fetch and persist alternative titles using the external API id (if present)
7777
try {
78-
String externalId = original.getExternalReference().get(0).getReference();
78+
String externalId = original.getExternalReference().iterator().next().getReference();
7979
if (externalId != null) {
8080
var alts = movieApi.getAlternativeTitles(Integer.valueOf(externalId));
8181
if (alts != null && !alts.isEmpty()) {
8282
alts.forEach(a -> a.setMedia(persisted));
8383
alternativeTitlesService.saveAll(alts);
84-
persisted.setAlternativeTitles(alts);
84+
persisted.setAlternativeTitles(new java.util.LinkedHashSet<>(alts));
8585
}
8686
}
8787
} catch (Exception e) {

src/main/java/com/espacogeek/geek/batch/MovieProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public MediaModel process(JSONObject json) {
8787
externalReference.setTypeReference(typeReference);
8888
externalReference.setReference(idStr);
8989

90-
List<ExternalReferenceModel> refs = new ArrayList<>();
90+
java.util.LinkedHashSet<ExternalReferenceModel> refs = new java.util.LinkedHashSet<>();
9191
refs.add(externalReference);
9292
media.setExternalReference(refs);
9393

src/main/java/com/espacogeek/geek/batch/SerieItemWriter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,15 @@ public void write(List<? extends MediaModel> items) {
7575
}
7676

7777
try {
78-
String externalId = original.getExternalReference().get(0).getReference();
78+
String externalId = original.getExternalReference().iterator().next().getReference();
7979
if (externalId != null) {
8080
List<AlternativeTitleModel> alts = tvSeriesApi.getAlternativeTitles(Integer.valueOf(externalId));
8181
if (alts != null && !alts.isEmpty()) {
8282
for (AlternativeTitleModel alternativeTitleModel : alts) {
8383
alternativeTitleModel.setMedia(persisted);
8484
}
8585
alternativeTitlesService.saveAll(alts);
86-
persisted.setAlternativeTitles(alts);
86+
persisted.setAlternativeTitles(new java.util.LinkedHashSet<>(alts));
8787
}
8888
}
8989
} catch (Exception e) {

src/main/java/com/espacogeek/geek/batch/SerieProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public MediaModel process(JSONObject json) {
8787
externalReference.setTypeReference(typeReference);
8888
externalReference.setReference(idStr);
8989

90-
List<ExternalReferenceModel> refs = new ArrayList<>();
90+
java.util.LinkedHashSet<ExternalReferenceModel> refs = new java.util.LinkedHashSet<>();
9191
refs.add(externalReference);
9292
media.setExternalReference(refs);
9393

src/main/java/com/espacogeek/geek/config/JwtConfig.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ private List<String> buildRolesList(UserModel user) {
7979
if (raw != null && !raw.isBlank()) {
8080
String[] parts = raw.replaceAll("\\s", "").split(",");
8181
rolesList.addAll(Arrays.stream(parts)
82-
.map(s -> s == null ? null : s.trim())
83-
.filter(s -> s != null && !s.isBlank())
82+
.filter(s -> !s.isBlank())
8483
.map(s -> {
8584
if (s.startsWith("ROLE_") || s.startsWith("ID_")) return s;
8685
return "ROLE_" + s;

src/main/java/com/espacogeek/geek/controllers/MediaController.java

Lines changed: 158 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,40 @@
22

33
import lombok.RequiredArgsConstructor;
44
import org.springframework.graphql.data.method.annotation.Argument;
5+
import org.springframework.graphql.data.method.annotation.BatchMapping;
56
import org.springframework.graphql.data.method.annotation.QueryMapping;
67
import org.springframework.stereotype.Controller;
78

9+
import com.espacogeek.geek.models.AlternativeTitleModel;
10+
import com.espacogeek.geek.models.CompanyModel;
11+
import com.espacogeek.geek.models.ExternalReferenceModel;
12+
import com.espacogeek.geek.models.GenreModel;
813
import com.espacogeek.geek.models.MediaModel;
14+
import com.espacogeek.geek.models.PeopleModel;
15+
import com.espacogeek.geek.models.SeasonModel;
16+
import com.espacogeek.geek.repositories.AlternativeTitlesRepository;
17+
import com.espacogeek.geek.repositories.ExternalReferenceRepository;
18+
import com.espacogeek.geek.repositories.MediaRepository;
19+
import com.espacogeek.geek.repositories.SeasonRepository;
920
import com.espacogeek.geek.services.MediaService;
1021
import com.espacogeek.geek.types.MediaPage;
1122
import com.espacogeek.geek.utils.MediaUtils;
1223
import com.espacogeek.geek.exception.GenericException;
1324

1425
import graphql.schema.DataFetchingEnvironment;
1526

27+
import java.util.HashSet;
28+
import java.util.List;
29+
import java.util.Map;
30+
import java.util.Set;
1631
@Controller
1732
@RequiredArgsConstructor
1833
public class MediaController {
1934
private final MediaService mediaService;
35+
private final SeasonRepository seasonRepository;
36+
private final AlternativeTitlesRepository alternativeTitlesRepository;
37+
private final ExternalReferenceRepository externalReferenceRepository;
38+
private final MediaRepository mediaRepository;
2039

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

46-
if (name == null && id == null || name == "" && id == null) {
65+
if (id == null && (name == null || name.isEmpty())) {
4766
return new MediaPage();
4867
}
4968

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

65-
if (name == null && id == null || name == "" && id == null) {
84+
if (id == null && (name == null || name.isEmpty())) {
6685
return new MediaPage();
6786
}
6887

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

84-
if (name == null && id == null || name == "" && id == null) {
103+
if (id == null && (name == null || name.isEmpty())) {
85104
return new MediaPage();
86105
}
87106

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

104-
if (name == null && id == null || name == "" && id == null) {
105-
return response;
122+
if (id == null && (name == null || name.isEmpty())) {
123+
return new MediaPage();
106124
}
107125

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

122-
if (name == null && id == null || name == "" && id == null) {
140+
if (id == null && (name == null || name.isEmpty())) {
123141
return new MediaPage();
124142
}
125143

126144
return this.mediaService.findAnimeByIdOrName(id, name, MediaUtils.getPageable(dataFetchingEnvironment));
127145
}
146+
147+
/**
148+
* Batch-loads seasons for a list of MediaModel sources, resolving the N+1 problem.
149+
*/
150+
@BatchMapping
151+
public Map<MediaModel, Set<SeasonModel>> season(List<MediaModel> medias) {
152+
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
153+
for (MediaModel m : medias) {
154+
sourceById.putIfAbsent(m.getId(), m);
155+
}
156+
Map<MediaModel, Set<SeasonModel>> result = new java.util.LinkedHashMap<>();
157+
for (MediaModel m : medias) {
158+
result.putIfAbsent(m, new HashSet<>());
159+
}
160+
for (SeasonModel season : seasonRepository.findByMediaIn(medias)) {
161+
MediaModel source = sourceById.get(season.getMedia().getId());
162+
if (source != null) {
163+
result.get(source).add(season);
164+
}
165+
}
166+
return result;
167+
}
168+
169+
/**
170+
* Batch-loads genres for a list of MediaModel sources, resolving the N+1 problem.
171+
*/
172+
@BatchMapping
173+
public Map<MediaModel, Set<GenreModel>> genre(List<MediaModel> medias) {
174+
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
175+
for (MediaModel m : medias) {
176+
sourceById.putIfAbsent(m.getId(), m);
177+
}
178+
Map<MediaModel, Set<GenreModel>> result = new java.util.LinkedHashMap<>();
179+
for (MediaModel m : medias) {
180+
result.putIfAbsent(m, new HashSet<>());
181+
}
182+
for (MediaModel loaded : mediaRepository.findAllWithGenreByMediaIn(medias)) {
183+
MediaModel source = sourceById.get(loaded.getId());
184+
if (source != null && loaded.getGenre() != null) {
185+
result.put(source, loaded.getGenre());
186+
}
187+
}
188+
return result;
189+
}
190+
191+
/**
192+
* Batch-loads companies for a list of MediaModel sources, resolving the N+1 problem.
193+
*/
194+
@BatchMapping
195+
public Map<MediaModel, Set<CompanyModel>> company(List<MediaModel> medias) {
196+
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
197+
for (MediaModel m : medias) {
198+
sourceById.putIfAbsent(m.getId(), m);
199+
}
200+
Map<MediaModel, Set<CompanyModel>> result = new java.util.LinkedHashMap<>();
201+
for (MediaModel m : medias) {
202+
result.putIfAbsent(m, new HashSet<>());
203+
}
204+
for (MediaModel loaded : mediaRepository.findAllWithCompanyByMediaIn(medias)) {
205+
MediaModel source = sourceById.get(loaded.getId());
206+
if (source != null && loaded.getCompany() != null) {
207+
result.put(source, loaded.getCompany());
208+
}
209+
}
210+
return result;
211+
}
212+
213+
/**
214+
* Batch-loads people for a list of MediaModel sources, resolving the N+1 problem.
215+
*/
216+
@BatchMapping
217+
public Map<MediaModel, Set<PeopleModel>> people(List<MediaModel> medias) {
218+
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
219+
for (MediaModel m : medias) {
220+
sourceById.putIfAbsent(m.getId(), m);
221+
}
222+
Map<MediaModel, Set<PeopleModel>> result = new java.util.LinkedHashMap<>();
223+
for (MediaModel m : medias) {
224+
result.putIfAbsent(m, new HashSet<>());
225+
}
226+
for (MediaModel loaded : mediaRepository.findAllWithPeopleByMediaIn(medias)) {
227+
MediaModel source = sourceById.get(loaded.getId());
228+
if (source != null && loaded.getPeople() != null) {
229+
result.put(source, loaded.getPeople());
230+
}
231+
}
232+
return result;
233+
}
234+
235+
/**
236+
* Batch-loads external references for a list of MediaModel sources, resolving the N+1 problem.
237+
*/
238+
@BatchMapping
239+
public Map<MediaModel, Set<ExternalReferenceModel>> externalReference(List<MediaModel> medias) {
240+
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
241+
for (MediaModel m : medias) {
242+
sourceById.putIfAbsent(m.getId(), m);
243+
}
244+
Map<MediaModel, Set<ExternalReferenceModel>> result = new java.util.LinkedHashMap<>();
245+
for (MediaModel m : medias) {
246+
result.putIfAbsent(m, new HashSet<>());
247+
}
248+
List<ExternalReferenceModel> refs = externalReferenceRepository.findAllByMediaIn(medias);
249+
for (ExternalReferenceModel ref : refs) {
250+
MediaModel source = sourceById.get(ref.getMedia().getId());
251+
if (source != null) {
252+
result.get(source).add(ref);
253+
}
254+
}
255+
return result;
256+
}
257+
258+
/**
259+
* Batch-loads alternative titles for a list of MediaModel sources, resolving the N+1 problem.
260+
*/
261+
@BatchMapping
262+
public Map<MediaModel, Set<AlternativeTitleModel>> alternativeTitles(List<MediaModel> medias) {
263+
Map<Integer, MediaModel> sourceById = new java.util.LinkedHashMap<>();
264+
for (MediaModel m : medias) {
265+
sourceById.putIfAbsent(m.getId(), m);
266+
}
267+
Map<MediaModel, Set<AlternativeTitleModel>> result = new java.util.LinkedHashMap<>();
268+
for (MediaModel m : medias) {
269+
result.putIfAbsent(m, new HashSet<>());
270+
}
271+
for (AlternativeTitleModel alt : alternativeTitlesRepository.findByMediaIn(medias)) {
272+
MediaModel source = sourceById.get(alt.getMedia().getId());
273+
if (source != null) {
274+
result.get(source).add(alt);
275+
}
276+
}
277+
return result;
278+
}
128279
}

src/main/java/com/espacogeek/geek/controllers/UserController.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public String editPasswordUserLogged(Authentication authentication, @Argument(na
183183

184184
Integer userId = UserUtils.getUserID(authentication);
185185

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

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

206206
Integer userId = UserUtils.getUserID(authentication);
207207

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

211211
if (resultPassword) {
212-
userService.deleteById(Integer.valueOf(userId));
212+
userService.deleteById(userId);
213213
return HttpStatus.OK.toString();
214214
}
215215

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

223223
Integer userId = UserUtils.getUserID(authentication);
224224

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

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

241241
Integer userId = UserUtils.getUserID(authentication);
242242

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

246246
if (resultPassword) {

src/main/java/com/espacogeek/geek/data/api/impl/GamesAndVNsApiImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public MediaModel getDetails(Integer id) {
9595
genresName.add(genre.getName());
9696
});
9797

98-
media.setGenre(genreService.findAllByNames(genresName));
98+
media.setGenre(new java.util.LinkedHashSet<>(genreService.findAllByNames(genresName)));
9999
media.setAbout(result.getSummary());
100100
media.setName(result.getName());
101101

@@ -112,8 +112,8 @@ public MediaModel getDetails(Integer id) {
112112
for (proto.AlternativeName title : result.getAlternativeNamesList()) {
113113
if (!title.getName().isEmpty()) alternativeTitles.add(new AlternativeTitleModel(null, title.getName(), media));
114114
}
115-
media.setAlternativeTitles(alternativeTitles);
116-
media.setExternalReference(new ArrayList<>(List.of(reference)));
115+
media.setAlternativeTitles(new java.util.LinkedHashSet<>(alternativeTitles));
116+
media.setExternalReference(new java.util.LinkedHashSet<>(List.of(reference)));
117117
media.setMediaCategory(category);
118118
}
119119
}
@@ -154,8 +154,8 @@ public List<MediaModel> doSearch(String search, MediaCategoryModel mediaCategory
154154
for (proto.AlternativeName title : result.getGame().getAlternativeNamesList()) {
155155
if (!title.getName().isEmpty()) alternativeTitles.add(new AlternativeTitleModel(null, title.getName(), media));
156156
}
157-
media.setAlternativeTitles(alternativeTitles);
158-
media.setExternalReference(new ArrayList<>(List.of(reference)));
157+
media.setAlternativeTitles(new java.util.LinkedHashSet<>(alternativeTitles));
158+
media.setExternalReference(new java.util.LinkedHashSet<>(List.of(reference)));
159159

160160
media.setMediaCategory(category);
161161

0 commit comments

Comments
 (0)