diff --git a/frontend/src/graphql/queries/Draft.gql b/frontend/src/graphql/queries/Draft.gql index 6da1740f..4939a925 100644 --- a/frontend/src/graphql/queries/Draft.gql +++ b/frontend/src/graphql/queries/Draft.gql @@ -2,7 +2,6 @@ #import "../fragments/PerformerFragment.gql" #import "../fragments/TagFragment.gql" #import "../fragments/StudioFragment.gql" -#import "../fragments/URLFragment.gql" query Draft($id: ID!) { findDraft(id: $id) { id @@ -39,9 +38,7 @@ query Draft($id: ID!) { details director date - url { - ...URLFragment - } + urls studio { ... on Studio { ...StudioFragment diff --git a/frontend/src/graphql/types.ts b/frontend/src/graphql/types.ts index f3b57789..7faa035d 100644 --- a/frontend/src/graphql/types.ts +++ b/frontend/src/graphql/types.ts @@ -1356,7 +1356,7 @@ export type SceneDraft = { studio?: Maybe; tags?: Maybe>; title?: Maybe; - url?: Maybe; + urls?: Maybe>; }; export type SceneDraftInput = { @@ -1371,7 +1371,9 @@ export type SceneDraftInput = { studio?: InputMaybe; tags?: InputMaybe>; title?: InputMaybe; + /** @deprecated Use urls field instead. */ url?: InputMaybe; + urls?: InputMaybe>; }; export type SceneDraftPerformer = DraftEntity | Performer; @@ -13953,16 +13955,7 @@ export type DraftQuery = { details?: string | null; director?: string | null; date?: string | null; - url?: { - __typename: "URL"; - url: string; - site: { - __typename: "Site"; - id: string; - name: string; - icon: string; - }; - } | null; + urls?: Array | null; studio?: | { __typename: "DraftEntity"; @@ -39404,19 +39397,7 @@ export const DraftDocument = { }, { kind: "Field", - name: { kind: "Name", value: "url" }, - selectionSet: { - kind: "SelectionSet", - selections: [ - { - kind: "FragmentSpread", - name: { - kind: "Name", - value: "URLFragment", - }, - }, - ], - }, + name: { kind: "Name", value: "urls" }, }, { kind: "Field", diff --git a/frontend/src/pages/drafts/parse.ts b/frontend/src/pages/drafts/parse.ts index aefb8e50..49e1af7e 100644 --- a/frontend/src/pages/drafts/parse.ts +++ b/frontend/src/pages/drafts/parse.ts @@ -68,7 +68,7 @@ export const parseSceneDraft = ( date: draft.date, title: draft.title, details: draft.details, - urls: joinURLs(draft.url, existingScene?.urls), + urls: existingScene?.urls, studio: draft.studio?.__typename === "Studio" ? draft.studio : null, director: draft.director, code: draft.code, @@ -105,6 +105,7 @@ export const parseSceneDraft = ( [] ) .join(", "), + Urls: (draft?.urls ?? []).join(", "), Tags: (draft.tags ?? []) .reduce( (res, t) => (t.__typename === "DraftEntity" ? [...res, t.name] : res), diff --git a/graphql/schema/types/scene.graphql b/graphql/schema/types/scene.graphql index a15ba60c..641b6b18 100644 --- a/graphql/schema/types/scene.graphql +++ b/graphql/schema/types/scene.graphql @@ -228,7 +228,7 @@ type SceneDraft { code: String details: String director: String - url: URL + urls: [String!] date: String studio: SceneDraftStudio performers: [SceneDraftPerformer!]! @@ -243,7 +243,8 @@ input SceneDraftInput { code: String details: String director: String - url: String + url: String @deprecated(reason: "Use urls field instead.") + urls: [String!] date: String studio: DraftEntityInput performers: [DraftEntityInput!]! diff --git a/pkg/api/resolver_model_scene_draft.go b/pkg/api/resolver_model_scene_draft.go index c8c095a1..ceb87b44 100644 --- a/pkg/api/resolver_model_scene_draft.go +++ b/pkg/api/resolver_model_scene_draft.go @@ -2,11 +2,8 @@ package api import ( "context" - "regexp" - "github.com/gofrs/uuid" "github.com/stashapp/stash-box/pkg/models" - "github.com/stashapp/stash-box/pkg/utils" ) type sceneDraftResolver struct{ *Resolver } @@ -108,50 +105,3 @@ func (r *sceneDraftResolver) Studio(ctx context.Context, obj *models.SceneDraft) } return nil, nil } - -func (r *sceneDraftResolver) URL(ctx context.Context, obj *models.SceneDraft) (*models.URL, error) { - if obj.URL == nil { - return nil, nil - } - - fac := r.getRepoFactory(ctx) - qb := fac.Site() - sites, _, err := qb.Query() - if err != nil { - return nil, nil - } - var studioSiteID *uuid.UUID - var siteID *uuid.UUID - for _, site := range sites { - // Skip any sites not valid for scenes - if !utils.Includes(site.ValidTypes, models.ValidSiteTypeEnumScene.String()) { - continue - } - - if site.Name == "Studio" { - studioSiteID = &site.ID - continue - } - - if site.Regex.Valid { - re, err := regexp.Compile(site.Regex.String) - if err == nil && re.MatchString(*obj.URL) { - siteID = &site.ID - break - } - } - } - - if siteID == nil && studioSiteID != nil { - siteID = studioSiteID - } - - if siteID != nil { - url := models.URL{ - URL: *obj.URL, - SiteID: *siteID, - } - return &url, nil - } - return nil, nil -} diff --git a/pkg/api/resolver_mutation_draft.go b/pkg/api/resolver_mutation_draft.go index cbc46c66..b296ad96 100644 --- a/pkg/api/resolver_mutation_draft.go +++ b/pkg/api/resolver_mutation_draft.go @@ -26,7 +26,7 @@ func (r *mutationResolver) SubmitSceneDraft(ctx context.Context, input models.Sc Code: input.Code, Details: input.Details, Director: input.Director, - URL: input.URL, + URLs: input.Urls, Date: input.Date, Studio: translateDraftEntity(input.Studio), Performers: translateDraftEntitySlice(input.Performers), @@ -56,6 +56,11 @@ func (r *mutationResolver) SubmitSceneDraft(ctx context.Context, input models.Sc data.Tags = tags } + // Temporary code, while we depreciate the URL parameter. + if input.URL != nil { + data.URLs = []string{*input.URL} + } + if err := newDraft.SetData(data); err != nil { return err } diff --git a/pkg/models/generated_exec.go b/pkg/models/generated_exec.go index ddabfae1..a32bac28 100644 --- a/pkg/models/generated_exec.go +++ b/pkg/models/generated_exec.go @@ -443,7 +443,7 @@ type ComplexityRoot struct { Studio func(childComplexity int) int Tags func(childComplexity int) int Title func(childComplexity int) int - URL func(childComplexity int) int + URLs func(childComplexity int) int } SceneEdit struct { @@ -812,8 +812,6 @@ type SceneResolver interface { Updated(ctx context.Context, obj *Scene) (*time.Time, error) } type SceneDraftResolver interface { - URL(ctx context.Context, obj *SceneDraft) (*URL, error) - Studio(ctx context.Context, obj *SceneDraft) (SceneDraftStudio, error) Performers(ctx context.Context, obj *SceneDraft) ([]SceneDraftPerformer, error) Tags(ctx context.Context, obj *SceneDraft) ([]SceneDraftTag, error) @@ -3230,12 +3228,12 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.SceneDraft.Title(childComplexity), true - case "SceneDraft.url": - if e.complexity.SceneDraft.URL == nil { + case "SceneDraft.urls": + if e.complexity.SceneDraft.URLs == nil { break } - return e.complexity.SceneDraft.URL(childComplexity), true + return e.complexity.SceneDraft.URLs(childComplexity), true case "SceneEdit.added_fingerprints": if e.complexity.SceneEdit.AddedFingerprints == nil { @@ -5125,7 +5123,7 @@ type SceneDraft { code: String details: String director: String - url: URL + urls: [String!] date: String studio: SceneDraftStudio performers: [SceneDraftPerformer!]! @@ -5140,7 +5138,8 @@ input SceneDraftInput { code: String details: String director: String - url: String + url: String @deprecated(reason: "Use urls field instead.") + urls: [String!] date: String studio: DraftEntityInput performers: [DraftEntityInput!]! @@ -23726,8 +23725,8 @@ func (ec *executionContext) fieldContext_SceneDraft_director(ctx context.Context return fc, nil } -func (ec *executionContext) _SceneDraft_url(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_SceneDraft_url(ctx, field) +func (ec *executionContext) _SceneDraft_urls(ctx context.Context, field graphql.CollectedField, obj *SceneDraft) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_SceneDraft_urls(ctx, field) if err != nil { return graphql.Null } @@ -23740,7 +23739,7 @@ func (ec *executionContext) _SceneDraft_url(ctx context.Context, field graphql.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.SceneDraft().URL(rctx, obj) + return obj.URLs, nil }) if err != nil { ec.Error(ctx, err) @@ -23749,27 +23748,19 @@ func (ec *executionContext) _SceneDraft_url(ctx context.Context, field graphql.C if resTmp == nil { return graphql.Null } - res := resTmp.(*URL) + res := resTmp.([]string) fc.Result = res - return ec.marshalOURL2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋpkgᚋmodelsᚐURL(ctx, field.Selections, res) + return ec.marshalOString2ᚕstringᚄ(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_SceneDraft_url(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_SceneDraft_urls(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "SceneDraft", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "url": - return ec.fieldContext_URL_url(ctx, field) - case "type": - return ec.fieldContext_URL_type(ctx, field) - case "site": - return ec.fieldContext_URL_site(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type URL", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil @@ -33711,7 +33702,7 @@ func (ec *executionContext) unmarshalInputSceneDraftInput(ctx context.Context, o asMap[k] = v } - fieldsInOrder := [...]string{"id", "title", "code", "details", "director", "url", "date", "studio", "performers", "tags", "image", "fingerprints"} + fieldsInOrder := [...]string{"id", "title", "code", "details", "director", "url", "urls", "date", "studio", "performers", "tags", "image", "fingerprints"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -33760,6 +33751,13 @@ func (ec *executionContext) unmarshalInputSceneDraftInput(ctx context.Context, o return it, err } it.URL = data + case "urls": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("urls")) + data, err := ec.unmarshalOString2ᚕstringᚄ(ctx, v) + if err != nil { + return it, err + } + it.Urls = data case "date": ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("date")) data, err := ec.unmarshalOString2ᚖstring(ctx, v) @@ -41220,39 +41218,8 @@ func (ec *executionContext) _SceneDraft(ctx context.Context, sel ast.SelectionSe out.Values[i] = ec._SceneDraft_details(ctx, field, obj) case "director": out.Values[i] = ec._SceneDraft_director(ctx, field, obj) - case "url": - field := field - - innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._SceneDraft_url(ctx, field, obj) - return res - } - - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) - }) - - // don't run the out.Concurrently() call below - out.Values[i] = graphql.Null - continue - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "urls": + out.Values[i] = ec._SceneDraft_urls(ctx, field, obj) case "date": out.Values[i] = ec._SceneDraft_date(ctx, field, obj) case "studio": @@ -47872,13 +47839,6 @@ func (ec *executionContext) marshalOURL2ᚕᚖgithubᚗcomᚋstashappᚋstashᚑ return ret } -func (ec *executionContext) marshalOURL2ᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋpkgᚋmodelsᚐURL(ctx context.Context, sel ast.SelectionSet, v *URL) graphql.Marshaler { - if v == nil { - return graphql.Null - } - return ec._URL(ctx, sel, v) -} - func (ec *executionContext) unmarshalOURLInput2ᚕᚖgithubᚗcomᚋstashappᚋstashᚑboxᚋpkgᚋmodelsᚐURLInputᚄ(ctx context.Context, v interface{}) ([]*URLInput, error) { if v == nil { return nil, nil diff --git a/pkg/models/generated_models.go b/pkg/models/generated_models.go index 9735a9c8..781df726 100644 --- a/pkg/models/generated_models.go +++ b/pkg/models/generated_models.go @@ -505,6 +505,7 @@ type SceneDraftInput struct { Details *string `json:"details,omitempty"` Director *string `json:"director,omitempty"` URL *string `json:"url,omitempty"` + Urls []string `json:"urls,omitempty"` Date *string `json:"date,omitempty"` Studio *DraftEntityInput `json:"studio,omitempty"` Performers []*DraftEntityInput `json:"performers"` diff --git a/pkg/models/model_draft.go b/pkg/models/model_draft.go index 5bfeb90a..537ff2d2 100644 --- a/pkg/models/model_draft.go +++ b/pkg/models/model_draft.go @@ -32,7 +32,7 @@ type SceneDraft struct { Code *string `json:"code,omitempty"` Details *string `json:"details,omitempty"` Director *string `json:"director,omitempty"` - URL *string `json:"url,omitempty"` + URLs []string `json:"urls,omitempty"` Date *string `json:"date,omitempty"` Studio *DraftEntity `json:"studio,omitempty"` Performers []DraftEntity `json:"performers,omitempty"`