mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 04:14:39 +03:00
SQLite model refactoring (#3791)
* Remove ID from PerformerPartial * Separate studio model from sqlite model * Separate movie model from sqlite model * Separate tag model from sqlite model * Separate saved filter model from sqlite model * Separate scene marker model from sqlite model * Separate gallery chapter model from sqlite model * Move ErrNoRows checks into sqlite, improve empty result error messages * Move SQLiteDate and SQLiteTimestamp to sqlite * Use changesetTranslator everywhere, refactor for consistency * Make PerformerStore.DestroyImage private * Fix rating on movie create
This commit is contained in:
@@ -21,10 +21,10 @@ type FinderAliasImageGetter interface {
|
||||
func ToJSON(ctx context.Context, reader FinderAliasImageGetter, tag *models.Tag) (*jsonschema.Tag, error) {
|
||||
newTagJSON := jsonschema.Tag{
|
||||
Name: tag.Name,
|
||||
Description: tag.Description.String,
|
||||
Description: tag.Description,
|
||||
IgnoreAutoTag: tag.IgnoreAutoTag,
|
||||
CreatedAt: json.JSONTime{Time: tag.CreatedAt.Timestamp},
|
||||
UpdatedAt: json.JSONTime{Time: tag.UpdatedAt.Timestamp},
|
||||
CreatedAt: json.JSONTime{Time: tag.CreatedAt},
|
||||
UpdatedAt: json.JSONTime{Time: tag.UpdatedAt},
|
||||
}
|
||||
|
||||
aliases, err := reader.GetAliases(ctx, tag.ID)
|
||||
|
||||
@@ -2,7 +2,6 @@ package tag
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"errors"
|
||||
|
||||
"github.com/stashapp/stash/pkg/models"
|
||||
@@ -37,19 +36,12 @@ var (
|
||||
|
||||
func createTag(id int) models.Tag {
|
||||
return models.Tag{
|
||||
ID: id,
|
||||
Name: tagName,
|
||||
Description: sql.NullString{
|
||||
String: description,
|
||||
Valid: true,
|
||||
},
|
||||
ID: id,
|
||||
Name: tagName,
|
||||
Description: description,
|
||||
IgnoreAutoTag: autoTagIgnored,
|
||||
CreatedAt: models.SQLiteTimestamp{
|
||||
Timestamp: createTime,
|
||||
},
|
||||
UpdatedAt: models.SQLiteTimestamp{
|
||||
Timestamp: updateTime,
|
||||
},
|
||||
CreatedAt: createTime,
|
||||
UpdatedAt: updateTime,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@ package tag
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
|
||||
"github.com/stashapp/stash/pkg/models"
|
||||
@@ -12,8 +11,8 @@ import (
|
||||
|
||||
type NameFinderCreatorUpdater interface {
|
||||
FindByName(ctx context.Context, name string, nocase bool) (*models.Tag, error)
|
||||
Create(ctx context.Context, newTag models.Tag) (*models.Tag, error)
|
||||
UpdateFull(ctx context.Context, updatedTag models.Tag) (*models.Tag, error)
|
||||
Create(ctx context.Context, newTag *models.Tag) error
|
||||
Update(ctx context.Context, updatedTag *models.Tag) error
|
||||
UpdateImage(ctx context.Context, tagID int, image []byte) error
|
||||
UpdateAliases(ctx context.Context, tagID int, aliases []string) error
|
||||
UpdateParentTags(ctx context.Context, tagID int, parentIDs []int) error
|
||||
@@ -43,10 +42,10 @@ type Importer struct {
|
||||
func (i *Importer) PreImport(ctx context.Context) error {
|
||||
i.tag = models.Tag{
|
||||
Name: i.Input.Name,
|
||||
Description: sql.NullString{String: i.Input.Description, Valid: true},
|
||||
Description: i.Input.Description,
|
||||
IgnoreAutoTag: i.Input.IgnoreAutoTag,
|
||||
CreatedAt: models.SQLiteTimestamp{Timestamp: i.Input.CreatedAt.GetTime()},
|
||||
UpdatedAt: models.SQLiteTimestamp{Timestamp: i.Input.UpdatedAt.GetTime()},
|
||||
CreatedAt: i.Input.CreatedAt.GetTime(),
|
||||
UpdatedAt: i.Input.UpdatedAt.GetTime(),
|
||||
}
|
||||
|
||||
var err error
|
||||
@@ -103,19 +102,19 @@ func (i *Importer) FindExistingID(ctx context.Context) (*int, error) {
|
||||
}
|
||||
|
||||
func (i *Importer) Create(ctx context.Context) (*int, error) {
|
||||
created, err := i.ReaderWriter.Create(ctx, i.tag)
|
||||
err := i.ReaderWriter.Create(ctx, &i.tag)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error creating tag: %v", err)
|
||||
}
|
||||
|
||||
id := created.ID
|
||||
id := i.tag.ID
|
||||
return &id, nil
|
||||
}
|
||||
|
||||
func (i *Importer) Update(ctx context.Context, id int) error {
|
||||
tag := i.tag
|
||||
tag.ID = id
|
||||
_, err := i.ReaderWriter.UpdateFull(ctx, tag)
|
||||
err := i.ReaderWriter.Update(ctx, &tag)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error updating existing tag: %v", err)
|
||||
}
|
||||
@@ -156,12 +155,12 @@ func (i *Importer) getParents(ctx context.Context) ([]int, error) {
|
||||
}
|
||||
|
||||
func (i *Importer) createParent(ctx context.Context, name string) (int, error) {
|
||||
newTag := *models.NewTag(name)
|
||||
newTag := models.NewTag(name)
|
||||
|
||||
created, err := i.ReaderWriter.Create(ctx, newTag)
|
||||
err := i.ReaderWriter.Create(ctx, newTag)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return created.ID, nil
|
||||
return newTag.ID, nil
|
||||
}
|
||||
|
||||
@@ -153,8 +153,15 @@ func TestImporterPostImportParentMissing(t *testing.T) {
|
||||
readerWriter.On("UpdateParentTags", testCtx, ignoreID, emptyParents).Return(nil).Once()
|
||||
readerWriter.On("UpdateParentTags", testCtx, ignoreFoundID, []int{103}).Return(nil).Once()
|
||||
|
||||
readerWriter.On("Create", testCtx, mock.MatchedBy(func(t models.Tag) bool { return t.Name == "Create" })).Return(&models.Tag{ID: 100}, nil).Once()
|
||||
readerWriter.On("Create", testCtx, mock.MatchedBy(func(t models.Tag) bool { return t.Name == "CreateError" })).Return(nil, errors.New("failed creating parent")).Once()
|
||||
readerWriter.On("Create", testCtx, mock.MatchedBy(func(t *models.Tag) bool {
|
||||
return t.Name == "Create"
|
||||
})).Run(func(args mock.Arguments) {
|
||||
t := args.Get(1).(*models.Tag)
|
||||
t.ID = 100
|
||||
}).Return(nil).Once()
|
||||
readerWriter.On("Create", testCtx, mock.MatchedBy(func(t *models.Tag) bool {
|
||||
return t.Name == "CreateError"
|
||||
})).Return(errors.New("failed creating parent")).Once()
|
||||
|
||||
i.MissingRefBehaviour = models.ImportMissingRefEnumCreate
|
||||
i.Input.Parents = []string{"Create"}
|
||||
@@ -253,10 +260,11 @@ func TestCreate(t *testing.T) {
|
||||
}
|
||||
|
||||
errCreate := errors.New("Create error")
|
||||
readerWriter.On("Create", testCtx, tag).Return(&models.Tag{
|
||||
ID: tagID,
|
||||
}, nil).Once()
|
||||
readerWriter.On("Create", testCtx, tagErr).Return(nil, errCreate).Once()
|
||||
readerWriter.On("Create", testCtx, &tag).Run(func(args mock.Arguments) {
|
||||
t := args.Get(1).(*models.Tag)
|
||||
t.ID = tagID
|
||||
}).Return(nil).Once()
|
||||
readerWriter.On("Create", testCtx, &tagErr).Return(errCreate).Once()
|
||||
|
||||
id, err := i.Create(testCtx)
|
||||
assert.Equal(t, tagID, *id)
|
||||
@@ -290,7 +298,7 @@ func TestUpdate(t *testing.T) {
|
||||
|
||||
// id needs to be set for the mock input
|
||||
tag.ID = tagID
|
||||
readerWriter.On("UpdateFull", testCtx, tag).Return(nil, nil).Once()
|
||||
readerWriter.On("Update", testCtx, &tag).Return(nil).Once()
|
||||
|
||||
err := i.Update(testCtx, tagID)
|
||||
assert.Nil(t, err)
|
||||
@@ -299,7 +307,7 @@ func TestUpdate(t *testing.T) {
|
||||
|
||||
// need to set id separately
|
||||
tagErr.ID = errImageID
|
||||
readerWriter.On("UpdateFull", testCtx, tagErr).Return(nil, errUpdate).Once()
|
||||
readerWriter.On("Update", testCtx, &tagErr).Return(errUpdate).Once()
|
||||
|
||||
err = i.Update(testCtx, errImageID)
|
||||
assert.NotNil(t, err)
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
|
||||
type NameFinderCreator interface {
|
||||
FindByNames(ctx context.Context, names []string, nocase bool) ([]*models.Tag, error)
|
||||
Create(ctx context.Context, newTag models.Tag) (*models.Tag, error)
|
||||
Create(ctx context.Context, newTag *models.Tag) error
|
||||
}
|
||||
|
||||
type NameExistsError struct {
|
||||
|
||||
Reference in New Issue
Block a user