Fix identify clearing parent studio when merging (#4993)

* Refactor ScrapedStudio.ToPartial signature
* Add unit test
* Don't clear parent studio during ToPartial
This commit is contained in:
WithoutPants 2024-06-19 19:52:33 +10:00 committed by GitHub
parent b3d35dfae4
commit 9c13b39f99
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 132 additions and 14 deletions

View File

@ -46,17 +46,17 @@ func createMissingStudio(ctx context.Context, endpoint string, w models.StudioRe
return nil, err
}
studioPartial := s.Parent.ToPartial(s.Parent.StoredID, endpoint, nil, existingStashIDs)
studioPartial := s.Parent.ToPartial(*s.Parent.StoredID, endpoint, nil, existingStashIDs)
parentImage, err := s.Parent.GetImage(ctx, nil)
if err != nil {
return nil, err
}
if err := studio.ValidateModify(ctx, *studioPartial, w); err != nil {
if err := studio.ValidateModify(ctx, studioPartial, w); err != nil {
return nil, err
}
_, err = w.UpdatePartial(ctx, *studioPartial)
_, err = w.UpdatePartial(ctx, studioPartial)
if err != nil {
return nil, err
}

View File

@ -311,13 +311,13 @@ func (t *StashBoxBatchTagTask) processMatchedStudio(ctx context.Context, s *mode
return err
}
partial := s.ToPartial(s.StoredID, t.box.Endpoint, excluded, existingStashIDs)
partial := s.ToPartial(*s.StoredID, t.box.Endpoint, excluded, existingStashIDs)
if err := studio.ValidateModify(ctx, *partial, qb); err != nil {
if err := studio.ValidateModify(ctx, partial, qb); err != nil {
return err
}
if _, err := qb.UpdatePartial(ctx, *partial); err != nil {
if _, err := qb.UpdatePartial(ctx, partial); err != nil {
return err
}
@ -435,13 +435,13 @@ func (t *StashBoxBatchTagTask) processParentStudio(ctx context.Context, parent *
return err
}
partial := parent.ToPartial(parent.StoredID, t.box.Endpoint, excluded, existingStashIDs)
partial := parent.ToPartial(*parent.StoredID, t.box.Endpoint, excluded, existingStashIDs)
if err := studio.ValidateModify(ctx, *partial, qb); err != nil {
if err := studio.ValidateModify(ctx, partial, qb); err != nil {
return err
}
if _, err := qb.UpdatePartial(ctx, *partial); err != nil {
if _, err := qb.UpdatePartial(ctx, partial); err != nil {
return err
}

View File

@ -62,9 +62,9 @@ func (s *ScrapedStudio) GetImage(ctx context.Context, excluded map[string]bool)
return nil, nil
}
func (s *ScrapedStudio) ToPartial(id *string, endpoint string, excluded map[string]bool, existingStashIDs []StashID) *StudioPartial {
func (s *ScrapedStudio) ToPartial(id string, endpoint string, excluded map[string]bool, existingStashIDs []StashID) StudioPartial {
ret := NewStudioPartial()
ret.ID, _ = strconv.Atoi(*id)
ret.ID, _ = strconv.Atoi(id)
if s.Name != "" && !excluded["name"] {
ret.Name = NewOptionalString(s.Name)
@ -82,8 +82,6 @@ func (s *ScrapedStudio) ToPartial(id *string, endpoint string, excluded map[stri
ret.ParentID = NewOptionalInt(parentID)
}
}
} else {
ret.ParentID = NewOptionalIntPtr(nil)
}
if s.RemoteSiteID != nil && endpoint != "" {
@ -97,7 +95,7 @@ func (s *ScrapedStudio) ToPartial(id *string, endpoint string, excluded map[stri
})
}
return &ret
return ret
}
// A performer from a scraping operation...

View File

@ -247,3 +247,123 @@ func Test_scrapedToPerformerInput(t *testing.T) {
})
}
}
func TestScrapedStudio_ToPartial(t *testing.T) {
var (
id = 1000
idStr = strconv.Itoa(id)
storedID = "storedID"
parentStoredID = 2000
parentStoredIDStr = strconv.Itoa(parentStoredID)
name = "name"
url = "url"
remoteSiteID = "remoteSiteID"
endpoint = "endpoint"
image = "image"
images = []string{image}
existingEndpoint = "existingEndpoint"
existingStashID = StashID{"existingStashID", existingEndpoint}
existingStashIDs = []StashID{existingStashID}
)
fullStudio := ScrapedStudio{
StoredID: &storedID,
Name: name,
URL: &url,
Parent: &ScrapedStudio{
StoredID: &parentStoredIDStr,
},
Image: &image,
Images: images,
RemoteSiteID: &remoteSiteID,
}
type args struct {
id string
endpoint string
excluded map[string]bool
existingStashIDs []StashID
}
stdArgs := args{
id: idStr,
endpoint: endpoint,
excluded: map[string]bool{},
existingStashIDs: existingStashIDs,
}
excludeAll := map[string]bool{
"name": true,
"url": true,
"parent": true,
}
tests := []struct {
name string
o ScrapedStudio
args args
want StudioPartial
}{
{
"full no exclusions",
fullStudio,
stdArgs,
StudioPartial{
ID: id,
Name: NewOptionalString(name),
URL: NewOptionalString(url),
ParentID: NewOptionalInt(parentStoredID),
StashIDs: &UpdateStashIDs{
StashIDs: append(existingStashIDs, StashID{
Endpoint: endpoint,
StashID: remoteSiteID,
}),
Mode: RelationshipUpdateModeSet,
},
},
},
{
"exclude all",
fullStudio,
args{
id: idStr,
excluded: excludeAll,
},
StudioPartial{
ID: id,
},
},
{
"overwrite stash id",
fullStudio,
args{
id: idStr,
excluded: excludeAll,
endpoint: existingEndpoint,
existingStashIDs: existingStashIDs,
},
StudioPartial{
ID: id,
StashIDs: &UpdateStashIDs{
StashIDs: []StashID{{
Endpoint: existingEndpoint,
StashID: remoteSiteID,
}},
Mode: RelationshipUpdateModeSet,
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := tt.o
got := s.ToPartial(tt.args.id, tt.args.endpoint, tt.args.excluded, tt.args.existingStashIDs)
// unset updatedAt - we don't need to compare it
got.UpdatedAt = OptionalTime{}
assert.Equal(t, tt.want, got)
})
}
}