This commit is contained in:
CJ 2025-12-02 13:06:48 -06:00 committed by GitHub
commit e6aa19156e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 53 additions and 5 deletions

View file

@ -612,6 +612,8 @@ input TagFilterType {
images_filter: ImageFilterType
"Filter by related galleries that meet this criteria"
galleries_filter: GalleryFilterType
"Filter by related performers that meet this criteria"
performers_filter: PerformerFilterType
"Filter by creation time"
created_at: TimestampCriterionInput

View file

@ -46,6 +46,8 @@ type TagFilterType struct {
ImagesFilter *ImageFilterType `json:"images_filter"`
// Filter by related galleries that meet this criteria
GalleriesFilter *GalleryFilterType `json:"galleries_filter"`
// Filter by related performers that meet this criteria
PerformersFilter *PerformerFilterType `json:"performers_filter"`
// Filter by created at
CreatedAt *TimestampCriterionInput `json:"created_at"`
// Filter by updated at

View file

@ -107,6 +107,7 @@ type tagRepositoryType struct {
scenes joinRepository
images joinRepository
galleries joinRepository
performers joinRepository
}
var (
@ -152,6 +153,14 @@ var (
fkColumn: galleryIDColumn,
foreignTable: galleryTable,
},
performers: joinRepository{
repository: repository{
tableName: performersTagsTable,
idColumn: tagIDColumn,
},
fkColumn: performerIDColumn,
foreignTable: performerTable,
},
}
)

View file

@ -113,6 +113,15 @@ func (qb *tagFilterHandler) criterionHandler() criterionHandler {
tagRepository.galleries.innerJoin(f, "", "tags.id")
},
},
&relatedFilterHandler{
relatedIDCol: "performers_tags.performer_id",
relatedRepo: performerRepository.repository,
relatedHandler: &performerFilterHandler{tagFilter.PerformersFilter},
joinFn: func(f *filterBuilder) {
tagRepository.performers.innerJoin(f, "", "tags.id")
},
},
}
}

View file

@ -18,8 +18,10 @@ import { Option } from "./SidebarListFilter";
import {
CriterionModifier,
FilterMode,
GalleryFilterType,
InputMaybe,
IntCriterionInput,
PerformerFilterType,
SceneFilterType,
} from "src/core/generated-graphql";
import { useIntl } from "react-intl";
@ -515,12 +517,16 @@ export function makeQueryVariables(query: string, extraProps: {}) {
interface IFilterType {
scenes_filter?: InputMaybe<SceneFilterType>;
scene_count?: InputMaybe<IntCriterionInput>;
performers_filter?: InputMaybe<PerformerFilterType>;
performer_count?: InputMaybe<IntCriterionInput>;
galleries_filter?: InputMaybe<GalleryFilterType>;
gallery_count?: InputMaybe<IntCriterionInput>;
}
export function setObjectFilter(
out: IFilterType,
mode: FilterMode,
relatedFilterOutput: SceneFilterType
relatedFilterOutput: SceneFilterType | PerformerFilterType | GalleryFilterType
) {
const empty = Object.keys(relatedFilterOutput).length === 0;
@ -533,7 +539,27 @@ export function setObjectFilter(
value: 0,
};
}
out.scenes_filter = relatedFilterOutput;
out.scenes_filter = relatedFilterOutput as SceneFilterType;
break;
case FilterMode.Performers:
// if empty, only get objects with performers
if (empty) {
out.performer_count = {
modifier: CriterionModifier.GreaterThan,
value: 0,
};
}
out.performers_filter = relatedFilterOutput as PerformerFilterType;
break;
case FilterMode.Galleries:
// if empty, only get objects with performers
if (empty) {
out.gallery_count = {
modifier: CriterionModifier.GreaterThan,
value: 0,
};
}
out.galleries_filter = relatedFilterOutput as GalleryFilterType;
break;
}
}