mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 04:14:39 +03:00
Selective export (#770)
This commit is contained in:
76
pkg/movie/export.go
Normal file
76
pkg/movie/export.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package movie
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/stashapp/stash/pkg/manager/jsonschema"
|
||||
"github.com/stashapp/stash/pkg/models"
|
||||
"github.com/stashapp/stash/pkg/utils"
|
||||
)
|
||||
|
||||
// ToJSON converts a Movie into its JSON equivalent.
|
||||
func ToJSON(reader models.MovieReader, studioReader models.StudioReader, movie *models.Movie) (*jsonschema.Movie, error) {
|
||||
newMovieJSON := jsonschema.Movie{
|
||||
CreatedAt: models.JSONTime{Time: movie.CreatedAt.Timestamp},
|
||||
UpdatedAt: models.JSONTime{Time: movie.UpdatedAt.Timestamp},
|
||||
}
|
||||
|
||||
if movie.Name.Valid {
|
||||
newMovieJSON.Name = movie.Name.String
|
||||
}
|
||||
if movie.Aliases.Valid {
|
||||
newMovieJSON.Aliases = movie.Aliases.String
|
||||
}
|
||||
if movie.Date.Valid {
|
||||
newMovieJSON.Date = utils.GetYMDFromDatabaseDate(movie.Date.String)
|
||||
}
|
||||
if movie.Rating.Valid {
|
||||
newMovieJSON.Rating = int(movie.Rating.Int64)
|
||||
}
|
||||
if movie.Duration.Valid {
|
||||
newMovieJSON.Duration = int(movie.Duration.Int64)
|
||||
}
|
||||
|
||||
if movie.Director.Valid {
|
||||
newMovieJSON.Director = movie.Director.String
|
||||
}
|
||||
|
||||
if movie.Synopsis.Valid {
|
||||
newMovieJSON.Synopsis = movie.Synopsis.String
|
||||
}
|
||||
|
||||
if movie.URL.Valid {
|
||||
newMovieJSON.URL = movie.URL.String
|
||||
}
|
||||
|
||||
if movie.StudioID.Valid {
|
||||
studio, err := studioReader.Find(int(movie.StudioID.Int64))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error getting movie studio: %s", err.Error())
|
||||
}
|
||||
|
||||
if studio != nil {
|
||||
newMovieJSON.Studio = studio.Name.String
|
||||
}
|
||||
}
|
||||
|
||||
frontImage, err := reader.GetFrontImage(movie.ID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error getting movie front image: %s", err.Error())
|
||||
}
|
||||
|
||||
if len(frontImage) > 0 {
|
||||
newMovieJSON.FrontImage = utils.GetBase64StringFromData(frontImage)
|
||||
}
|
||||
|
||||
backImage, err := reader.GetBackImage(movie.ID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error getting movie back image: %s", err.Error())
|
||||
}
|
||||
|
||||
if len(backImage) > 0 {
|
||||
newMovieJSON.BackImage = utils.GetBase64StringFromData(backImage)
|
||||
}
|
||||
|
||||
return &newMovieJSON, nil
|
||||
}
|
||||
222
pkg/movie/export_test.go
Normal file
222
pkg/movie/export_test.go
Normal file
@@ -0,0 +1,222 @@
|
||||
package movie
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
|
||||
"github.com/stashapp/stash/pkg/manager/jsonschema"
|
||||
"github.com/stashapp/stash/pkg/models"
|
||||
"github.com/stashapp/stash/pkg/models/mocks"
|
||||
"github.com/stashapp/stash/pkg/models/modelstest"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
movieID = 1
|
||||
emptyID = 2
|
||||
errFrontImageID = 3
|
||||
errBackImageID = 4
|
||||
errStudioMovieID = 5
|
||||
missingStudioMovieID = 6
|
||||
)
|
||||
|
||||
const (
|
||||
studioID = 1
|
||||
missingStudioID = 2
|
||||
errStudioID = 3
|
||||
)
|
||||
|
||||
const movieName = "testMovie"
|
||||
const movieAliases = "aliases"
|
||||
|
||||
var date = models.SQLiteDate{
|
||||
String: "2001-01-01",
|
||||
Valid: true,
|
||||
}
|
||||
|
||||
const rating = 5
|
||||
const duration = 100
|
||||
const director = "director"
|
||||
const synopsis = "synopsis"
|
||||
const url = "url"
|
||||
|
||||
const studioName = "studio"
|
||||
|
||||
const frontImage = "ZnJvbnRJbWFnZUJ5dGVz"
|
||||
const backImage = "YmFja0ltYWdlQnl0ZXM="
|
||||
|
||||
var frontImageBytes = []byte("frontImageBytes")
|
||||
var backImageBytes = []byte("backImageBytes")
|
||||
|
||||
var studio models.Studio = models.Studio{
|
||||
Name: modelstest.NullString(studioName),
|
||||
}
|
||||
|
||||
var createTime time.Time = time.Date(2001, 01, 01, 0, 0, 0, 0, time.UTC)
|
||||
var updateTime time.Time = time.Date(2002, 01, 01, 0, 0, 0, 0, time.UTC)
|
||||
|
||||
func createFullMovie(id int, studioID int) models.Movie {
|
||||
return models.Movie{
|
||||
ID: id,
|
||||
Name: modelstest.NullString(movieName),
|
||||
Aliases: modelstest.NullString(movieAliases),
|
||||
Date: date,
|
||||
Rating: sql.NullInt64{
|
||||
Int64: rating,
|
||||
Valid: true,
|
||||
},
|
||||
Duration: sql.NullInt64{
|
||||
Int64: duration,
|
||||
Valid: true,
|
||||
},
|
||||
Director: modelstest.NullString(director),
|
||||
Synopsis: modelstest.NullString(synopsis),
|
||||
URL: modelstest.NullString(url),
|
||||
StudioID: sql.NullInt64{
|
||||
Int64: int64(studioID),
|
||||
Valid: true,
|
||||
},
|
||||
CreatedAt: models.SQLiteTimestamp{
|
||||
Timestamp: createTime,
|
||||
},
|
||||
UpdatedAt: models.SQLiteTimestamp{
|
||||
Timestamp: updateTime,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func createEmptyMovie(id int) models.Movie {
|
||||
return models.Movie{
|
||||
ID: id,
|
||||
CreatedAt: models.SQLiteTimestamp{
|
||||
Timestamp: createTime,
|
||||
},
|
||||
UpdatedAt: models.SQLiteTimestamp{
|
||||
Timestamp: updateTime,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func createFullJSONMovie(studio, frontImage, backImage string) *jsonschema.Movie {
|
||||
return &jsonschema.Movie{
|
||||
Name: movieName,
|
||||
Aliases: movieAliases,
|
||||
Date: date.String,
|
||||
Rating: rating,
|
||||
Duration: duration,
|
||||
Director: director,
|
||||
Synopsis: synopsis,
|
||||
URL: url,
|
||||
Studio: studio,
|
||||
FrontImage: frontImage,
|
||||
BackImage: backImage,
|
||||
CreatedAt: models.JSONTime{
|
||||
Time: createTime,
|
||||
},
|
||||
UpdatedAt: models.JSONTime{
|
||||
Time: updateTime,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func createEmptyJSONMovie() *jsonschema.Movie {
|
||||
return &jsonschema.Movie{
|
||||
CreatedAt: models.JSONTime{
|
||||
Time: createTime,
|
||||
},
|
||||
UpdatedAt: models.JSONTime{
|
||||
Time: updateTime,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type testScenario struct {
|
||||
movie models.Movie
|
||||
expected *jsonschema.Movie
|
||||
err bool
|
||||
}
|
||||
|
||||
var scenarios []testScenario
|
||||
|
||||
func initTestTable() {
|
||||
scenarios = []testScenario{
|
||||
testScenario{
|
||||
createFullMovie(movieID, studioID),
|
||||
createFullJSONMovie(studioName, frontImage, backImage),
|
||||
false,
|
||||
},
|
||||
testScenario{
|
||||
createEmptyMovie(emptyID),
|
||||
createEmptyJSONMovie(),
|
||||
false,
|
||||
},
|
||||
testScenario{
|
||||
createFullMovie(errFrontImageID, studioID),
|
||||
nil,
|
||||
true,
|
||||
},
|
||||
testScenario{
|
||||
createFullMovie(errBackImageID, studioID),
|
||||
nil,
|
||||
true,
|
||||
},
|
||||
testScenario{
|
||||
createFullMovie(errStudioMovieID, errStudioID),
|
||||
nil,
|
||||
true,
|
||||
},
|
||||
testScenario{
|
||||
createFullMovie(missingStudioMovieID, missingStudioID),
|
||||
createFullJSONMovie("", frontImage, backImage),
|
||||
false,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func TestToJSON(t *testing.T) {
|
||||
initTestTable()
|
||||
|
||||
mockMovieReader := &mocks.MovieReaderWriter{}
|
||||
|
||||
imageErr := errors.New("error getting image")
|
||||
|
||||
mockMovieReader.On("GetFrontImage", movieID).Return(frontImageBytes, nil).Once()
|
||||
mockMovieReader.On("GetFrontImage", missingStudioMovieID).Return(frontImageBytes, nil).Once()
|
||||
mockMovieReader.On("GetFrontImage", emptyID).Return(nil, nil).Once().Maybe()
|
||||
mockMovieReader.On("GetFrontImage", errFrontImageID).Return(nil, imageErr).Once()
|
||||
mockMovieReader.On("GetFrontImage", errBackImageID).Return(frontImageBytes, nil).Once()
|
||||
|
||||
mockMovieReader.On("GetBackImage", movieID).Return(backImageBytes, nil).Once()
|
||||
mockMovieReader.On("GetBackImage", missingStudioMovieID).Return(backImageBytes, nil).Once()
|
||||
mockMovieReader.On("GetBackImage", emptyID).Return(nil, nil).Once()
|
||||
mockMovieReader.On("GetBackImage", errBackImageID).Return(nil, imageErr).Once()
|
||||
mockMovieReader.On("GetBackImage", errFrontImageID).Return(backImageBytes, nil).Maybe()
|
||||
mockMovieReader.On("GetBackImage", errStudioMovieID).Return(backImageBytes, nil).Maybe()
|
||||
|
||||
mockStudioReader := &mocks.StudioReaderWriter{}
|
||||
|
||||
studioErr := errors.New("error getting studio")
|
||||
|
||||
mockStudioReader.On("Find", studioID).Return(&studio, nil)
|
||||
mockStudioReader.On("Find", missingStudioID).Return(nil, nil)
|
||||
mockStudioReader.On("Find", errStudioID).Return(nil, studioErr)
|
||||
|
||||
for i, s := range scenarios {
|
||||
movie := s.movie
|
||||
json, err := ToJSON(mockMovieReader, mockStudioReader, &movie)
|
||||
|
||||
if !s.err && err != nil {
|
||||
t.Errorf("[%d] unexpected error: %s", i, err.Error())
|
||||
} else if s.err && err == nil {
|
||||
t.Errorf("[%d] expected error not returned", i)
|
||||
} else {
|
||||
assert.Equal(t, s.expected, json, "[%d]", i)
|
||||
}
|
||||
}
|
||||
|
||||
mockMovieReader.AssertExpectations(t)
|
||||
mockStudioReader.AssertExpectations(t)
|
||||
}
|
||||
Reference in New Issue
Block a user