mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 04:44:37 +03:00
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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user