fix(igdb): search only games a user can own and play
Build, Test & Push Core Service / quality-check (push) Failing after 49s
Build, Test & Push Core Service / docker (push) Skipped

The search listed DLC and e-Reader levels, and the limit of
10 pushed the main games out. Keep main games, standalone
expansions, seasons, remakes, remasters, expanded games and
ports, and show 20 hits.
This commit is contained in:
lobo committed 2026-09-25 15:24:05 +02:00
1 parent 4d50863cb8
commit e1d837bc78
2 files changed
+6 -3

No files matched your search

@@ -49,7 +49,10 @@ public class IgdbApiService {
*/ */
public record Game(long igdbId, String name, Integer year, String imageUrl, List<String> platforms, Long steamAppid) {} public record Game(long igdbId, String name, Integer year, String imageUrl, List<String> platforms, Long steamAppid) {}
private static final int SEARCH_LIMIT = 10; private static final int SEARCH_LIMIT = 20;
// IGDB game types a user can own and play on their own: main game, standalone expansion, season, remake,
// remaster, expanded game, port. Leaves out DLC, bundles, mods, episodes, packs and updates.
private static final String PLAYABLE_GAME_TYPES = "(0,4,7,8,9,10,11)";
private static final String GAME_FIELDS = "fields name,first_release_date,cover.image_id,artworks.image_id," private static final String GAME_FIELDS = "fields name,first_release_date,cover.image_id,artworks.image_id,"
+ "screenshots.image_id,platforms.name,platforms.abbreviation,external_games.external_game_source," + "screenshots.image_id,platforms.name,platforms.abbreviation,external_games.external_game_source,"
+ "external_games.uid;"; + "external_games.uid;";
@@ -118,7 +121,7 @@ public class IgdbApiService {
} }
try { try {
IgdbResponses.Game[] games = query("/games", "search \"" + searchText(query) + "\"; " + GAME_FIELDS IgdbResponses.Game[] games = query("/games", "search \"" + searchText(query) + "\"; " + GAME_FIELDS
+ " where version_parent = null; limit " + SEARCH_LIMIT + ";", IgdbResponses.Game[].class); + " where version_parent = null & game_type = " + PLAYABLE_GAME_TYPES + "; limit " + SEARCH_LIMIT + ";", IgdbResponses.Game[].class);
return Optional.of(Arrays.stream(games).map(IgdbApiService::toGame).flatMap(Optional::stream).toList()); return Optional.of(Arrays.stream(games).map(IgdbApiService::toGame).flatMap(Optional::stream).toList());
} catch (Exception e) { } catch (Exception e) {
log.error("Error searching IGDB games", e); log.error("Error searching IGDB games", e);
@@ -194,7 +194,7 @@ class IgdbApiServiceTest extends AbstractUnitTest {
expectToken(); expectToken();
igdb.expect(requestTo(containsString("/games"))) igdb.expect(requestTo(containsString("/games")))
.andExpect(content().string(allOf(containsString("search \"zelda\";"), containsString("version_parent = null"), .andExpect(content().string(allOf(containsString("search \"zelda\";"), containsString("version_parent = null"),
containsString("limit 10")))) containsString("game_type = (0,4,7,8,9,10,11)"), containsString("limit 20"))))
.andRespond(withSuccess(ZELDA, MediaType.APPLICATION_JSON)); .andRespond(withSuccess(ZELDA, MediaType.APPLICATION_JSON));
List<IgdbApiService.Game> games = service.searchGames(" zelda ").orElseThrow(); List<IgdbApiService.Game> games = service.searchGames(" zelda ").orElseThrow();