Restructure data layer (#2532)

* Add new txn manager interface
* Add txn management to sqlite
* Rename get to getByID
* Add contexts to repository methods
* Update query builders
* Add context to reader writer interfaces
* Use repository in resolver
* Tighten interfaces
* Tighten interfaces in dlna
* Tighten interfaces in match package
* Tighten interfaces in scraper package
* Tighten interfaces in scan code
* Tighten interfaces on autotag package
* Remove ReaderWriter usage
* Merge database package into sqlite
This commit is contained in:
WithoutPants
2022-05-19 17:49:32 +10:00
parent 7b5bd80515
commit 964b559309
244 changed files with 7377 additions and 6699 deletions

View File

@@ -24,18 +24,52 @@ import (
"github.com/stashapp/stash/pkg/scraper"
"github.com/stashapp/stash/pkg/scraper/stashbox/graphql"
"github.com/stashapp/stash/pkg/sliceutil/stringslice"
"github.com/stashapp/stash/pkg/studio"
"github.com/stashapp/stash/pkg/tag"
"github.com/stashapp/stash/pkg/txn"
"github.com/stashapp/stash/pkg/utils"
)
type SceneReader interface {
Find(ctx context.Context, id int) (*models.Scene, error)
GetStashIDs(ctx context.Context, sceneID int) ([]*models.StashID, error)
}
type PerformerReader interface {
match.PerformerFinder
Find(ctx context.Context, id int) (*models.Performer, error)
FindBySceneID(ctx context.Context, sceneID int) ([]*models.Performer, error)
GetStashIDs(ctx context.Context, performerID int) ([]*models.StashID, error)
GetImage(ctx context.Context, performerID int) ([]byte, error)
}
type StudioReader interface {
match.StudioFinder
studio.Finder
GetStashIDs(ctx context.Context, studioID int) ([]*models.StashID, error)
}
type TagFinder interface {
tag.Queryer
FindBySceneID(ctx context.Context, sceneID int) ([]*models.Tag, error)
}
type Repository struct {
Scene SceneReader
Performer PerformerReader
Tag TagFinder
Studio StudioReader
}
// Client represents the client interface to a stash-box server instance.
type Client struct {
client *graphql.Client
txnManager models.TransactionManager
txnManager txn.Manager
repository Repository
box models.StashBox
}
// NewClient returns a new instance of a stash-box client.
func NewClient(box models.StashBox, txnManager models.TransactionManager) *Client {
func NewClient(box models.StashBox, txnManager txn.Manager, repo Repository) *Client {
authHeader := func(req *http.Request) {
req.Header.Set("ApiKey", box.APIKey)
}
@@ -47,6 +81,7 @@ func NewClient(box models.StashBox, txnManager models.TransactionManager) *Clien
return &Client{
client: client,
txnManager: txnManager,
repository: repo,
box: box,
}
}
@@ -92,11 +127,11 @@ func (c Client) FindStashBoxSceneByFingerprints(ctx context.Context, sceneID int
func (c Client) FindStashBoxScenesByFingerprints(ctx context.Context, ids []int) ([][]*scraper.ScrapedScene, error) {
var fingerprints [][]*graphql.FingerprintQueryInput
if err := c.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error {
qb := r.Scene()
if err := txn.WithTxn(ctx, c.txnManager, func(ctx context.Context) error {
qb := c.repository.Scene
for _, sceneID := range ids {
scene, err := qb.Find(sceneID)
scene, err := qb.Find(ctx, sceneID)
if err != nil {
return err
}
@@ -177,11 +212,11 @@ func (c Client) SubmitStashBoxFingerprints(ctx context.Context, sceneIDs []strin
var fingerprints []graphql.FingerprintSubmission
if err := c.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error {
qb := r.Scene()
if err := txn.WithTxn(ctx, c.txnManager, func(ctx context.Context) error {
qb := c.repository.Scene
for _, sceneID := range ids {
scene, err := qb.Find(sceneID)
scene, err := qb.Find(ctx, sceneID)
if err != nil {
return err
}
@@ -190,7 +225,7 @@ func (c Client) SubmitStashBoxFingerprints(ctx context.Context, sceneIDs []strin
continue
}
stashIDs, err := qb.GetStashIDs(sceneID)
stashIDs, err := qb.GetStashIDs(ctx, sceneID)
if err != nil {
return err
}
@@ -307,11 +342,11 @@ func (c Client) FindStashBoxPerformersByNames(ctx context.Context, performerIDs
var performers []*models.Performer
if err := c.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error {
qb := r.Performer()
if err := txn.WithTxn(ctx, c.txnManager, func(ctx context.Context) error {
qb := c.repository.Performer
for _, performerID := range ids {
performer, err := qb.Find(performerID)
performer, err := qb.Find(ctx, performerID)
if err != nil {
return err
}
@@ -341,11 +376,11 @@ func (c Client) FindStashBoxPerformersByPerformerNames(ctx context.Context, perf
var performers []*models.Performer
if err := c.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error {
qb := r.Performer()
if err := txn.WithTxn(ctx, c.txnManager, func(ctx context.Context) error {
qb := c.repository.Performer
for _, performerID := range ids {
performer, err := qb.Find(performerID)
performer, err := qb.Find(ctx, performerID)
if err != nil {
return err
}
@@ -622,9 +657,9 @@ func (c Client) sceneFragmentToScrapedScene(ctx context.Context, s *graphql.Scen
ss.Image = getFirstImage(ctx, c.getHTTPClient(), s.Images)
}
if err := c.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error {
pqb := r.Performer()
tqb := r.Tag()
if err := txn.WithTxn(ctx, c.txnManager, func(ctx context.Context) error {
pqb := c.repository.Performer
tqb := c.repository.Tag
if s.Studio != nil {
studioID := s.Studio.ID
@@ -634,7 +669,7 @@ func (c Client) sceneFragmentToScrapedScene(ctx context.Context, s *graphql.Scen
RemoteSiteID: &studioID,
}
err := match.ScrapedStudio(r.Studio(), ss.Studio, &c.box.Endpoint)
err := match.ScrapedStudio(ctx, c.repository.Studio, ss.Studio, &c.box.Endpoint)
if err != nil {
return err
}
@@ -643,7 +678,7 @@ func (c Client) sceneFragmentToScrapedScene(ctx context.Context, s *graphql.Scen
for _, p := range s.Performers {
sp := performerFragmentToScrapedScenePerformer(p.Performer)
err := match.ScrapedPerformer(pqb, sp, &c.box.Endpoint)
err := match.ScrapedPerformer(ctx, pqb, sp, &c.box.Endpoint)
if err != nil {
return err
}
@@ -656,7 +691,7 @@ func (c Client) sceneFragmentToScrapedScene(ctx context.Context, s *graphql.Scen
Name: t.Name,
}
err := match.ScrapedTag(tqb, st)
err := match.ScrapedTag(ctx, tqb, st)
if err != nil {
return err
}
@@ -705,12 +740,13 @@ func (c Client) GetUser(ctx context.Context) (*graphql.Me, error) {
func (c Client) SubmitSceneDraft(ctx context.Context, sceneID int, endpoint string, imagePath string) (*string, error) {
draft := graphql.SceneDraftInput{}
var image *os.File
if err := c.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error {
qb := r.Scene()
pqb := r.Performer()
sqb := r.Studio()
if err := txn.WithTxn(ctx, c.txnManager, func(ctx context.Context) error {
r := c.repository
qb := r.Scene
pqb := r.Performer
sqb := r.Studio
scene, err := qb.Find(sceneID)
scene, err := qb.Find(ctx, sceneID)
if err != nil {
return err
}
@@ -730,7 +766,7 @@ func (c Client) SubmitSceneDraft(ctx context.Context, sceneID int, endpoint stri
}
if scene.StudioID.Valid {
studio, err := sqb.Find(int(scene.StudioID.Int64))
studio, err := sqb.Find(ctx, int(scene.StudioID.Int64))
if err != nil {
return err
}
@@ -738,7 +774,7 @@ func (c Client) SubmitSceneDraft(ctx context.Context, sceneID int, endpoint stri
Name: studio.Name.String,
}
stashIDs, err := sqb.GetStashIDs(studio.ID)
stashIDs, err := sqb.GetStashIDs(ctx, studio.ID)
if err != nil {
return err
}
@@ -780,7 +816,7 @@ func (c Client) SubmitSceneDraft(ctx context.Context, sceneID int, endpoint stri
}
draft.Fingerprints = fingerprints
scenePerformers, err := pqb.FindBySceneID(sceneID)
scenePerformers, err := pqb.FindBySceneID(ctx, sceneID)
if err != nil {
return err
}
@@ -791,7 +827,7 @@ func (c Client) SubmitSceneDraft(ctx context.Context, sceneID int, endpoint stri
Name: p.Name.String,
}
stashIDs, err := pqb.GetStashIDs(p.ID)
stashIDs, err := pqb.GetStashIDs(ctx, p.ID)
if err != nil {
return err
}
@@ -808,7 +844,7 @@ func (c Client) SubmitSceneDraft(ctx context.Context, sceneID int, endpoint stri
draft.Performers = performers
var tags []*graphql.DraftEntityInput
sceneTags, err := r.Tag().FindBySceneID(scene.ID)
sceneTags, err := r.Tag.FindBySceneID(ctx, scene.ID)
if err != nil {
return err
}
@@ -825,7 +861,7 @@ func (c Client) SubmitSceneDraft(ctx context.Context, sceneID int, endpoint stri
}
}
stashIDs, err := qb.GetStashIDs(sceneID)
stashIDs, err := qb.GetStashIDs(ctx, sceneID)
if err != nil {
return err
}
@@ -862,9 +898,9 @@ func (c Client) SubmitSceneDraft(ctx context.Context, sceneID int, endpoint stri
func (c Client) SubmitPerformerDraft(ctx context.Context, performer *models.Performer, endpoint string) (*string, error) {
draft := graphql.PerformerDraftInput{}
var image io.Reader
if err := c.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error {
pqb := r.Performer()
img, _ := pqb.GetImage(performer.ID)
if err := txn.WithTxn(ctx, c.txnManager, func(ctx context.Context) error {
pqb := c.repository.Performer
img, _ := pqb.GetImage(ctx, performer.ID)
if img != nil {
image = bytes.NewReader(img)
}
@@ -923,7 +959,7 @@ func (c Client) SubmitPerformerDraft(ctx context.Context, performer *models.Perf
draft.Urls = urls
}
stashIDs, err := pqb.GetStashIDs(performer.ID)
stashIDs, err := pqb.GetStashIDs(ctx, performer.ID)
if err != nil {
return err
}