2019-02-09 12:30:49 +00:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2021-04-16 06:06:35 +00:00
|
|
|
"fmt"
|
2019-08-21 02:51:30 +00:00
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
|
2019-02-14 23:42:52 +00:00
|
|
|
"github.com/stashapp/stash/pkg/models"
|
2021-04-16 06:06:35 +00:00
|
|
|
"github.com/stashapp/stash/pkg/performer"
|
2021-06-11 07:24:58 +00:00
|
|
|
"github.com/stashapp/stash/pkg/plugin"
|
2022-03-17 00:33:59 +00:00
|
|
|
"github.com/stashapp/stash/pkg/sliceutil/stringslice"
|
2019-02-14 23:42:52 +00:00
|
|
|
"github.com/stashapp/stash/pkg/utils"
|
2019-02-09 12:30:49 +00:00
|
|
|
)
|
|
|
|
|
2021-06-11 07:24:58 +00:00
|
|
|
func (r *mutationResolver) getPerformer(ctx context.Context, id int) (ret *models.Performer, err error) {
|
2022-05-19 07:49:32 +00:00
|
|
|
if err := r.withTxn(ctx, func(ctx context.Context) error {
|
|
|
|
ret, err = r.repository.Performer.Find(ctx, id)
|
2021-06-11 07:24:58 +00:00
|
|
|
return err
|
|
|
|
}); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret, nil
|
|
|
|
}
|
|
|
|
|
2022-08-12 02:21:46 +00:00
|
|
|
func stashIDPtrSliceToSlice(v []*models.StashID) []models.StashID {
|
|
|
|
ret := make([]models.StashID, len(v))
|
|
|
|
for i, vv := range v {
|
|
|
|
c := vv
|
|
|
|
ret[i] = *c
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
2022-04-25 05:55:05 +00:00
|
|
|
func (r *mutationResolver) PerformerCreate(ctx context.Context, input PerformerCreateInput) (*models.Performer, error) {
|
2023-06-15 02:46:09 +00:00
|
|
|
translator := changesetTranslator{
|
|
|
|
inputMap: getUpdateInputMap(ctx),
|
2019-02-09 12:30:49 +00:00
|
|
|
}
|
|
|
|
|
2022-12-01 02:54:08 +00:00
|
|
|
tagIDs, err := stringslice.StringSliceToIntSlice(input.TagIds)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("converting tag ids: %w", err)
|
|
|
|
}
|
|
|
|
|
2019-02-09 12:30:49 +00:00
|
|
|
// Populate a new performer from the input
|
|
|
|
currentTime := time.Now()
|
|
|
|
newPerformer := models.Performer{
|
2023-06-15 02:46:09 +00:00
|
|
|
Name: input.Name,
|
|
|
|
Disambiguation: translator.string(input.Disambiguation, "disambiguation"),
|
|
|
|
URL: translator.string(input.URL, "url"),
|
|
|
|
Gender: input.Gender,
|
|
|
|
Ethnicity: translator.string(input.Ethnicity, "ethnicity"),
|
|
|
|
Country: translator.string(input.Country, "country"),
|
|
|
|
EyeColor: translator.string(input.EyeColor, "eye_color"),
|
|
|
|
Measurements: translator.string(input.Measurements, "measurements"),
|
|
|
|
FakeTits: translator.string(input.FakeTits, "fake_tits"),
|
|
|
|
PenisLength: input.PenisLength,
|
|
|
|
Circumcised: input.Circumcised,
|
|
|
|
CareerLength: translator.string(input.CareerLength, "career_length"),
|
|
|
|
Tattoos: translator.string(input.Tattoos, "tattoos"),
|
|
|
|
Piercings: translator.string(input.Piercings, "piercings"),
|
|
|
|
Twitter: translator.string(input.Twitter, "twitter"),
|
|
|
|
Instagram: translator.string(input.Instagram, "instagram"),
|
|
|
|
Favorite: translator.bool(input.Favorite, "favorite"),
|
|
|
|
Rating: translator.ratingConversionInt(input.Rating, input.Rating100),
|
|
|
|
Details: translator.string(input.Details, "details"),
|
|
|
|
HairColor: translator.string(input.HairColor, "hair_color"),
|
|
|
|
Weight: input.Weight,
|
|
|
|
IgnoreAutoTag: translator.bool(input.IgnoreAutoTag, "ignore_auto_tag"),
|
|
|
|
CreatedAt: currentTime,
|
|
|
|
UpdatedAt: currentTime,
|
|
|
|
TagIDs: models.NewRelatedIDs(tagIDs),
|
|
|
|
StashIDs: models.NewRelatedStashIDs(stashIDPtrSliceToSlice(input.StashIds)),
|
2020-03-31 22:36:38 +00:00
|
|
|
}
|
2023-06-15 02:46:09 +00:00
|
|
|
|
2023-07-13 02:15:02 +00:00
|
|
|
newPerformer.Birthdate, err = translator.datePtr(input.Birthdate, "birthdate")
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("converting birthdate: %w", err)
|
2019-02-09 12:30:49 +00:00
|
|
|
}
|
2023-07-13 02:15:02 +00:00
|
|
|
newPerformer.DeathDate, err = translator.datePtr(input.DeathDate, "death_date")
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("converting death date: %w", err)
|
2019-02-09 12:30:49 +00:00
|
|
|
}
|
2023-06-15 02:46:09 +00:00
|
|
|
|
2022-11-08 03:09:03 +00:00
|
|
|
// prefer height_cm over height
|
|
|
|
if input.HeightCm != nil {
|
|
|
|
newPerformer.Height = input.HeightCm
|
2023-06-15 02:46:09 +00:00
|
|
|
} else {
|
|
|
|
newPerformer.Height, err = translator.intPtrFromString(input.Height, "height")
|
2022-11-08 03:09:03 +00:00
|
|
|
if err != nil {
|
2023-06-15 02:46:09 +00:00
|
|
|
return nil, fmt.Errorf("converting height: %w", err)
|
2022-11-08 03:09:03 +00:00
|
|
|
}
|
2019-02-09 12:30:49 +00:00
|
|
|
}
|
2023-06-15 02:46:09 +00:00
|
|
|
|
2022-12-01 02:54:08 +00:00
|
|
|
if input.AliasList != nil {
|
|
|
|
newPerformer.Aliases = models.NewRelatedStrings(input.AliasList)
|
|
|
|
} else if input.Aliases != nil {
|
|
|
|
newPerformer.Aliases = models.NewRelatedStrings(stringslice.FromString(*input.Aliases, ","))
|
2019-02-09 12:30:49 +00:00
|
|
|
}
|
2021-04-16 06:06:35 +00:00
|
|
|
|
|
|
|
if err := performer.ValidateDeathDate(nil, input.Birthdate, input.DeathDate); err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
2019-02-09 12:30:49 +00:00
|
|
|
|
2023-06-15 02:46:09 +00:00
|
|
|
// Process the base 64 encoded image string
|
|
|
|
var imageData []byte
|
|
|
|
if input.Image != nil {
|
|
|
|
imageData, err = utils.ProcessImageInput(ctx, *input.Image)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-09 12:30:49 +00:00
|
|
|
// Start the transaction and save the performer
|
2022-05-19 07:49:32 +00:00
|
|
|
if err := r.withTxn(ctx, func(ctx context.Context) error {
|
|
|
|
qb := r.repository.Performer
|
2020-10-24 03:31:39 +00:00
|
|
|
|
2022-10-31 03:58:01 +00:00
|
|
|
err = qb.Create(ctx, &newPerformer)
|
2021-01-18 01:23:20 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
2020-06-22 23:19:19 +00:00
|
|
|
}
|
|
|
|
|
2021-01-18 01:23:20 +00:00
|
|
|
// update image table
|
|
|
|
if len(imageData) > 0 {
|
2022-10-31 03:58:01 +00:00
|
|
|
if err := qb.UpdateImage(ctx, newPerformer.ID, imageData); err != nil {
|
2021-01-18 01:23:20 +00:00
|
|
|
return err
|
2020-10-24 03:31:39 +00:00
|
|
|
}
|
|
|
|
}
|
2021-01-18 01:23:20 +00:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}); err != nil {
|
2019-02-09 12:30:49 +00:00
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2022-10-31 03:58:01 +00:00
|
|
|
r.hookExecutor.ExecutePostHooks(ctx, newPerformer.ID, plugin.PerformerCreatePost, input, nil)
|
|
|
|
return r.getPerformer(ctx, newPerformer.ID)
|
2019-02-09 12:30:49 +00:00
|
|
|
}
|
|
|
|
|
2022-04-25 05:55:05 +00:00
|
|
|
func (r *mutationResolver) PerformerUpdate(ctx context.Context, input PerformerUpdateInput) (*models.Performer, error) {
|
2023-06-15 02:46:09 +00:00
|
|
|
performerID, err := strconv.Atoi(input.ID)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2020-12-04 01:42:56 +00:00
|
|
|
|
2023-06-15 02:46:09 +00:00
|
|
|
// Populate performer from the input
|
2020-12-04 01:42:56 +00:00
|
|
|
translator := changesetTranslator{
|
|
|
|
inputMap: getUpdateInputMap(ctx),
|
|
|
|
}
|
|
|
|
|
2023-06-15 02:46:09 +00:00
|
|
|
updatedPerformer := models.NewPerformerPartial()
|
2020-12-04 01:42:56 +00:00
|
|
|
|
2022-12-01 02:54:08 +00:00
|
|
|
updatedPerformer.Name = translator.optionalString(input.Name, "name")
|
|
|
|
updatedPerformer.Disambiguation = translator.optionalString(input.Disambiguation, "disambiguation")
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.URL = translator.optionalString(input.URL, "url")
|
2023-06-15 02:46:09 +00:00
|
|
|
updatedPerformer.Gender = translator.optionalString((*string)(input.Gender), "gender")
|
2023-07-13 02:15:02 +00:00
|
|
|
updatedPerformer.Birthdate, err = translator.optionalDate(input.Birthdate, "birthdate")
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("converting birthdate: %w", err)
|
|
|
|
}
|
2023-06-15 02:46:09 +00:00
|
|
|
updatedPerformer.Ethnicity = translator.optionalString(input.Ethnicity, "ethnicity")
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.Country = translator.optionalString(input.Country, "country")
|
|
|
|
updatedPerformer.EyeColor = translator.optionalString(input.EyeColor, "eye_color")
|
|
|
|
updatedPerformer.Measurements = translator.optionalString(input.Measurements, "measurements")
|
2023-06-15 02:46:09 +00:00
|
|
|
|
2022-11-08 03:09:03 +00:00
|
|
|
// prefer height_cm over height
|
|
|
|
if translator.hasField("height_cm") {
|
|
|
|
updatedPerformer.Height = translator.optionalInt(input.HeightCm, "height_cm")
|
|
|
|
} else if translator.hasField("height") {
|
|
|
|
updatedPerformer.Height, err = translator.optionalIntFromString(input.Height, "height")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.FakeTits = translator.optionalString(input.FakeTits, "fake_tits")
|
2023-05-24 03:19:35 +00:00
|
|
|
updatedPerformer.PenisLength = translator.optionalFloat64(input.PenisLength, "penis_length")
|
2023-06-15 02:46:09 +00:00
|
|
|
updatedPerformer.Circumcised = translator.optionalString((*string)(input.Circumcised), "circumcised")
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.CareerLength = translator.optionalString(input.CareerLength, "career_length")
|
|
|
|
updatedPerformer.Tattoos = translator.optionalString(input.Tattoos, "tattoos")
|
|
|
|
updatedPerformer.Piercings = translator.optionalString(input.Piercings, "piercings")
|
|
|
|
updatedPerformer.Twitter = translator.optionalString(input.Twitter, "twitter")
|
|
|
|
updatedPerformer.Instagram = translator.optionalString(input.Instagram, "instagram")
|
|
|
|
updatedPerformer.Favorite = translator.optionalBool(input.Favorite, "favorite")
|
2022-11-15 22:31:44 +00:00
|
|
|
updatedPerformer.Rating = translator.ratingConversionOptional(input.Rating, input.Rating100)
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.Details = translator.optionalString(input.Details, "details")
|
2023-07-13 02:15:02 +00:00
|
|
|
updatedPerformer.DeathDate, err = translator.optionalDate(input.DeathDate, "death_date")
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("converting death date: %w", err)
|
|
|
|
}
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.HairColor = translator.optionalString(input.HairColor, "hair_color")
|
|
|
|
updatedPerformer.Weight = translator.optionalInt(input.Weight, "weight")
|
|
|
|
updatedPerformer.IgnoreAutoTag = translator.optionalBool(input.IgnoreAutoTag, "ignore_auto_tag")
|
2020-12-04 01:42:56 +00:00
|
|
|
|
2022-12-01 02:54:08 +00:00
|
|
|
if translator.hasField("alias_list") {
|
|
|
|
updatedPerformer.Aliases = &models.UpdateStrings{
|
|
|
|
Values: input.AliasList,
|
|
|
|
Mode: models.RelationshipUpdateModeSet,
|
|
|
|
}
|
|
|
|
} else if translator.hasField("aliases") {
|
2023-09-01 23:00:50 +00:00
|
|
|
var values []string
|
|
|
|
if input.Aliases != nil {
|
|
|
|
values = stringslice.FromString(*input.Aliases, ",")
|
|
|
|
}
|
2022-12-01 02:54:08 +00:00
|
|
|
updatedPerformer.Aliases = &models.UpdateStrings{
|
2023-09-01 23:00:50 +00:00
|
|
|
Values: values,
|
2022-12-01 02:54:08 +00:00
|
|
|
Mode: models.RelationshipUpdateModeSet,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if translator.hasField("tag_ids") {
|
|
|
|
updatedPerformer.TagIDs, err = translateUpdateIDs(input.TagIds, models.RelationshipUpdateModeSet)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("converting tag ids: %w", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Save the stash_ids
|
|
|
|
if translator.hasField("stash_ids") {
|
|
|
|
updatedPerformer.StashIDs = &models.UpdateStashIDs{
|
|
|
|
StashIDs: stashIDPtrSliceToSlice(input.StashIds),
|
|
|
|
Mode: models.RelationshipUpdateModeSet,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-15 02:46:09 +00:00
|
|
|
var imageData []byte
|
|
|
|
imageIncluded := translator.hasField("image")
|
|
|
|
if input.Image != nil {
|
|
|
|
imageData, err = utils.ProcessImageInput(ctx, *input.Image)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start the transaction and save the performer
|
2022-05-19 07:49:32 +00:00
|
|
|
if err := r.withTxn(ctx, func(ctx context.Context) error {
|
|
|
|
qb := r.repository.Performer
|
2019-02-09 12:30:49 +00:00
|
|
|
|
2021-04-16 06:06:35 +00:00
|
|
|
// need to get existing performer
|
2022-10-31 03:58:01 +00:00
|
|
|
existing, err := qb.Find(ctx, performerID)
|
2021-04-16 06:06:35 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if existing == nil {
|
2022-10-31 03:58:01 +00:00
|
|
|
return fmt.Errorf("performer with id %d not found", performerID)
|
2021-04-16 06:06:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if err := performer.ValidateDeathDate(existing, input.Birthdate, input.DeathDate); err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-31 03:58:01 +00:00
|
|
|
_, err = qb.UpdatePartial(ctx, performerID, updatedPerformer)
|
2021-01-18 01:23:20 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
2020-06-22 23:19:19 +00:00
|
|
|
}
|
|
|
|
|
2021-01-18 01:23:20 +00:00
|
|
|
// update image table
|
2023-06-15 02:46:09 +00:00
|
|
|
if imageIncluded {
|
2022-10-31 03:58:01 +00:00
|
|
|
if err := qb.UpdateImage(ctx, performerID, imageData); err != nil {
|
2021-01-18 01:23:20 +00:00
|
|
|
return err
|
|
|
|
}
|
2020-10-24 03:31:39 +00:00
|
|
|
}
|
2021-01-18 01:23:20 +00:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}); err != nil {
|
2019-02-09 12:30:49 +00:00
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2022-10-31 03:58:01 +00:00
|
|
|
r.hookExecutor.ExecutePostHooks(ctx, performerID, plugin.PerformerUpdatePost, input, translator.getFields())
|
|
|
|
return r.getPerformer(ctx, performerID)
|
2019-02-14 22:53:32 +00:00
|
|
|
}
|
2019-08-14 21:40:51 +00:00
|
|
|
|
2022-04-25 05:55:05 +00:00
|
|
|
func (r *mutationResolver) BulkPerformerUpdate(ctx context.Context, input BulkPerformerUpdateInput) ([]*models.Performer, error) {
|
2022-03-17 00:33:59 +00:00
|
|
|
performerIDs, err := stringslice.StringSliceToIntSlice(input.Ids)
|
2021-03-10 01:25:51 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Populate performer from the input
|
|
|
|
translator := changesetTranslator{
|
|
|
|
inputMap: getUpdateInputMap(ctx),
|
|
|
|
}
|
|
|
|
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer := models.NewPerformerPartial()
|
|
|
|
|
2022-12-01 02:54:08 +00:00
|
|
|
updatedPerformer.Disambiguation = translator.optionalString(input.Disambiguation, "disambiguation")
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.URL = translator.optionalString(input.URL, "url")
|
2023-06-15 02:46:09 +00:00
|
|
|
updatedPerformer.Gender = translator.optionalString((*string)(input.Gender), "gender")
|
2023-07-13 02:15:02 +00:00
|
|
|
updatedPerformer.Birthdate, err = translator.optionalDate(input.Birthdate, "birthdate")
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("converting birthdate: %w", err)
|
|
|
|
}
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.Ethnicity = translator.optionalString(input.Ethnicity, "ethnicity")
|
|
|
|
updatedPerformer.Country = translator.optionalString(input.Country, "country")
|
|
|
|
updatedPerformer.EyeColor = translator.optionalString(input.EyeColor, "eye_color")
|
2023-06-15 02:46:09 +00:00
|
|
|
|
2022-11-08 03:09:03 +00:00
|
|
|
// prefer height_cm over height
|
|
|
|
if translator.hasField("height_cm") {
|
|
|
|
updatedPerformer.Height = translator.optionalInt(input.HeightCm, "height_cm")
|
|
|
|
} else if translator.hasField("height") {
|
|
|
|
updatedPerformer.Height, err = translator.optionalIntFromString(input.Height, "height")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.Measurements = translator.optionalString(input.Measurements, "measurements")
|
|
|
|
updatedPerformer.FakeTits = translator.optionalString(input.FakeTits, "fake_tits")
|
2023-05-24 03:19:35 +00:00
|
|
|
updatedPerformer.PenisLength = translator.optionalFloat64(input.PenisLength, "penis_length")
|
2023-06-15 02:46:09 +00:00
|
|
|
updatedPerformer.Circumcised = translator.optionalString((*string)(input.Circumcised), "circumcised")
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.CareerLength = translator.optionalString(input.CareerLength, "career_length")
|
|
|
|
updatedPerformer.Tattoos = translator.optionalString(input.Tattoos, "tattoos")
|
|
|
|
updatedPerformer.Piercings = translator.optionalString(input.Piercings, "piercings")
|
|
|
|
updatedPerformer.Twitter = translator.optionalString(input.Twitter, "twitter")
|
|
|
|
updatedPerformer.Instagram = translator.optionalString(input.Instagram, "instagram")
|
|
|
|
updatedPerformer.Favorite = translator.optionalBool(input.Favorite, "favorite")
|
2022-11-15 22:31:44 +00:00
|
|
|
updatedPerformer.Rating = translator.ratingConversionOptional(input.Rating, input.Rating100)
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.Details = translator.optionalString(input.Details, "details")
|
2023-07-13 02:15:02 +00:00
|
|
|
updatedPerformer.DeathDate, err = translator.optionalDate(input.DeathDate, "death_date")
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("converting death date: %w", err)
|
|
|
|
}
|
2022-10-31 03:58:01 +00:00
|
|
|
updatedPerformer.HairColor = translator.optionalString(input.HairColor, "hair_color")
|
|
|
|
updatedPerformer.Weight = translator.optionalInt(input.Weight, "weight")
|
|
|
|
updatedPerformer.IgnoreAutoTag = translator.optionalBool(input.IgnoreAutoTag, "ignore_auto_tag")
|
2021-03-10 01:25:51 +00:00
|
|
|
|
2022-12-01 02:54:08 +00:00
|
|
|
if translator.hasField("alias_list") {
|
|
|
|
updatedPerformer.Aliases = &models.UpdateStrings{
|
|
|
|
Values: input.AliasList.Values,
|
|
|
|
Mode: input.AliasList.Mode,
|
|
|
|
}
|
|
|
|
} else if translator.hasField("aliases") {
|
2023-09-01 23:00:50 +00:00
|
|
|
var values []string
|
|
|
|
if input.Aliases != nil {
|
|
|
|
values = stringslice.FromString(*input.Aliases, ",")
|
|
|
|
}
|
2022-12-01 02:54:08 +00:00
|
|
|
updatedPerformer.Aliases = &models.UpdateStrings{
|
2023-09-01 23:00:50 +00:00
|
|
|
Values: values,
|
2022-12-01 02:54:08 +00:00
|
|
|
Mode: models.RelationshipUpdateModeSet,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if translator.hasField("tag_ids") {
|
|
|
|
updatedPerformer.TagIDs, err = translateUpdateIDs(input.TagIds.Ids, input.TagIds.Mode)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("converting tag ids: %w", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-10 01:25:51 +00:00
|
|
|
ret := []*models.Performer{}
|
|
|
|
|
2023-06-15 02:46:09 +00:00
|
|
|
// Start the transaction and save the performers
|
2022-05-19 07:49:32 +00:00
|
|
|
if err := r.withTxn(ctx, func(ctx context.Context) error {
|
|
|
|
qb := r.repository.Performer
|
2021-03-10 01:25:51 +00:00
|
|
|
|
|
|
|
for _, performerID := range performerIDs {
|
2021-04-16 06:06:35 +00:00
|
|
|
// need to get existing performer
|
2022-05-19 07:49:32 +00:00
|
|
|
existing, err := qb.Find(ctx, performerID)
|
2021-04-16 06:06:35 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if existing == nil {
|
|
|
|
return fmt.Errorf("performer with id %d not found", performerID)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := performer.ValidateDeathDate(existing, input.Birthdate, input.DeathDate); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-10-31 03:58:01 +00:00
|
|
|
performer, err := qb.UpdatePartial(ctx, performerID, updatedPerformer)
|
2021-03-10 01:25:51 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = append(ret, performer)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2021-06-11 07:24:58 +00:00
|
|
|
// execute post hooks outside of txn
|
|
|
|
var newRet []*models.Performer
|
|
|
|
for _, performer := range ret {
|
2023-05-23 01:40:27 +00:00
|
|
|
r.hookExecutor.ExecutePostHooks(ctx, performer.ID, plugin.PerformerUpdatePost, input, translator.getFields())
|
2021-06-11 07:24:58 +00:00
|
|
|
|
|
|
|
performer, err = r.getPerformer(ctx, performer.ID)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
newRet = append(newRet, performer)
|
|
|
|
}
|
|
|
|
|
|
|
|
return newRet, nil
|
2021-03-10 01:25:51 +00:00
|
|
|
}
|
|
|
|
|
2022-04-25 05:55:05 +00:00
|
|
|
func (r *mutationResolver) PerformerDestroy(ctx context.Context, input PerformerDestroyInput) (bool, error) {
|
2021-01-18 01:23:20 +00:00
|
|
|
id, err := strconv.Atoi(input.ID)
|
|
|
|
if err != nil {
|
2019-08-14 21:40:51 +00:00
|
|
|
return false, err
|
|
|
|
}
|
2021-01-18 01:23:20 +00:00
|
|
|
|
2022-05-19 07:49:32 +00:00
|
|
|
if err := r.withTxn(ctx, func(ctx context.Context) error {
|
|
|
|
return r.repository.Performer.Destroy(ctx, id)
|
2021-01-18 01:23:20 +00:00
|
|
|
}); err != nil {
|
2019-08-14 21:40:51 +00:00
|
|
|
return false, err
|
|
|
|
}
|
2021-06-11 07:24:58 +00:00
|
|
|
|
|
|
|
r.hookExecutor.ExecutePostHooks(ctx, id, plugin.PerformerDestroyPost, input, nil)
|
|
|
|
|
2019-08-14 21:40:51 +00:00
|
|
|
return true, nil
|
|
|
|
}
|
2021-01-13 00:57:53 +00:00
|
|
|
|
2021-01-18 01:23:20 +00:00
|
|
|
func (r *mutationResolver) PerformersDestroy(ctx context.Context, performerIDs []string) (bool, error) {
|
2022-03-17 00:33:59 +00:00
|
|
|
ids, err := stringslice.StringSliceToIntSlice(performerIDs)
|
2021-01-18 01:23:20 +00:00
|
|
|
if err != nil {
|
|
|
|
return false, err
|
2021-01-13 00:57:53 +00:00
|
|
|
}
|
2021-01-18 01:23:20 +00:00
|
|
|
|
2022-05-19 07:49:32 +00:00
|
|
|
if err := r.withTxn(ctx, func(ctx context.Context) error {
|
|
|
|
qb := r.repository.Performer
|
2021-01-18 01:23:20 +00:00
|
|
|
for _, id := range ids {
|
2022-05-19 07:49:32 +00:00
|
|
|
if err := qb.Destroy(ctx, id); err != nil {
|
2021-01-18 01:23:20 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}); err != nil {
|
2021-01-13 00:57:53 +00:00
|
|
|
return false, err
|
|
|
|
}
|
2021-06-11 07:24:58 +00:00
|
|
|
|
|
|
|
for _, id := range ids {
|
|
|
|
r.hookExecutor.ExecutePostHooks(ctx, id, plugin.PerformerDestroyPost, performerIDs, nil)
|
|
|
|
}
|
|
|
|
|
2021-01-13 00:57:53 +00:00
|
|
|
return true, nil
|
|
|
|
}
|