mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 04:44:37 +03:00
Add related object filter criteria to various filter types in graphql schema (#4861)
* Move filter criterion handlers into separate file * Add related filters for image filter * Add related filters for scene filter * Add related filters to gallery filter * Add related filters to movie filter * Add related filters to performer filter * Add related filters to studio filter * Add related filters to tag filter * Add scene filter to scene marker filter
This commit is contained in:
@@ -6,6 +6,27 @@ import (
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type OperatorFilter[T any] struct {
|
||||
And *T `json:"AND"`
|
||||
Or *T `json:"OR"`
|
||||
Not *T `json:"NOT"`
|
||||
}
|
||||
|
||||
// SubFilter returns the subfilter of the operator filter.
|
||||
// Only one of And, Or, or Not should be set, so it returns the first of these that are not nil.
|
||||
func (f *OperatorFilter[T]) SubFilter() *T {
|
||||
if f.And != nil {
|
||||
return f.And
|
||||
}
|
||||
if f.Or != nil {
|
||||
return f.Or
|
||||
}
|
||||
if f.Not != nil {
|
||||
return f.Not
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CriterionModifier string
|
||||
|
||||
const (
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package models
|
||||
|
||||
type GalleryFilterType struct {
|
||||
And *GalleryFilterType `json:"AND"`
|
||||
Or *GalleryFilterType `json:"OR"`
|
||||
Not *GalleryFilterType `json:"NOT"`
|
||||
OperatorFilter[GalleryFilterType]
|
||||
ID *IntCriterionInput `json:"id"`
|
||||
Title *StringCriterionInput `json:"title"`
|
||||
Code *StringCriterionInput `json:"code"`
|
||||
@@ -51,6 +49,16 @@ type GalleryFilterType struct {
|
||||
URL *StringCriterionInput `json:"url"`
|
||||
// Filter by date
|
||||
Date *DateCriterionInput `json:"date"`
|
||||
// Filter by related scenes that meet this criteria
|
||||
ScenesFilter *SceneFilterType `json:"scenes_filter"`
|
||||
// Filter by related images that meet this criteria
|
||||
ImagesFilter *ImageFilterType `json:"images_filter"`
|
||||
// Filter by related performers that meet this criteria
|
||||
PerformersFilter *PerformerFilterType `json:"performers_filter"`
|
||||
// Filter by related studios that meet this criteria
|
||||
StudiosFilter *StudioFilterType `json:"studios_filter"`
|
||||
// Filter by related tags that meet this criteria
|
||||
TagsFilter *TagFilterType `json:"tags_filter"`
|
||||
// Filter by created at
|
||||
CreatedAt *TimestampCriterionInput `json:"created_at"`
|
||||
// Filter by updated at
|
||||
|
||||
@@ -3,9 +3,7 @@ package models
|
||||
import "context"
|
||||
|
||||
type ImageFilterType struct {
|
||||
And *ImageFilterType `json:"AND"`
|
||||
Or *ImageFilterType `json:"OR"`
|
||||
Not *ImageFilterType `json:"NOT"`
|
||||
OperatorFilter[ImageFilterType]
|
||||
ID *IntCriterionInput `json:"id"`
|
||||
Title *StringCriterionInput `json:"title"`
|
||||
Code *StringCriterionInput `json:"code"`
|
||||
@@ -51,6 +49,14 @@ type ImageFilterType struct {
|
||||
PerformerAge *IntCriterionInput `json:"performer_age"`
|
||||
// Filter to only include images with these galleries
|
||||
Galleries *MultiCriterionInput `json:"galleries"`
|
||||
// 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 related studios that meet this criteria
|
||||
StudiosFilter *StudioFilterType `json:"studios_filter"`
|
||||
// Filter by related tags that meet this criteria
|
||||
TagsFilter *TagFilterType `json:"tags_filter"`
|
||||
// Filter by created at
|
||||
CreatedAt *TimestampCriterionInput `json:"created_at"`
|
||||
// Filter by updated at
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package models
|
||||
|
||||
type MovieFilterType struct {
|
||||
OperatorFilter[MovieFilterType]
|
||||
Name *StringCriterionInput `json:"name"`
|
||||
Director *StringCriterionInput `json:"director"`
|
||||
Synopsis *StringCriterionInput `json:"synopsis"`
|
||||
@@ -18,6 +19,10 @@ type MovieFilterType struct {
|
||||
Performers *MultiCriterionInput `json:"performers"`
|
||||
// Filter by date
|
||||
Date *DateCriterionInput `json:"date"`
|
||||
// Filter by related scenes that meet this criteria
|
||||
ScenesFilter *SceneFilterType `json:"scenes_filter"`
|
||||
// Filter by related studios that meet this criteria
|
||||
StudiosFilter *StudioFilterType `json:"studios_filter"`
|
||||
// Filter by created at
|
||||
CreatedAt *TimestampCriterionInput `json:"created_at"`
|
||||
// Filter by updated at
|
||||
|
||||
@@ -108,9 +108,7 @@ type CircumcisionCriterionInput struct {
|
||||
}
|
||||
|
||||
type PerformerFilterType struct {
|
||||
And *PerformerFilterType `json:"AND"`
|
||||
Or *PerformerFilterType `json:"OR"`
|
||||
Not *PerformerFilterType `json:"NOT"`
|
||||
OperatorFilter[PerformerFilterType]
|
||||
Name *StringCriterionInput `json:"name"`
|
||||
Disambiguation *StringCriterionInput `json:"disambiguation"`
|
||||
Details *StringCriterionInput `json:"details"`
|
||||
@@ -188,6 +186,14 @@ type PerformerFilterType struct {
|
||||
Birthdate *DateCriterionInput `json:"birth_date"`
|
||||
// Filter by death date
|
||||
DeathDate *DateCriterionInput `json:"death_date"`
|
||||
// Filter by related scenes that meet this criteria
|
||||
ScenesFilter *SceneFilterType `json:"scenes_filter"`
|
||||
// Filter by related images that meet this criteria
|
||||
ImagesFilter *ImageFilterType `json:"images_filter"`
|
||||
// Filter by related galleries that meet this criteria
|
||||
GalleriesFilter *GalleryFilterType `json:"galleries_filter"`
|
||||
// Filter by related tags that meet this criteria
|
||||
TagsFilter *TagFilterType `json:"tags_filter"`
|
||||
// Filter by created at
|
||||
CreatedAt *TimestampCriterionInput `json:"created_at"`
|
||||
// Filter by updated at
|
||||
|
||||
@@ -9,9 +9,7 @@ type PHashDuplicationCriterionInput struct {
|
||||
}
|
||||
|
||||
type SceneFilterType struct {
|
||||
And *SceneFilterType `json:"AND"`
|
||||
Or *SceneFilterType `json:"OR"`
|
||||
Not *SceneFilterType `json:"NOT"`
|
||||
OperatorFilter[SceneFilterType]
|
||||
ID *IntCriterionInput `json:"id"`
|
||||
Title *StringCriterionInput `json:"title"`
|
||||
Code *StringCriterionInput `json:"code"`
|
||||
@@ -97,6 +95,18 @@ type SceneFilterType struct {
|
||||
LastPlayedAt *TimestampCriterionInput `json:"last_played_at"`
|
||||
// Filter by date
|
||||
Date *DateCriterionInput `json:"date"`
|
||||
// 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 related studios that meet this criteria
|
||||
StudiosFilter *StudioFilterType `json:"studios_filter"`
|
||||
// Filter by related tags that meet this criteria
|
||||
TagsFilter *TagFilterType `json:"tags_filter"`
|
||||
// Filter by related movies that meet this criteria
|
||||
MoviesFilter *MovieFilterType `json:"movies_filter"`
|
||||
// Filter by related markers that meet this criteria
|
||||
MarkersFilter *SceneMarkerFilterType `json:"markers_filter"`
|
||||
// Filter by created at
|
||||
CreatedAt *TimestampCriterionInput `json:"created_at"`
|
||||
// Filter by updated at
|
||||
|
||||
@@ -19,6 +19,8 @@ type SceneMarkerFilterType struct {
|
||||
SceneCreatedAt *TimestampCriterionInput `json:"scene_created_at"`
|
||||
// Filter by scenes updated at
|
||||
SceneUpdatedAt *TimestampCriterionInput `json:"scene_updated_at"`
|
||||
// Filter by related scenes that meet this criteria
|
||||
SceneFilter *SceneFilterType `json:"scene_filter"`
|
||||
}
|
||||
|
||||
type MarkerStringsResultType struct {
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package models
|
||||
|
||||
type StudioFilterType struct {
|
||||
And *StudioFilterType `json:"AND"`
|
||||
Or *StudioFilterType `json:"OR"`
|
||||
Not *StudioFilterType `json:"NOT"`
|
||||
OperatorFilter[StudioFilterType]
|
||||
Name *StringCriterionInput `json:"name"`
|
||||
Details *StringCriterionInput `json:"details"`
|
||||
// Filter to only include studios with this parent studio
|
||||
@@ -32,6 +30,12 @@ type StudioFilterType struct {
|
||||
ChildCount *IntCriterionInput `json:"child_count"`
|
||||
// Filter by autotag ignore value
|
||||
IgnoreAutoTag *bool `json:"ignore_auto_tag"`
|
||||
// Filter by related scenes that meet this criteria
|
||||
ScenesFilter *SceneFilterType `json:"scenes_filter"`
|
||||
// Filter by related images that meet this criteria
|
||||
ImagesFilter *ImageFilterType `json:"images_filter"`
|
||||
// Filter by related galleries that meet this criteria
|
||||
GalleriesFilter *GalleryFilterType `json:"galleries_filter"`
|
||||
// Filter by created at
|
||||
CreatedAt *TimestampCriterionInput `json:"created_at"`
|
||||
// Filter by updated at
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package models
|
||||
|
||||
type TagFilterType struct {
|
||||
And *TagFilterType `json:"AND"`
|
||||
Or *TagFilterType `json:"OR"`
|
||||
Not *TagFilterType `json:"NOT"`
|
||||
OperatorFilter[TagFilterType]
|
||||
// Filter by tag name
|
||||
Name *StringCriterionInput `json:"name"`
|
||||
// Filter by tag aliases
|
||||
@@ -34,6 +32,12 @@ type TagFilterType struct {
|
||||
ChildCount *IntCriterionInput `json:"child_count"`
|
||||
// Filter by autotag ignore value
|
||||
IgnoreAutoTag *bool `json:"ignore_auto_tag"`
|
||||
// Filter by related scenes that meet this criteria
|
||||
ScenesFilter *SceneFilterType `json:"scenes_filter"`
|
||||
// Filter by related images that meet this criteria
|
||||
ImagesFilter *ImageFilterType `json:"images_filter"`
|
||||
// Filter by related galleries that meet this criteria
|
||||
GalleriesFilter *GalleryFilterType `json:"galleries_filter"`
|
||||
// Filter by created at
|
||||
CreatedAt *TimestampCriterionInput `json:"created_at"`
|
||||
// Filter by updated at
|
||||
|
||||
Reference in New Issue
Block a user