Add filter values to roms query

This commit is contained in:
Georges-Antoine Assi
2026-01-15 11:51:59 -05:00
parent 96240a86e9
commit 81b9eff8c7
7 changed files with 122 additions and 15 deletions

View File

@@ -187,6 +187,7 @@ class CustomLimitOffsetParams(LimitOffsetParams):
class CustomLimitOffsetPage[T: BaseModel](LimitOffsetPage[T]):
char_index: dict[str, int]
rom_id_index: list[int]
filter_values: RomFiltersDict
__params_type__ = CustomLimitOffsetParams
@@ -197,6 +198,9 @@ def get_roms(
bool,
Query(description="Whether to get the char index."),
] = True,
with_filter_values: Annotated[
bool, Query(description="Whether to return filter values.")
] = True,
search_term: Annotated[
str | None,
Query(description="Search term to filter roms."),
@@ -461,6 +465,29 @@ def get_roms(
)
char_index_dict = {char: index for (char, index) in char_index}
filter_values = RomFiltersDict(
genres=[],
franchises=[],
companies=[],
game_modes=[],
age_ratings=[],
player_counts=[],
regions=[],
languages=[],
)
if with_filter_values:
query_filters = db_rom_handler.with_filter_values(query=query)
filter_values = RomFiltersDict(
genres=query_filters["genres"],
franchises=query_filters["franchises"],
companies=query_filters["companies"],
game_modes=query_filters["game_modes"],
age_ratings=query_filters["age_ratings"],
player_counts=query_filters["player_counts"],
regions=query_filters["regions"],
languages=query_filters["languages"],
)
# Get all ROM IDs in order for the additional data
with sync_session.begin() as session:
rom_id_index = session.scalars(query.with_only_columns(Rom.id)).all() # type: ignore
@@ -474,6 +501,7 @@ def get_roms(
additional_data={
"char_index": char_index_dict,
"rom_id_index": rom_id_index,
"filter_values": filter_values,
},
)

View File

@@ -1273,3 +1273,58 @@ class DBRomsHandler(DBBaseHandler):
"regions": sorted(regions),
"languages": sorted(languages),
}
@begin_session
def with_filter_values(
self,
query: Query,
session: Session = None, # type: ignore
) -> dict:
ids_subq = query.with_only_columns(Rom.id).scalar_subquery() # type: ignore
statement = (
select(
RomMetadata.genres,
RomMetadata.franchises,
RomMetadata.companies,
RomMetadata.game_modes,
RomMetadata.age_ratings,
RomMetadata.player_count,
Rom.regions,
Rom.languages,
)
.select_from(Rom)
.join(RomMetadata, Rom.id == RomMetadata.rom_id)
.where(Rom.id.in_(ids_subq))
)
genres = set()
franchises = set()
companies = set()
game_modes = set()
age_ratings = set()
player_counts = set()
regions = set()
languages = set()
for row in session.execute(statement):
g, f, c, gm, ar, pc, rg, lg = row
genres.update(g)
franchises.update(f)
companies.update(c)
game_modes.update(gm)
age_ratings.update(ar)
player_counts.update(pc)
regions.update(rg)
languages.update(lg)
return {
"genres": sorted(genres),
"franchises": sorted(franchises),
"companies": sorted(companies),
"game_modes": sorted(game_modes),
"age_ratings": sorted(age_ratings),
"player_counts": sorted(player_counts),
"regions": sorted(regions),
"languages": sorted(languages),
}

View File

@@ -2,6 +2,7 @@
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { RomFiltersDict } from './RomFiltersDict';
import type { SimpleRomSchema } from './SimpleRomSchema';
export type CustomLimitOffsetPage_SimpleRomSchema_ = {
items: Array<SimpleRomSchema>;
@@ -10,5 +11,6 @@ export type CustomLimitOffsetPage_SimpleRomSchema_ = {
offset: number;
char_index: Record<string, number>;
rom_id_index: Array<number>;
filter_values: RomFiltersDict;
};

View File

@@ -268,17 +268,16 @@ function resetFilters() {
}
async function fetchSearchFilters() {
const { data } = await romApi.getRomFilters();
galleryFilterStore.setFilterPlatforms([]);
galleryFilterStore.setFilterGenres(data.genres);
galleryFilterStore.setFilterFranchises(data.franchises);
galleryFilterStore.setFilterCompanies(data.companies);
galleryFilterStore.setFilterCollections([]);
galleryFilterStore.setFilterAgeRatings(data.age_ratings);
galleryFilterStore.setFilterRegions(data.regions);
galleryFilterStore.setFilterLanguages(data.languages);
galleryFilterStore.setFilterPlayerCounts(data.player_counts);
// const { data } = await romApi.getRomFilters();
// galleryFilterStore.setFilterPlatforms([]);
// galleryFilterStore.setFilterGenres(data.genres);
// galleryFilterStore.setFilterFranchises(data.franchises);
// galleryFilterStore.setFilterCompanies(data.companies);
// galleryFilterStore.setFilterCollections([]);
// galleryFilterStore.setFilterAgeRatings(data.age_ratings);
// galleryFilterStore.setFilterRegions(data.regions);
// galleryFilterStore.setFilterLanguages(data.languages);
// galleryFilterStore.setFilterPlayerCounts(data.player_counts);
}
onMounted(async () => {

View File

@@ -247,6 +247,7 @@ async function getRecentRoms(): Promise<{ data: GetRomsResponse }> {
order_dir: "desc",
limit: RECENT_ROMS_LIMIT,
with_char_index: false,
with_filter_values: false,
},
});
}
@@ -258,6 +259,7 @@ async function getRecentPlayedRoms(): Promise<{ data: GetRomsResponse }> {
order_dir: "desc",
limit: RECENT_PLAYED_ROMS_LIMIT,
with_char_index: false,
with_filter_values: false,
last_played: true,
},
});

View File

@@ -147,6 +147,7 @@ class CachedApiService {
order_dir: "desc",
limit: 15,
with_char_index: false,
with_filter_values: false,
});
return cacheService.request<GetRomsResponse>(config, onBackgroundUpdate);
@@ -160,6 +161,7 @@ class CachedApiService {
order_dir: "desc",
limit: 15,
with_char_index: false,
with_filter_values: false,
last_played: true,
});
@@ -177,6 +179,7 @@ class CachedApiService {
order_dir: "desc",
limit: 15,
with_char_index: false,
with_filter_values: false,
});
}
@@ -186,6 +189,7 @@ class CachedApiService {
order_dir: "desc",
limit: 15,
with_char_index: false,
with_filter_values: false,
last_played: true,
});
}

View File

@@ -149,8 +149,13 @@ export default defineStore("roms", {
};
return params;
},
_postFetchRoms(response: GetRomsResponse, concat: boolean) {
const { items, offset, total, char_index, rom_id_index } = response;
_postFetchRoms(
response: GetRomsResponse,
galleryFilter: GalleryFilterStore,
concat: boolean,
) {
const { items, offset, total, char_index, rom_id_index, filter_values } =
response;
if (!concat || this.fetchOffset === 0) {
this._allRoms = items;
} else {
@@ -164,6 +169,18 @@ export default defineStore("roms", {
// Set the character index for the current platform
this.characterIndex = char_index;
this.romIdIndex = rom_id_index;
if (filter_values) {
galleryFilter.setFilterPlatforms([]);
galleryFilter.setFilterCollections([]);
galleryFilter.setFilterGenres(filter_values.genres);
galleryFilter.setFilterFranchises(filter_values.franchises);
galleryFilter.setFilterCompanies(filter_values.companies);
galleryFilter.setFilterAgeRatings(filter_values.age_ratings);
galleryFilter.setFilterRegions(filter_values.regions);
galleryFilter.setFilterLanguages(filter_values.languages);
galleryFilter.setFilterPlayerCounts(filter_values.player_counts);
}
},
async fetchRoms({
galleryFilter,
@@ -189,10 +206,10 @@ export default defineStore("roms", {
JSON.stringify(currentParams) !==
JSON.stringify(currentRequestParams);
if (paramsChanged) return;
this._postFetchRoms(response, concat);
this._postFetchRoms(response, galleryFilter, concat);
})
.then((response) => {
this._postFetchRoms(response.data, concat);
this._postFetchRoms(response.data, galleryFilter, concat);
resolve(response.data.items);
})
.catch((error) => {