Skip to content

Commit

Permalink
Plugin hooks (#1452)
Browse files Browse the repository at this point in the history
* Refactor session and plugin code
* Add context to job tasks
* Show hooks in plugins page
* Refactor session management
  • Loading branch information
WithoutPants committed Jun 11, 2021
1 parent dde361f commit 46bbede
Show file tree
Hide file tree
Showing 48 changed files with 1,289 additions and 338 deletions.
6 changes: 6 additions & 0 deletions graphql/documents/queries/plugins.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ query Plugins {
name
description
}

hooks {
name
description
hooks
}
}
}

Expand Down
8 changes: 8 additions & 0 deletions graphql/schema/types/plugin.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ type Plugin {
version: String

tasks: [PluginTask!]
hooks: [PluginHook!]
}

type PluginTask {
Expand All @@ -15,6 +16,13 @@ type PluginTask {
plugin: Plugin!
}

type PluginHook {
name: String!
description: String
hooks: [String!]
plugin: Plugin!
}

type PluginResult {
error: String
result: String
Expand Down
9 changes: 9 additions & 0 deletions pkg/api/changeset_translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,15 @@ func (t changesetTranslator) hasField(field string) bool {
return found
}

func (t changesetTranslator) getFields() []string {
var ret []string
for k := range t.inputMap {
ret = append(ret, k)
}

return ret
}

func (t changesetTranslator) nullString(value *string, field string) *sql.NullString {
if !t.hasField(field) {
return nil
Expand Down
17 changes: 8 additions & 9 deletions pkg/api/context_keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@ package api
type key int

const (
galleryKey key = 0
performerKey key = 1
sceneKey key = 2
studioKey key = 3
movieKey key = 4
ContextUser key = 5
tagKey key = 6
downloadKey key = 7
imageKey key = 8
galleryKey key = iota
performerKey
sceneKey
studioKey
movieKey
tagKey
downloadKey
imageKey
)
8 changes: 7 additions & 1 deletion pkg/api/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,16 @@ import (

"github.com/stashapp/stash/pkg/logger"
"github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/plugin"
)

type hookExecutor interface {
ExecutePostHooks(ctx context.Context, id int, hookType plugin.HookTriggerEnum, input interface{}, inputFields []string)
}

type Resolver struct {
txnManager models.TransactionManager
txnManager models.TransactionManager
hookExecutor hookExecutor
}

func (r *Resolver) Gallery() models.GalleryResolver {
Expand Down
62 changes: 58 additions & 4 deletions pkg/api/resolver_mutation_gallery.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,21 @@ import (

"github.com/stashapp/stash/pkg/manager"
"github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/plugin"
"github.com/stashapp/stash/pkg/utils"
)

func (r *mutationResolver) getGallery(ctx context.Context, id int) (ret *models.Gallery, err error) {
if err := r.withReadTxn(ctx, func(repo models.ReaderRepository) error {
ret, err = repo.Gallery().Find(id)
return err
}); err != nil {
return nil, err
}

return ret, nil
}

func (r *mutationResolver) GalleryCreate(ctx context.Context, input models.GalleryCreateInput) (*models.Gallery, error) {
// name must be provided
if input.Title == "" {
Expand Down Expand Up @@ -90,7 +102,8 @@ func (r *mutationResolver) GalleryCreate(ctx context.Context, input models.Galle
return nil, err
}

return gallery, nil
r.hookExecutor.ExecutePostHooks(ctx, gallery.ID, plugin.GalleryCreatePost, input, nil)
return r.getGallery(ctx, gallery.ID)
}

func (r *mutationResolver) updateGalleryPerformers(qb models.GalleryReaderWriter, galleryID int, performerIDs []string) error {
Expand Down Expand Up @@ -130,7 +143,9 @@ func (r *mutationResolver) GalleryUpdate(ctx context.Context, input models.Galle
return nil, err
}

return ret, nil
// execute post hooks outside txn
r.hookExecutor.ExecutePostHooks(ctx, ret.ID, plugin.GalleryUpdatePost, input, translator.getFields())
return r.getGallery(ctx, ret.ID)
}

func (r *mutationResolver) GalleriesUpdate(ctx context.Context, input []*models.GalleryUpdateInput) (ret []*models.Gallery, err error) {
Expand All @@ -156,7 +171,23 @@ func (r *mutationResolver) GalleriesUpdate(ctx context.Context, input []*models.
return nil, err
}

return ret, nil
// execute post hooks outside txn
var newRet []*models.Gallery
for i, gallery := range ret {
translator := changesetTranslator{
inputMap: inputMaps[i],
}

r.hookExecutor.ExecutePostHooks(ctx, gallery.ID, plugin.GalleryUpdatePost, input, translator.getFields())
gallery, err = r.getGallery(ctx, gallery.ID)
if err != nil {
return nil, err
}

newRet = append(newRet, gallery)
}

return newRet, nil
}

func (r *mutationResolver) galleryUpdate(input models.GalleryUpdateInput, translator changesetTranslator, repo models.Repository) (*models.Gallery, error) {
Expand Down Expand Up @@ -314,7 +345,20 @@ func (r *mutationResolver) BulkGalleryUpdate(ctx context.Context, input models.B
return nil, err
}

return ret, nil
// execute post hooks outside of txn
var newRet []*models.Gallery
for _, gallery := range ret {
r.hookExecutor.ExecutePostHooks(ctx, gallery.ID, plugin.GalleryUpdatePost, input, translator.getFields())

gallery, err := r.getGallery(ctx, gallery.ID)
if err != nil {
return nil, err
}

newRet = append(newRet, gallery)
}

return newRet, nil
}

func adjustGalleryPerformerIDs(qb models.GalleryReader, galleryID int, ids models.BulkUpdateIds) (ret []int, err error) {
Expand Down Expand Up @@ -438,6 +482,16 @@ func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.Gall
}
}

// call post hook after performing the other actions
for _, gallery := range galleries {
r.hookExecutor.ExecutePostHooks(ctx, gallery.ID, plugin.GalleryDestroyPost, input, nil)
}

// call image destroy post hook as well
for _, img := range imgsToDelete {
r.hookExecutor.ExecutePostHooks(ctx, img.ID, plugin.ImageDestroyPost, nil, nil)
}

return true, nil
}

Expand Down
55 changes: 52 additions & 3 deletions pkg/api/resolver_mutation_image.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,21 @@ import (

"github.com/stashapp/stash/pkg/manager"
"github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/plugin"
"github.com/stashapp/stash/pkg/utils"
)

func (r *mutationResolver) getImage(ctx context.Context, id int) (ret *models.Image, err error) {
if err := r.withReadTxn(ctx, func(repo models.ReaderRepository) error {
ret, err = repo.Image().Find(id)
return err
}); err != nil {
return nil, err
}

return ret, nil
}

func (r *mutationResolver) ImageUpdate(ctx context.Context, input models.ImageUpdateInput) (ret *models.Image, err error) {
translator := changesetTranslator{
inputMap: getUpdateInputMap(ctx),
Expand All @@ -24,7 +36,9 @@ func (r *mutationResolver) ImageUpdate(ctx context.Context, input models.ImageUp
return nil, err
}

return ret, nil
// execute post hooks outside txn
r.hookExecutor.ExecutePostHooks(ctx, ret.ID, plugin.ImageUpdatePost, input, translator.getFields())
return r.getImage(ctx, ret.ID)
}

func (r *mutationResolver) ImagesUpdate(ctx context.Context, input []*models.ImageUpdateInput) (ret []*models.Image, err error) {
Expand All @@ -50,7 +64,23 @@ func (r *mutationResolver) ImagesUpdate(ctx context.Context, input []*models.Ima
return nil, err
}

return ret, nil
// execute post hooks outside txn
var newRet []*models.Image
for i, image := range ret {
translator := changesetTranslator{
inputMap: inputMaps[i],
}

r.hookExecutor.ExecutePostHooks(ctx, image.ID, plugin.ImageUpdatePost, input, translator.getFields())
image, err = r.getImage(ctx, image.ID)
if err != nil {
return nil, err
}

newRet = append(newRet, image)
}

return newRet, nil
}

func (r *mutationResolver) imageUpdate(input models.ImageUpdateInput, translator changesetTranslator, repo models.Repository) (*models.Image, error) {
Expand Down Expand Up @@ -202,7 +232,20 @@ func (r *mutationResolver) BulkImageUpdate(ctx context.Context, input models.Bul
return nil, err
}

return ret, nil
// execute post hooks outside of txn
var newRet []*models.Image
for _, image := range ret {
r.hookExecutor.ExecutePostHooks(ctx, image.ID, plugin.ImageUpdatePost, input, translator.getFields())

image, err = r.getImage(ctx, image.ID)
if err != nil {
return nil, err
}

newRet = append(newRet, image)
}

return newRet, nil
}

func adjustImageGalleryIDs(qb models.ImageReader, imageID int, ids models.BulkUpdateIds) (ret []int, err error) {
Expand Down Expand Up @@ -268,6 +311,9 @@ func (r *mutationResolver) ImageDestroy(ctx context.Context, input models.ImageD
manager.DeleteImageFile(image)
}

// call post hook after performing the other actions
r.hookExecutor.ExecutePostHooks(ctx, image.ID, plugin.ImageDestroyPost, input, nil)

return true, nil
}

Expand Down Expand Up @@ -315,6 +361,9 @@ func (r *mutationResolver) ImagesDestroy(ctx context.Context, input models.Image
if input.DeleteFile != nil && *input.DeleteFile {
manager.DeleteImageFile(image)
}

// call post hook after performing the other actions
r.hookExecutor.ExecutePostHooks(ctx, image.ID, plugin.ImageDestroyPost, input, nil)
}

return true, nil
Expand Down
16 changes: 8 additions & 8 deletions pkg/api/resolver_mutation_metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (
)

func (r *mutationResolver) MetadataScan(ctx context.Context, input models.ScanMetadataInput) (string, error) {
jobID, err := manager.GetInstance().Scan(input)
jobID, err := manager.GetInstance().Scan(ctx, input)

if err != nil {
return "", err
Expand All @@ -27,7 +27,7 @@ func (r *mutationResolver) MetadataScan(ctx context.Context, input models.ScanMe
}

func (r *mutationResolver) MetadataImport(ctx context.Context) (string, error) {
jobID, err := manager.GetInstance().Import()
jobID, err := manager.GetInstance().Import(ctx)
if err != nil {
return "", err
}
Expand All @@ -41,13 +41,13 @@ func (r *mutationResolver) ImportObjects(ctx context.Context, input models.Impor
return "", err
}

jobID := manager.GetInstance().RunSingleTask(t)
jobID := manager.GetInstance().RunSingleTask(ctx, t)

return strconv.Itoa(jobID), nil
}

func (r *mutationResolver) MetadataExport(ctx context.Context) (string, error) {
jobID, err := manager.GetInstance().Export()
jobID, err := manager.GetInstance().Export(ctx)
if err != nil {
return "", err
}
Expand Down Expand Up @@ -75,7 +75,7 @@ func (r *mutationResolver) ExportObjects(ctx context.Context, input models.Expor
}

func (r *mutationResolver) MetadataGenerate(ctx context.Context, input models.GenerateMetadataInput) (string, error) {
jobID, err := manager.GetInstance().Generate(input)
jobID, err := manager.GetInstance().Generate(ctx, input)

if err != nil {
return "", err
Expand All @@ -85,17 +85,17 @@ func (r *mutationResolver) MetadataGenerate(ctx context.Context, input models.Ge
}

func (r *mutationResolver) MetadataAutoTag(ctx context.Context, input models.AutoTagMetadataInput) (string, error) {
jobID := manager.GetInstance().AutoTag(input)
jobID := manager.GetInstance().AutoTag(ctx, input)
return strconv.Itoa(jobID), nil
}

func (r *mutationResolver) MetadataClean(ctx context.Context, input models.CleanMetadataInput) (string, error) {
jobID := manager.GetInstance().Clean(input)
jobID := manager.GetInstance().Clean(ctx, input)
return strconv.Itoa(jobID), nil
}

func (r *mutationResolver) MigrateHashNaming(ctx context.Context) (string, error) {
jobID := manager.GetInstance().MigrateHash()
jobID := manager.GetInstance().MigrateHash(ctx)
return strconv.Itoa(jobID), nil
}

Expand Down
Loading

0 comments on commit 46bbede

Please sign in to comment.