package api import ( "context" "github.com/99designs/gqlgen/graphql" "github.com/stashapp/stash-box/pkg/manager/config" "github.com/stashapp/stash-box/pkg/models" "github.com/stashapp/stash-box/pkg/utils" ) type Resolver struct { getRepoFactory func(ctx context.Context) models.Repo } func NewResolver(repoFunc func(ctx context.Context) models.Repo) *Resolver { return &Resolver{ getRepoFactory: repoFunc, } } func (r *Resolver) Mutation() models.MutationResolver { return &mutationResolver{r} } func (r *Resolver) Edit() models.EditResolver { return &editResolver{r} } func (r *Resolver) EditComment() models.EditCommentResolver { return &editCommentResolver{r} } func (r *Resolver) EditVote() models.EditVoteResolver { return &editVoteResolver{r} } func (r *Resolver) Performer() models.PerformerResolver { return &performerResolver{r} } func (r *Resolver) PerformerEdit() models.PerformerEditResolver { return &performerEditResolver{r} } func (r *Resolver) StudioEdit() models.StudioEditResolver { return &studioEditResolver{r} } func (r *Resolver) TagEdit() models.TagEditResolver { return &tagEditResolver{r} } func (r *Resolver) SceneEdit() models.SceneEditResolver { return &sceneEditResolver{r} } func (r *Resolver) Tag() models.TagResolver { return &tagResolver{r} } func (r *Resolver) TagCategory() models.TagCategoryResolver { return &tagCategoryResolver{r} } func (r *Resolver) Image() models.ImageResolver { return &imageResolver{r} } func (r *Resolver) Studio() models.StudioResolver { return &studioResolver{r} } func (r *Resolver) Scene() models.SceneResolver { return &sceneResolver{r} } func (r *Resolver) Site() models.SiteResolver { return &siteResolver{r} } func (r *Resolver) URL() models.URLResolver { return &urlResolver{r} } func (r *Resolver) User() models.UserResolver { return &userResolver{r} } func (r *Resolver) Query() models.QueryResolver { return &queryResolver{r} } func (r *Resolver) QueryPerformersResultType() models.QueryPerformersResultTypeResolver { return &queryPerformerResolver{r} } func (r *Resolver) QueryScenesResultType() models.QueryScenesResultTypeResolver { return &querySceneResolver{r} } func (r *Resolver) QueryEditsResultType() models.QueryEditsResultTypeResolver { return &queryEditResolver{r} } func (r *Resolver) Draft() models.DraftResolver { return &draftResolver{r} } func (r *Resolver) PerformerDraft() models.PerformerDraftResolver { return &performerDraftResolver{r} } func (r *Resolver) SceneDraft() models.SceneDraftResolver { return &sceneDraftResolver{r} } type mutationResolver struct{ *Resolver } type queryResolver struct{ *Resolver } func (r *queryResolver) Version(ctx context.Context) (*models.Version, error) { version, githash, buildstamp := GetVersion() return &models.Version{ Version: version, Hash: githash, BuildTime: buildstamp, BuildType: buildtype, }, nil } func (r *queryResolver) GetConfig(ctx context.Context) (*models.StashBoxConfig, error) { return &models.StashBoxConfig{ HostURL: config.GetHostURL(), RequireInvite: config.GetRequireInvite(), RequireActivation: config.GetRequireActivation(), VotePromotionThreshold: config.GetVotePromotionThreshold(), VoteApplicationThreshold: config.GetVoteApplicationThreshold(), VotingPeriod: config.GetVotingPeriod(), MinDestructiveVotingPeriod: config.GetMinDestructiveVotingPeriod(), VoteCronInterval: config.GetVoteCronInterval(), }, nil } // wasFieldIncluded returns true if the given field was included in the request. // Slices are unmarshalled to empty slices even if the field was omitted. This // method determines if it was omitted altogether. func wasFieldIncluded(ctx context.Context, qualifiedField string) bool { rctx := graphql.GetOperationContext(ctx) if rctx != nil { _, ret := utils.FindField(rctx.Variables, qualifiedField) return ret } return false } func wasFieldIncludedFunc(ctx context.Context) func(qualifiedField string) bool { return func(qualifiedField string) bool { return wasFieldIncluded(ctx, qualifiedField) } }