From ae6d1a8109b2d4a67aa9271301e18ddef195276b Mon Sep 17 00:00:00 2001 From: bob123491234 <54259225+bob123491234@users.noreply.github.com> Date: Wed, 13 Mar 2024 18:17:57 -0500 Subject: [PATCH] Add galleries filter to scenes (#4632) --- graphql/schema/types/filters.graphql | 2 ++ pkg/models/scene.go | 2 ++ pkg/sqlite/scene.go | 10 ++++++++++ ui/v2.5/src/models/list-filter/scenes.ts | 2 ++ 4 files changed, 16 insertions(+) diff --git a/graphql/schema/types/filters.graphql b/graphql/schema/types/filters.graphql index 44a748a1890..643029db20d 100644 --- a/graphql/schema/types/filters.graphql +++ b/graphql/schema/types/filters.graphql @@ -243,6 +243,8 @@ input SceneFilterType { studios: HierarchicalMultiCriterionInput "Filter to only include scenes with this movie" movies: MultiCriterionInput + "Filter to only include scenes with this gallery" + galleries: MultiCriterionInput "Filter to only include scenes with these tags" tags: HierarchicalMultiCriterionInput "Filter by tag count" diff --git a/pkg/models/scene.go b/pkg/models/scene.go index d0be3016b54..bd58d24ed6c 100644 --- a/pkg/models/scene.go +++ b/pkg/models/scene.go @@ -57,6 +57,8 @@ type SceneFilterType struct { Studios *HierarchicalMultiCriterionInput `json:"studios"` // Filter to only include scenes with this movie Movies *MultiCriterionInput `json:"movies"` + // Filter to only include scenes with this gallery + Galleries *MultiCriterionInput `json:"galleries"` // Filter to only include scenes with these tags Tags *HierarchicalMultiCriterionInput `json:"tags"` // Filter by tag count diff --git a/pkg/sqlite/scene.go b/pkg/sqlite/scene.go index 99b2254c0f5..2a9af6ebf92 100644 --- a/pkg/sqlite/scene.go +++ b/pkg/sqlite/scene.go @@ -992,6 +992,7 @@ func (qb *SceneStore) makeFilter(ctx context.Context, sceneFilter *models.SceneF query.handleCriterion(ctx, scenePerformerCountCriterionHandler(qb, sceneFilter.PerformerCount)) query.handleCriterion(ctx, studioCriterionHandler(sceneTable, sceneFilter.Studios)) query.handleCriterion(ctx, sceneMoviesCriterionHandler(qb, sceneFilter.Movies)) + query.handleCriterion(ctx, sceneGalleriesCriterionHandler(qb, sceneFilter.Galleries)) query.handleCriterion(ctx, scenePerformerTagsCriterionHandler(qb, sceneFilter.PerformerTags)) query.handleCriterion(ctx, scenePerformerFavoriteCriterionHandler(sceneFilter.PerformerFavorite)) query.handleCriterion(ctx, scenePerformerAgeCriterionHandler(sceneFilter.PerformerAge)) @@ -1453,6 +1454,15 @@ func sceneMoviesCriterionHandler(qb *SceneStore, movies *models.MultiCriterionIn return h.handler(movies) } +func sceneGalleriesCriterionHandler(qb *SceneStore, galleries *models.MultiCriterionInput) criterionHandlerFunc { + addJoinsFunc := func(f *filterBuilder) { + qb.galleriesRepository().join(f, "", "scenes.id") + f.addLeftJoin("galleries", "", "scenes_galleries.gallery_id = galleries.id") + } + h := qb.getMultiCriterionHandlerBuilder(galleryTable, scenesGalleriesTable, "gallery_id", addJoinsFunc) + return h.handler(galleries) +} + func scenePerformerTagsCriterionHandler(qb *SceneStore, tags *models.HierarchicalMultiCriterionInput) criterionHandler { return &joinedPerformerTagsHandler{ criterion: tags, diff --git a/ui/v2.5/src/models/list-filter/scenes.ts b/ui/v2.5/src/models/list-filter/scenes.ts index 5744faa0b64..87ff7b83d6b 100644 --- a/ui/v2.5/src/models/list-filter/scenes.ts +++ b/ui/v2.5/src/models/list-filter/scenes.ts @@ -9,6 +9,7 @@ import { import { HasMarkersCriterionOption } from "./criteria/has-markers"; import { SceneIsMissingCriterionOption } from "./criteria/is-missing"; import { MoviesCriterionOption } from "./criteria/movies"; +import { GalleriesCriterionOption } from "./criteria/galleries"; import { OrganizedCriterionOption } from "./criteria/organized"; import { PerformersCriterionOption } from "./criteria/performers"; import { ResolutionCriterionOption } from "./criteria/resolution"; @@ -93,6 +94,7 @@ const criterionOptions = [ PerformerFavoriteCriterionOption, StudiosCriterionOption, MoviesCriterionOption, + GalleriesCriterionOption, createStringCriterionOption("url"), StashIDCriterionOption, InteractiveCriterionOption,