mirror of
https://github.com/rommapp/romm.git
synced 2026-03-03 02:27:00 +00:00
Add filter values to roms query
This commit is contained in:
@@ -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,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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 () => {
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
});
|
||||
|
||||
4
frontend/src/services/cache/api.ts
vendored
4
frontend/src/services/cache/api.ts
vendored
@@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user