mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 04:44:37 +03:00
Multiple image URLs (#4000)
* Backend changes - ported from scene impl * Front end changes * Refactor URL mutation code
This commit is contained in:
@@ -307,6 +307,46 @@ func (t changesetTranslator) updateIdsBulk(value *BulkUpdateIds, field string) (
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (t changesetTranslator) optionalURLs(value []string, legacyValue *string) *models.UpdateStrings {
|
||||
const (
|
||||
legacyField = "url"
|
||||
field = "urls"
|
||||
)
|
||||
|
||||
// prefer urls over url
|
||||
if t.hasField(field) {
|
||||
return t.updateStrings(value, field)
|
||||
} else if t.hasField(legacyField) {
|
||||
var valueSlice []string
|
||||
if legacyValue != nil {
|
||||
valueSlice = []string{*legacyValue}
|
||||
}
|
||||
return t.updateStrings(valueSlice, legacyField)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t changesetTranslator) optionalURLsBulk(value *BulkUpdateStrings, legacyValue *string) *models.UpdateStrings {
|
||||
const (
|
||||
legacyField = "url"
|
||||
field = "urls"
|
||||
)
|
||||
|
||||
// prefer urls over url
|
||||
if t.hasField("urls") {
|
||||
return t.updateStringsBulk(value, field)
|
||||
} else if t.hasField(legacyField) {
|
||||
var valueSlice []string
|
||||
if legacyValue != nil {
|
||||
valueSlice = []string{*legacyValue}
|
||||
}
|
||||
return t.updateStrings(valueSlice, legacyField)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t changesetTranslator) updateStrings(value []string, field string) *models.UpdateStrings {
|
||||
if !t.hasField(field) {
|
||||
return nil
|
||||
|
||||
@@ -198,3 +198,32 @@ func (r *imageResolver) Performers(ctx context.Context, obj *models.Image) (ret
|
||||
ret, errs = loaders.From(ctx).PerformerByID.LoadAll(obj.PerformerIDs.List())
|
||||
return ret, firstError(errs)
|
||||
}
|
||||
|
||||
func (r *imageResolver) URL(ctx context.Context, obj *models.Image) (*string, error) {
|
||||
if !obj.URLs.Loaded() {
|
||||
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
||||
return obj.LoadURLs(ctx, r.repository.Image)
|
||||
}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
urls := obj.URLs.List()
|
||||
if len(urls) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return &urls[0], nil
|
||||
}
|
||||
|
||||
func (r *imageResolver) Urls(ctx context.Context, obj *models.Image) ([]string, error) {
|
||||
if !obj.URLs.Loaded() {
|
||||
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
||||
return obj.LoadURLs(ctx, r.repository.Image)
|
||||
}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return obj.URLs.List(), nil
|
||||
}
|
||||
|
||||
@@ -108,7 +108,6 @@ func (r *mutationResolver) imageUpdate(ctx context.Context, input ImageUpdateInp
|
||||
|
||||
updatedImage.Title = translator.optionalString(input.Title, "title")
|
||||
updatedImage.Rating = translator.optionalRatingConversion(input.Rating, input.Rating100)
|
||||
updatedImage.URL = translator.optionalString(input.URL, "url")
|
||||
updatedImage.Organized = translator.optionalBool(input.Organized, "organized")
|
||||
|
||||
updatedImage.Date, err = translator.optionalDate(input.Date, "date")
|
||||
@@ -120,6 +119,8 @@ func (r *mutationResolver) imageUpdate(ctx context.Context, input ImageUpdateInp
|
||||
return nil, fmt.Errorf("converting studio id: %w", err)
|
||||
}
|
||||
|
||||
updatedImage.URLs = translator.optionalURLs(input.Urls, input.URL)
|
||||
|
||||
updatedImage.PrimaryFileID, err = translator.fileIDPtrFromString(input.PrimaryFileID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("converting primary file id: %w", err)
|
||||
@@ -203,7 +204,6 @@ func (r *mutationResolver) BulkImageUpdate(ctx context.Context, input BulkImageU
|
||||
|
||||
updatedImage.Title = translator.optionalString(input.Title, "title")
|
||||
updatedImage.Rating = translator.optionalRatingConversion(input.Rating, input.Rating100)
|
||||
updatedImage.URL = translator.optionalString(input.URL, "url")
|
||||
updatedImage.Organized = translator.optionalBool(input.Organized, "organized")
|
||||
|
||||
updatedImage.Date, err = translator.optionalDate(input.Date, "date")
|
||||
@@ -215,6 +215,8 @@ func (r *mutationResolver) BulkImageUpdate(ctx context.Context, input BulkImageU
|
||||
return nil, fmt.Errorf("converting studio id: %w", err)
|
||||
}
|
||||
|
||||
updatedImage.URLs = translator.optionalURLsBulk(input.Urls, input.URL)
|
||||
|
||||
updatedImage.GalleryIDs, err = translator.updateIdsBulk(input.GalleryIds, "gallery_ids")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("converting gallery ids: %w", err)
|
||||
|
||||
@@ -186,16 +186,7 @@ func scenePartialFromInput(input models.SceneUpdateInput, translator changesetTr
|
||||
return nil, fmt.Errorf("converting studio id: %w", err)
|
||||
}
|
||||
|
||||
// prefer urls over url
|
||||
if translator.hasField("urls") {
|
||||
updatedScene.URLs = translator.updateStrings(input.Urls, "urls")
|
||||
} else if translator.hasField("url") {
|
||||
var urls []string
|
||||
if input.URL != nil {
|
||||
urls = []string{*input.URL}
|
||||
}
|
||||
updatedScene.URLs = translator.updateStrings(urls, "url")
|
||||
}
|
||||
updatedScene.URLs = translator.optionalURLs(input.Urls, input.URL)
|
||||
|
||||
updatedScene.PrimaryFileID, err = translator.fileIDPtrFromString(input.PrimaryFileID)
|
||||
if err != nil {
|
||||
@@ -342,16 +333,7 @@ func (r *mutationResolver) BulkSceneUpdate(ctx context.Context, input BulkSceneU
|
||||
return nil, fmt.Errorf("converting studio id: %w", err)
|
||||
}
|
||||
|
||||
// prefer urls over url
|
||||
if translator.hasField("urls") {
|
||||
updatedScene.URLs = translator.updateStringsBulk(input.Urls, "urls")
|
||||
} else if translator.hasField("url") {
|
||||
var urls []string
|
||||
if input.URL != nil {
|
||||
urls = []string{*input.URL}
|
||||
}
|
||||
updatedScene.URLs = translator.updateStrings(urls, "url")
|
||||
}
|
||||
updatedScene.URLs = translator.optionalURLsBulk(input.Urls, input.URL)
|
||||
|
||||
updatedScene.PerformerIDs, err = translator.updateIdsBulk(input.PerformerIds, "performer_ids")
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user