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:
DingDongSoLong4
2023-06-15 04:46:09 +02:00
committed by GitHub
parent 9180a68c45
commit 1c13c9e1b1
150 changed files with 3279 additions and 3129 deletions

View File

@@ -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)

View File

@@ -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,
}
}

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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 {