mirror of https://github.com/stashapp/stash.git
Merge pull request #100 from WithoutPants/delete_performer_studio
Add delete for performers and studios
This commit is contained in:
commit
1d0780aa88
|
@ -82,4 +82,8 @@ mutation PerformerUpdate(
|
|||
}) {
|
||||
...PerformerData
|
||||
}
|
||||
}
|
||||
|
||||
mutation PerformerDestroy($id: ID!) {
|
||||
performerDestroy(input: { id: $id })
|
||||
}
|
|
@ -17,4 +17,8 @@ mutation StudioUpdate(
|
|||
studioUpdate(input: { id: $id, name: $name, url: $url, image: $image }) {
|
||||
...StudioData
|
||||
}
|
||||
}
|
||||
|
||||
mutation StudioDestroy($id: ID!) {
|
||||
studioDestroy(input: { id: $id })
|
||||
}
|
|
@ -79,9 +79,11 @@ type Mutation {
|
|||
|
||||
performerCreate(input: PerformerCreateInput!): Performer
|
||||
performerUpdate(input: PerformerUpdateInput!): Performer
|
||||
performerDestroy(input: PerformerDestroyInput!): Boolean!
|
||||
|
||||
studioCreate(input: StudioCreateInput!): Studio
|
||||
studioUpdate(input: StudioUpdateInput!): Studio
|
||||
studioDestroy(input: StudioDestroyInput!): Boolean!
|
||||
|
||||
tagCreate(input: TagCreateInput!): Tag
|
||||
tagUpdate(input: TagUpdateInput!): Tag
|
||||
|
|
|
@ -66,6 +66,10 @@ input PerformerUpdateInput {
|
|||
image: String
|
||||
}
|
||||
|
||||
input PerformerDestroyInput {
|
||||
id: ID!
|
||||
}
|
||||
|
||||
type FindPerformersResultType {
|
||||
count: Int!
|
||||
performers: [Performer!]!
|
||||
|
|
|
@ -23,6 +23,10 @@ input StudioUpdateInput {
|
|||
image: String
|
||||
}
|
||||
|
||||
input StudioDestroyInput {
|
||||
id: ID!
|
||||
}
|
||||
|
||||
type FindStudiosResultType {
|
||||
count: Int!
|
||||
studios: [Studio!]!
|
||||
|
|
|
@ -175,3 +175,17 @@ func (r *mutationResolver) PerformerUpdate(ctx context.Context, input models.Per
|
|||
|
||||
return performer, nil
|
||||
}
|
||||
|
||||
func (r *mutationResolver) PerformerDestroy(ctx context.Context, input models.PerformerDestroyInput) (bool, error) {
|
||||
qb := models.NewPerformerQueryBuilder()
|
||||
tx := database.DB.MustBeginTx(ctx, nil)
|
||||
if err := qb.Destroy(input.ID, tx); err != nil {
|
||||
_ = tx.Rollback()
|
||||
return false, err
|
||||
}
|
||||
if err := tx.Commit(); err != nil {
|
||||
return false, err
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -3,11 +3,12 @@ package api
|
|||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/stashapp/stash/pkg/database"
|
||||
"github.com/stashapp/stash/pkg/models"
|
||||
"github.com/stashapp/stash/pkg/utils"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (r *mutationResolver) StudioCreate(ctx context.Context, input models.StudioCreateInput) (*models.Studio, error) {
|
||||
|
@ -85,3 +86,16 @@ func (r *mutationResolver) StudioUpdate(ctx context.Context, input models.Studio
|
|||
|
||||
return studio, nil
|
||||
}
|
||||
|
||||
func (r *mutationResolver) StudioDestroy(ctx context.Context, input models.StudioDestroyInput) (bool, error) {
|
||||
qb := models.NewStudioQueryBuilder()
|
||||
tx := database.DB.MustBeginTx(ctx, nil)
|
||||
if err := qb.Destroy(input.ID, tx); err != nil {
|
||||
_ = tx.Rollback()
|
||||
return false, err
|
||||
}
|
||||
if err := tx.Commit(); err != nil {
|
||||
return false, err
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
|
|
@ -108,12 +108,14 @@ type ComplexityRoot struct {
|
|||
Mutation struct {
|
||||
ConfigureGeneral func(childComplexity int, input ConfigGeneralInput) int
|
||||
PerformerCreate func(childComplexity int, input PerformerCreateInput) int
|
||||
PerformerDestroy func(childComplexity int, input PerformerDestroyInput) int
|
||||
PerformerUpdate func(childComplexity int, input PerformerUpdateInput) int
|
||||
SceneMarkerCreate func(childComplexity int, input SceneMarkerCreateInput) int
|
||||
SceneMarkerDestroy func(childComplexity int, id string) int
|
||||
SceneMarkerUpdate func(childComplexity int, input SceneMarkerUpdateInput) int
|
||||
SceneUpdate func(childComplexity int, input SceneUpdateInput) int
|
||||
StudioCreate func(childComplexity int, input StudioCreateInput) int
|
||||
StudioDestroy func(childComplexity int, input StudioDestroyInput) int
|
||||
StudioUpdate func(childComplexity int, input StudioUpdateInput) int
|
||||
TagCreate func(childComplexity int, input TagCreateInput) int
|
||||
TagDestroy func(childComplexity int, input TagDestroyInput) int
|
||||
|
@ -288,8 +290,10 @@ type MutationResolver interface {
|
|||
SceneMarkerDestroy(ctx context.Context, id string) (bool, error)
|
||||
PerformerCreate(ctx context.Context, input PerformerCreateInput) (*Performer, error)
|
||||
PerformerUpdate(ctx context.Context, input PerformerUpdateInput) (*Performer, error)
|
||||
PerformerDestroy(ctx context.Context, input PerformerDestroyInput) (bool, error)
|
||||
StudioCreate(ctx context.Context, input StudioCreateInput) (*Studio, error)
|
||||
StudioUpdate(ctx context.Context, input StudioUpdateInput) (*Studio, error)
|
||||
StudioDestroy(ctx context.Context, input StudioDestroyInput) (bool, error)
|
||||
TagCreate(ctx context.Context, input TagCreateInput) (*Tag, error)
|
||||
TagUpdate(ctx context.Context, input TagUpdateInput) (*Tag, error)
|
||||
TagDestroy(ctx context.Context, input TagDestroyInput) (bool, error)
|
||||
|
@ -598,6 +602,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
|
|||
|
||||
return e.complexity.Mutation.PerformerCreate(childComplexity, args["input"].(PerformerCreateInput)), true
|
||||
|
||||
case "Mutation.performerDestroy":
|
||||
if e.complexity.Mutation.PerformerDestroy == nil {
|
||||
break
|
||||
}
|
||||
|
||||
args, err := ec.field_Mutation_performerDestroy_args(context.TODO(), rawArgs)
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
|
||||
return e.complexity.Mutation.PerformerDestroy(childComplexity, args["input"].(PerformerDestroyInput)), true
|
||||
|
||||
case "Mutation.performerUpdate":
|
||||
if e.complexity.Mutation.PerformerUpdate == nil {
|
||||
break
|
||||
|
@ -670,6 +686,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
|
|||
|
||||
return e.complexity.Mutation.StudioCreate(childComplexity, args["input"].(StudioCreateInput)), true
|
||||
|
||||
case "Mutation.studioDestroy":
|
||||
if e.complexity.Mutation.StudioDestroy == nil {
|
||||
break
|
||||
}
|
||||
|
||||
args, err := ec.field_Mutation_studioDestroy_args(context.TODO(), rawArgs)
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
|
||||
return e.complexity.Mutation.StudioDestroy(childComplexity, args["input"].(StudioDestroyInput)), true
|
||||
|
||||
case "Mutation.studioUpdate":
|
||||
if e.complexity.Mutation.StudioUpdate == nil {
|
||||
break
|
||||
|
@ -1840,9 +1868,11 @@ type Mutation {
|
|||
|
||||
performerCreate(input: PerformerCreateInput!): Performer
|
||||
performerUpdate(input: PerformerUpdateInput!): Performer
|
||||
performerDestroy(input: PerformerDestroyInput!): Boolean!
|
||||
|
||||
studioCreate(input: StudioCreateInput!): Studio
|
||||
studioUpdate(input: StudioUpdateInput!): Studio
|
||||
studioDestroy(input: StudioDestroyInput!): Boolean!
|
||||
|
||||
tagCreate(input: TagCreateInput!): Tag
|
||||
tagUpdate(input: TagUpdateInput!): Tag
|
||||
|
@ -2054,6 +2084,10 @@ input PerformerUpdateInput {
|
|||
image: String
|
||||
}
|
||||
|
||||
input PerformerDestroyInput {
|
||||
id: ID!
|
||||
}
|
||||
|
||||
type FindPerformersResultType {
|
||||
count: Int!
|
||||
performers: [Performer!]!
|
||||
|
@ -2212,6 +2246,10 @@ input StudioUpdateInput {
|
|||
image: String
|
||||
}
|
||||
|
||||
input StudioDestroyInput {
|
||||
id: ID!
|
||||
}
|
||||
|
||||
type FindStudiosResultType {
|
||||
count: Int!
|
||||
studios: [Studio!]!
|
||||
|
@ -2270,6 +2308,20 @@ func (ec *executionContext) field_Mutation_performerCreate_args(ctx context.Cont
|
|||
return args, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) field_Mutation_performerDestroy_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
|
||||
var err error
|
||||
args := map[string]interface{}{}
|
||||
var arg0 PerformerDestroyInput
|
||||
if tmp, ok := rawArgs["input"]; ok {
|
||||
arg0, err = ec.unmarshalNPerformerDestroyInput2githubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐPerformerDestroyInput(ctx, tmp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
args["input"] = arg0
|
||||
return args, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) field_Mutation_performerUpdate_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
|
||||
var err error
|
||||
args := map[string]interface{}{}
|
||||
|
@ -2354,6 +2406,20 @@ func (ec *executionContext) field_Mutation_studioCreate_args(ctx context.Context
|
|||
return args, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) field_Mutation_studioDestroy_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
|
||||
var err error
|
||||
args := map[string]interface{}{}
|
||||
var arg0 StudioDestroyInput
|
||||
if tmp, ok := rawArgs["input"]; ok {
|
||||
arg0, err = ec.unmarshalNStudioDestroyInput2githubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐStudioDestroyInput(ctx, tmp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
args["input"] = arg0
|
||||
return args, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) field_Mutation_studioUpdate_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
|
||||
var err error
|
||||
args := map[string]interface{}{}
|
||||
|
@ -3625,6 +3691,40 @@ func (ec *executionContext) _Mutation_performerUpdate(ctx context.Context, field
|
|||
return ec.marshalOPerformer2ᚖgithubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐPerformer(ctx, field.Selections, res)
|
||||
}
|
||||
|
||||
func (ec *executionContext) _Mutation_performerDestroy(ctx context.Context, field graphql.CollectedField) graphql.Marshaler {
|
||||
ctx = ec.Tracer.StartFieldExecution(ctx, field)
|
||||
defer func() { ec.Tracer.EndFieldExecution(ctx) }()
|
||||
rctx := &graphql.ResolverContext{
|
||||
Object: "Mutation",
|
||||
Field: field,
|
||||
Args: nil,
|
||||
IsMethod: true,
|
||||
}
|
||||
ctx = graphql.WithResolverContext(ctx, rctx)
|
||||
rawArgs := field.ArgumentMap(ec.Variables)
|
||||
args, err := ec.field_Mutation_performerDestroy_args(ctx, rawArgs)
|
||||
if err != nil {
|
||||
ec.Error(ctx, err)
|
||||
return graphql.Null
|
||||
}
|
||||
rctx.Args = args
|
||||
ctx = ec.Tracer.StartFieldResolverExecution(ctx, rctx)
|
||||
resTmp := ec.FieldMiddleware(ctx, nil, func(rctx context.Context) (interface{}, error) {
|
||||
ctx = rctx // use context from middleware stack in children
|
||||
return ec.resolvers.Mutation().PerformerDestroy(rctx, args["input"].(PerformerDestroyInput))
|
||||
})
|
||||
if resTmp == nil {
|
||||
if !ec.HasError(rctx) {
|
||||
ec.Errorf(ctx, "must not be null")
|
||||
}
|
||||
return graphql.Null
|
||||
}
|
||||
res := resTmp.(bool)
|
||||
rctx.Result = res
|
||||
ctx = ec.Tracer.StartFieldChildExecution(ctx)
|
||||
return ec.marshalNBoolean2bool(ctx, field.Selections, res)
|
||||
}
|
||||
|
||||
func (ec *executionContext) _Mutation_studioCreate(ctx context.Context, field graphql.CollectedField) graphql.Marshaler {
|
||||
ctx = ec.Tracer.StartFieldExecution(ctx, field)
|
||||
defer func() { ec.Tracer.EndFieldExecution(ctx) }()
|
||||
|
@ -3687,6 +3787,40 @@ func (ec *executionContext) _Mutation_studioUpdate(ctx context.Context, field gr
|
|||
return ec.marshalOStudio2ᚖgithubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐStudio(ctx, field.Selections, res)
|
||||
}
|
||||
|
||||
func (ec *executionContext) _Mutation_studioDestroy(ctx context.Context, field graphql.CollectedField) graphql.Marshaler {
|
||||
ctx = ec.Tracer.StartFieldExecution(ctx, field)
|
||||
defer func() { ec.Tracer.EndFieldExecution(ctx) }()
|
||||
rctx := &graphql.ResolverContext{
|
||||
Object: "Mutation",
|
||||
Field: field,
|
||||
Args: nil,
|
||||
IsMethod: true,
|
||||
}
|
||||
ctx = graphql.WithResolverContext(ctx, rctx)
|
||||
rawArgs := field.ArgumentMap(ec.Variables)
|
||||
args, err := ec.field_Mutation_studioDestroy_args(ctx, rawArgs)
|
||||
if err != nil {
|
||||
ec.Error(ctx, err)
|
||||
return graphql.Null
|
||||
}
|
||||
rctx.Args = args
|
||||
ctx = ec.Tracer.StartFieldResolverExecution(ctx, rctx)
|
||||
resTmp := ec.FieldMiddleware(ctx, nil, func(rctx context.Context) (interface{}, error) {
|
||||
ctx = rctx // use context from middleware stack in children
|
||||
return ec.resolvers.Mutation().StudioDestroy(rctx, args["input"].(StudioDestroyInput))
|
||||
})
|
||||
if resTmp == nil {
|
||||
if !ec.HasError(rctx) {
|
||||
ec.Errorf(ctx, "must not be null")
|
||||
}
|
||||
return graphql.Null
|
||||
}
|
||||
res := resTmp.(bool)
|
||||
rctx.Result = res
|
||||
ctx = ec.Tracer.StartFieldChildExecution(ctx)
|
||||
return ec.marshalNBoolean2bool(ctx, field.Selections, res)
|
||||
}
|
||||
|
||||
func (ec *executionContext) _Mutation_tagCreate(ctx context.Context, field graphql.CollectedField) graphql.Marshaler {
|
||||
ctx = ec.Tracer.StartFieldExecution(ctx, field)
|
||||
defer func() { ec.Tracer.EndFieldExecution(ctx) }()
|
||||
|
@ -8131,6 +8265,24 @@ func (ec *executionContext) unmarshalInputPerformerCreateInput(ctx context.Conte
|
|||
return it, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) unmarshalInputPerformerDestroyInput(ctx context.Context, v interface{}) (PerformerDestroyInput, error) {
|
||||
var it PerformerDestroyInput
|
||||
var asMap = v.(map[string]interface{})
|
||||
|
||||
for k, v := range asMap {
|
||||
switch k {
|
||||
case "id":
|
||||
var err error
|
||||
it.ID, err = ec.unmarshalNID2string(ctx, v)
|
||||
if err != nil {
|
||||
return it, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return it, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) unmarshalInputPerformerFilterType(ctx context.Context, v interface{}) (PerformerFilterType, error) {
|
||||
var it PerformerFilterType
|
||||
var asMap = v.(map[string]interface{})
|
||||
|
@ -8557,6 +8709,24 @@ func (ec *executionContext) unmarshalInputStudioCreateInput(ctx context.Context,
|
|||
return it, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) unmarshalInputStudioDestroyInput(ctx context.Context, v interface{}) (StudioDestroyInput, error) {
|
||||
var it StudioDestroyInput
|
||||
var asMap = v.(map[string]interface{})
|
||||
|
||||
for k, v := range asMap {
|
||||
switch k {
|
||||
case "id":
|
||||
var err error
|
||||
it.ID, err = ec.unmarshalNID2string(ctx, v)
|
||||
if err != nil {
|
||||
return it, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return it, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) unmarshalInputStudioUpdateInput(ctx context.Context, v interface{}) (StudioUpdateInput, error) {
|
||||
var it StudioUpdateInput
|
||||
var asMap = v.(map[string]interface{})
|
||||
|
@ -9045,10 +9215,20 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet)
|
|||
out.Values[i] = ec._Mutation_performerCreate(ctx, field)
|
||||
case "performerUpdate":
|
||||
out.Values[i] = ec._Mutation_performerUpdate(ctx, field)
|
||||
case "performerDestroy":
|
||||
out.Values[i] = ec._Mutation_performerDestroy(ctx, field)
|
||||
if out.Values[i] == graphql.Null {
|
||||
invalids++
|
||||
}
|
||||
case "studioCreate":
|
||||
out.Values[i] = ec._Mutation_studioCreate(ctx, field)
|
||||
case "studioUpdate":
|
||||
out.Values[i] = ec._Mutation_studioUpdate(ctx, field)
|
||||
case "studioDestroy":
|
||||
out.Values[i] = ec._Mutation_studioDestroy(ctx, field)
|
||||
if out.Values[i] == graphql.Null {
|
||||
invalids++
|
||||
}
|
||||
case "tagCreate":
|
||||
out.Values[i] = ec._Mutation_tagCreate(ctx, field)
|
||||
case "tagUpdate":
|
||||
|
@ -11010,6 +11190,10 @@ func (ec *executionContext) unmarshalNPerformerCreateInput2githubᚗcomᚋstasha
|
|||
return ec.unmarshalInputPerformerCreateInput(ctx, v)
|
||||
}
|
||||
|
||||
func (ec *executionContext) unmarshalNPerformerDestroyInput2githubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐPerformerDestroyInput(ctx context.Context, v interface{}) (PerformerDestroyInput, error) {
|
||||
return ec.unmarshalInputPerformerDestroyInput(ctx, v)
|
||||
}
|
||||
|
||||
func (ec *executionContext) unmarshalNPerformerUpdateInput2githubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐPerformerUpdateInput(ctx context.Context, v interface{}) (PerformerUpdateInput, error) {
|
||||
return ec.unmarshalInputPerformerUpdateInput(ctx, v)
|
||||
}
|
||||
|
@ -11319,6 +11503,10 @@ func (ec *executionContext) unmarshalNStudioCreateInput2githubᚗcomᚋstashapp
|
|||
return ec.unmarshalInputStudioCreateInput(ctx, v)
|
||||
}
|
||||
|
||||
func (ec *executionContext) unmarshalNStudioDestroyInput2githubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐStudioDestroyInput(ctx context.Context, v interface{}) (StudioDestroyInput, error) {
|
||||
return ec.unmarshalInputStudioDestroyInput(ctx, v)
|
||||
}
|
||||
|
||||
func (ec *executionContext) unmarshalNStudioUpdateInput2githubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐStudioUpdateInput(ctx context.Context, v interface{}) (StudioUpdateInput, error) {
|
||||
return ec.unmarshalInputStudioUpdateInput(ctx, v)
|
||||
}
|
||||
|
|
|
@ -109,6 +109,10 @@ type PerformerCreateInput struct {
|
|||
Image string `json:"image"`
|
||||
}
|
||||
|
||||
type PerformerDestroyInput struct {
|
||||
ID string `json:"id"`
|
||||
}
|
||||
|
||||
type PerformerFilterType struct {
|
||||
// Filter by favorite
|
||||
FilterFavorites *bool `json:"filter_favorites"`
|
||||
|
@ -254,6 +258,10 @@ type StudioCreateInput struct {
|
|||
Image string `json:"image"`
|
||||
}
|
||||
|
||||
type StudioDestroyInput struct {
|
||||
ID string `json:"id"`
|
||||
}
|
||||
|
||||
type StudioUpdateInput struct {
|
||||
ID string `json:"id"`
|
||||
Name *string `json:"name"`
|
||||
|
|
|
@ -2,6 +2,7 @@ package models
|
|||
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/stashapp/stash/pkg/database"
|
||||
)
|
||||
|
@ -54,6 +55,15 @@ func (qb *PerformerQueryBuilder) Update(updatedPerformer Performer, tx *sqlx.Tx)
|
|||
return &updatedPerformer, nil
|
||||
}
|
||||
|
||||
func (qb *PerformerQueryBuilder) Destroy(id string, tx *sqlx.Tx) error {
|
||||
_, err := tx.Exec("DELETE FROM performers_scenes WHERE performer_id = ?", id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return executeDeleteQuery("performers", id, tx)
|
||||
}
|
||||
|
||||
func (qb *PerformerQueryBuilder) Find(id int) (*Performer, error) {
|
||||
query := "SELECT * FROM performers WHERE id = ? LIMIT 1"
|
||||
args := []interface{}{id}
|
||||
|
|
|
@ -2,6 +2,7 @@ package models
|
|||
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/stashapp/stash/pkg/database"
|
||||
)
|
||||
|
@ -50,6 +51,22 @@ func (qb *StudioQueryBuilder) Update(updatedStudio Studio, tx *sqlx.Tx) (*Studio
|
|||
return &updatedStudio, nil
|
||||
}
|
||||
|
||||
func (qb *StudioQueryBuilder) Destroy(id string, tx *sqlx.Tx) error {
|
||||
// remove studio from scenes
|
||||
_, err := tx.Exec("UPDATE scenes SET studio_id = null WHERE studio_id = ?", id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// remove studio from scraped items
|
||||
_, err = tx.Exec("UPDATE scraped_items SET studio_id = null WHERE studio_id = ?", id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return executeDeleteQuery("studios", id, tx)
|
||||
}
|
||||
|
||||
func (qb *StudioQueryBuilder) Find(id int, tx *sqlx.Tx) (*Studio, error) {
|
||||
query := "SELECT * FROM studios WHERE id = ? LIMIT 1"
|
||||
args := []interface{}{id}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import {
|
||||
Alert,
|
||||
Button,
|
||||
FileInput,
|
||||
Menu,
|
||||
|
@ -8,7 +9,7 @@ import {
|
|||
Popover,
|
||||
} from "@blueprintjs/core";
|
||||
import _ from "lodash";
|
||||
import React, { FunctionComponent } from "react";
|
||||
import React, { FunctionComponent, useState } from "react";
|
||||
import { Link } from "react-router-dom";
|
||||
import * as GQL from "../../core/generated-graphql";
|
||||
import { NavigationUtils } from "../../utils/navigation";
|
||||
|
@ -20,6 +21,7 @@ interface IProps {
|
|||
isEditing: boolean;
|
||||
onToggleEdit: () => void;
|
||||
onSave: () => void;
|
||||
onDelete: () => void;
|
||||
onImageChange: (event: React.FormEvent<HTMLInputElement>) => void;
|
||||
|
||||
// TODO: only for performers. make generic
|
||||
|
@ -27,6 +29,8 @@ interface IProps {
|
|||
}
|
||||
|
||||
export const DetailsEditNavbar: FunctionComponent<IProps> = (props: IProps) => {
|
||||
const [isDeleteAlertOpen, setIsDeleteAlertOpen] = useState<boolean>(false);
|
||||
|
||||
function renderEditButton() {
|
||||
if (props.isNew) { return; }
|
||||
return (
|
||||
|
@ -43,6 +47,11 @@ export const DetailsEditNavbar: FunctionComponent<IProps> = (props: IProps) => {
|
|||
return <Button intent="success" text="Save" onClick={() => props.onSave()} />;
|
||||
}
|
||||
|
||||
function renderDeleteButton() {
|
||||
if (props.isNew || props.isEditing) { return; }
|
||||
return <Button intent="danger" text="Delete" onClick={() => setIsDeleteAlertOpen(true)} />;
|
||||
}
|
||||
|
||||
function renderImageInput() {
|
||||
if (!props.isEditing) { return; }
|
||||
return <FileInput text="Choose image..." onInputChange={props.onImageChange} inputProps={{accept: ".jpg,.jpeg"}} />;
|
||||
|
@ -81,7 +90,37 @@ export const DetailsEditNavbar: FunctionComponent<IProps> = (props: IProps) => {
|
|||
);
|
||||
}
|
||||
|
||||
function renderDeleteAlert() {
|
||||
var name;
|
||||
|
||||
if (props.performer) {
|
||||
name = props.performer.name;
|
||||
}
|
||||
if (props.studio) {
|
||||
name = props.studio.name;
|
||||
}
|
||||
|
||||
return (
|
||||
<Alert
|
||||
cancelButtonText="Cancel"
|
||||
confirmButtonText="Delete"
|
||||
icon="trash"
|
||||
intent="danger"
|
||||
isOpen={isDeleteAlertOpen}
|
||||
onCancel={() => setIsDeleteAlertOpen(false)}
|
||||
onConfirm={() => props.onDelete()}
|
||||
>
|
||||
<p>
|
||||
Are you sure you want to delete {name}?
|
||||
</p>
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
{renderDeleteAlert()}
|
||||
<Navbar>
|
||||
<Navbar.Group>
|
||||
{renderEditButton()}
|
||||
|
@ -91,7 +130,9 @@ export const DetailsEditNavbar: FunctionComponent<IProps> = (props: IProps) => {
|
|||
{renderSaveButton()}
|
||||
|
||||
{renderScenesButton()}
|
||||
{renderDeleteButton()}
|
||||
</Navbar.Group>
|
||||
</Navbar>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -39,6 +39,7 @@ export const Studio: FunctionComponent<IProps> = (props: IProps) => {
|
|||
const { data, error, loading } = StashService.useFindStudio(props.match.params.id);
|
||||
const updateStudio = StashService.useStudioUpdate(getStudioInput() as GQL.StudioUpdateInput);
|
||||
const createStudio = StashService.useStudioCreate(getStudioInput() as GQL.StudioCreateInput);
|
||||
const deleteStudio = StashService.useStudioDestroy(getStudioInput() as GQL.StudioDestroyInput);
|
||||
|
||||
function updateStudioEditState(state: Partial<GQL.StudioDataFragment>) {
|
||||
setName(state.name);
|
||||
|
@ -95,6 +96,19 @@ export const Studio: FunctionComponent<IProps> = (props: IProps) => {
|
|||
setIsLoading(false);
|
||||
}
|
||||
|
||||
async function onDelete() {
|
||||
setIsLoading(true);
|
||||
try {
|
||||
const result = await deleteStudio();
|
||||
} catch (e) {
|
||||
ErrorUtils.handle(e);
|
||||
}
|
||||
setIsLoading(false);
|
||||
|
||||
// redirect to studios page
|
||||
props.history.push(`/studios`);
|
||||
}
|
||||
|
||||
function onImageChange(event: React.FormEvent<HTMLInputElement>) {
|
||||
const file: File = (event.target as any).files[0];
|
||||
const reader: FileReader = new FileReader();
|
||||
|
@ -120,6 +134,7 @@ export const Studio: FunctionComponent<IProps> = (props: IProps) => {
|
|||
isEditing={isEditing}
|
||||
onToggleEdit={() => { setIsEditing(!isEditing); updateStudioEditState(studio); }}
|
||||
onSave={onSave}
|
||||
onDelete={onDelete}
|
||||
onImageChange={onImageChange}
|
||||
/>
|
||||
<h1 className="bp3-heading">
|
||||
|
|
|
@ -55,6 +55,7 @@ export const Performer: FunctionComponent<IPerformerProps> = (props: IPerformerP
|
|||
const { data, error, loading } = StashService.useFindPerformer(props.match.params.id);
|
||||
const updatePerformer = StashService.usePerformerUpdate(getPerformerInput() as GQL.PerformerUpdateInput);
|
||||
const createPerformer = StashService.usePerformerCreate(getPerformerInput() as GQL.PerformerCreateInput);
|
||||
const deletePerformer = StashService.usePerformerDestroy(getPerformerInput() as GQL.PerformerDestroyInput);
|
||||
|
||||
function updatePerformerEditState(state: Partial<GQL.PerformerDataFragment | GQL.ScrapeFreeonesScrapeFreeones>) {
|
||||
if ((state as GQL.PerformerDataFragment).favorite !== undefined) {
|
||||
|
@ -141,6 +142,19 @@ export const Performer: FunctionComponent<IPerformerProps> = (props: IPerformerP
|
|||
setIsLoading(false);
|
||||
}
|
||||
|
||||
async function onDelete() {
|
||||
setIsLoading(true);
|
||||
try {
|
||||
const result = await deletePerformer();
|
||||
} catch (e) {
|
||||
ErrorUtils.handle(e);
|
||||
}
|
||||
setIsLoading(false);
|
||||
|
||||
// redirect to performers page
|
||||
props.history.push(`/performers`);
|
||||
}
|
||||
|
||||
function onImageChange(event: React.FormEvent<HTMLInputElement>) {
|
||||
const file: File = (event.target as any).files[0];
|
||||
const reader: FileReader = new FileReader();
|
||||
|
@ -218,6 +232,7 @@ export const Performer: FunctionComponent<IPerformerProps> = (props: IPerformerP
|
|||
isEditing={isEditing}
|
||||
onToggleEdit={() => { setIsEditing(!isEditing); updatePerformerEditState(performer); }}
|
||||
onSave={onSave}
|
||||
onDelete={onDelete}
|
||||
onImageChange={onImageChange}
|
||||
onDisplayFreeOnesDialog={onDisplayFreeOnesDialog}
|
||||
/>
|
||||
|
|
|
@ -133,6 +133,9 @@ export class StashService {
|
|||
public static usePerformerUpdate(input: GQL.PerformerUpdateInput) {
|
||||
return GQL.usePerformerUpdate({ variables: input });
|
||||
}
|
||||
public static usePerformerDestroy(input: GQL.PerformerDestroyInput) {
|
||||
return GQL.usePerformerDestroy({ variables: input });
|
||||
}
|
||||
|
||||
public static useSceneUpdate(input: GQL.SceneUpdateInput) {
|
||||
return GQL.useSceneUpdate({ variables: input });
|
||||
|
@ -144,6 +147,9 @@ export class StashService {
|
|||
public static useStudioUpdate(input: GQL.StudioUpdateInput) {
|
||||
return GQL.useStudioUpdate({ variables: input });
|
||||
}
|
||||
public static useStudioDestroy(input: GQL.StudioDestroyInput) {
|
||||
return GQL.useStudioDestroy({ variables: input });
|
||||
}
|
||||
|
||||
public static useTagCreate(input: GQL.TagCreateInput) {
|
||||
return GQL.useTagCreate({ variables: input, refetchQueries: ["AllTags"] });
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* tslint:disable */
|
||||
/* eslint-disable */
|
||||
// Generated in 2019-05-27T11:23:10-07:00
|
||||
// Generated in 2019-08-14T07:29:27+10:00
|
||||
export type Maybe<T> = T | undefined;
|
||||
|
||||
export interface SceneFilterType {
|
||||
|
@ -188,6 +188,10 @@ export interface PerformerUpdateInput {
|
|||
image?: Maybe<string>;
|
||||
}
|
||||
|
||||
export interface PerformerDestroyInput {
|
||||
id: string;
|
||||
}
|
||||
|
||||
export interface StudioCreateInput {
|
||||
name: string;
|
||||
|
||||
|
@ -206,6 +210,10 @@ export interface StudioUpdateInput {
|
|||
image?: Maybe<string>;
|
||||
}
|
||||
|
||||
export interface StudioDestroyInput {
|
||||
id: string;
|
||||
}
|
||||
|
||||
export interface TagCreateInput {
|
||||
name: string;
|
||||
}
|
||||
|
@ -326,6 +334,16 @@ export type PerformerUpdateMutation = {
|
|||
|
||||
export type PerformerUpdatePerformerUpdate = PerformerDataFragment;
|
||||
|
||||
export type PerformerDestroyVariables = {
|
||||
id: string;
|
||||
};
|
||||
|
||||
export type PerformerDestroyMutation = {
|
||||
__typename?: "Mutation";
|
||||
|
||||
performerDestroy: boolean;
|
||||
};
|
||||
|
||||
export type SceneMarkerCreateVariables = {
|
||||
title: string;
|
||||
seconds: number;
|
||||
|
@ -419,6 +437,16 @@ export type StudioUpdateMutation = {
|
|||
|
||||
export type StudioUpdateStudioUpdate = StudioDataFragment;
|
||||
|
||||
export type StudioDestroyVariables = {
|
||||
id: string;
|
||||
};
|
||||
|
||||
export type StudioDestroyMutation = {
|
||||
__typename?: "Mutation";
|
||||
|
||||
studioDestroy: boolean;
|
||||
};
|
||||
|
||||
export type TagCreateVariables = {
|
||||
name: string;
|
||||
};
|
||||
|
@ -1644,6 +1672,22 @@ export function usePerformerUpdate(
|
|||
PerformerUpdateVariables
|
||||
>(PerformerUpdateDocument, baseOptions);
|
||||
}
|
||||
export const PerformerDestroyDocument = gql`
|
||||
mutation PerformerDestroy($id: ID!) {
|
||||
performerDestroy(input: { id: $id })
|
||||
}
|
||||
`;
|
||||
export function usePerformerDestroy(
|
||||
baseOptions?: ReactApolloHooks.MutationHookOptions<
|
||||
PerformerDestroyMutation,
|
||||
PerformerDestroyVariables
|
||||
>
|
||||
) {
|
||||
return ReactApolloHooks.useMutation<
|
||||
PerformerDestroyMutation,
|
||||
PerformerDestroyVariables
|
||||
>(PerformerDestroyDocument, baseOptions);
|
||||
}
|
||||
export const SceneMarkerCreateDocument = gql`
|
||||
mutation SceneMarkerCreate(
|
||||
$title: String!
|
||||
|
@ -1814,6 +1858,22 @@ export function useStudioUpdate(
|
|||
StudioUpdateVariables
|
||||
>(StudioUpdateDocument, baseOptions);
|
||||
}
|
||||
export const StudioDestroyDocument = gql`
|
||||
mutation StudioDestroy($id: ID!) {
|
||||
studioDestroy(input: { id: $id })
|
||||
}
|
||||
`;
|
||||
export function useStudioDestroy(
|
||||
baseOptions?: ReactApolloHooks.MutationHookOptions<
|
||||
StudioDestroyMutation,
|
||||
StudioDestroyVariables
|
||||
>
|
||||
) {
|
||||
return ReactApolloHooks.useMutation<
|
||||
StudioDestroyMutation,
|
||||
StudioDestroyVariables
|
||||
>(StudioDestroyDocument, baseOptions);
|
||||
}
|
||||
export const TagCreateDocument = gql`
|
||||
mutation TagCreate($name: String!) {
|
||||
tagCreate(input: { name: $name }) {
|
||||
|
|
Loading…
Reference in New Issue