Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add performer merged into to API #828

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions frontend/src/graphql/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -762,7 +762,10 @@ export type Performer = {
is_favorite: Scalars["Boolean"];
/** @deprecated Use individual fields, cup/band/waist/hip_size */
measurements: Measurements;
/** IDs of performers that were merged into this one */
merged_ids: Array<Scalars["ID"]>;
/** ID of performer that replaces this one */
merged_into_id?: Maybe<Scalars["ID"]>;
name: Scalars["String"];
piercings?: Maybe<Array<BodyModification>>;
scene_count: Scalars["Int"];
Expand Down
3 changes: 3 additions & 0 deletions graphql/schema/types/performer.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,10 @@ type Performer {
edits: [Edit!]!
scene_count: Int!
scenes(input: PerformerScenesInput): [Scene!]!
"""IDs of performers that were merged into this one"""
merged_ids: [ID!]!
"""ID of performer that replaces this one"""
merged_into_id: ID
studios: [PerformerStudio!]!
is_favorite: Boolean!
created: Time!
Expand Down
11 changes: 11 additions & 0 deletions pkg/api/resolver_model_performer.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package api

import (
"context"
"fmt"
"sort"
"time"

Expand Down Expand Up @@ -225,6 +226,16 @@ func (r *performerResolver) MergedIds(ctx context.Context, obj *models.Performer
return dataloader.For(ctx).PerformerMergeIDsByID.Load(obj.ID)
}

func (r *performerResolver) MergedIntoID(ctx context.Context, obj *models.Performer) (*uuid.UUID, error) {
res, err := dataloader.For(ctx).PerformerMergeIDsBySourceID.Load(obj.ID)
if err == nil && len(res) == 1 {
return &res[0], nil
} else if err == nil {
return nil, fmt.Errorf("invalid number of results returned, expecting exactly 1, found %d", len(res))
}
return nil, err
}

func (r *performerResolver) Studios(ctx context.Context, obj *models.Performer) ([]*models.PerformerStudio, error) {
sqb := r.getRepoFactory(ctx).Studio()
return sqb.CountByPerformer(obj.ID)
Expand Down
9 changes: 9 additions & 0 deletions pkg/dataloader/loaders.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ type Loaders struct {
PerformerAliasesByID StringsLoader
PerformerImageIDsByID UUIDsLoader
PerformerMergeIDsByID UUIDsLoader
PerformerMergeIDsBySourceID UUIDsLoader
PerformerPiercingsByID BodyModificationsLoader
PerformerTattoosByID BodyModificationsLoader
PerformerUrlsByID URLLoader
Expand Down Expand Up @@ -110,6 +111,14 @@ func GetLoaders(ctx context.Context, fac models.Repo) *Loaders {
return qb.FindMergeIDsByPerformerIDs(ids)
},
},
PerformerMergeIDsBySourceID: UUIDsLoader{
maxBatch: 100,
wait: 1 * time.Millisecond,
fetch: func(ids []uuid.UUID) ([][]uuid.UUID, []error) {
qb := fac.Performer()
return qb.FindMergeIDsBySourcePerformerIDs(ids)
},
},
PerformerAliasesByID: StringsLoader{
maxBatch: 100,
wait: 1 * time.Millisecond,
Expand Down
98 changes: 98 additions & 0 deletions pkg/models/generated_exec.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pkg/models/performer.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ type PerformerRepo interface {
SearchPerformers(term string, limit int) (Performers, error)
ApplyEdit(performer *Performer, create bool, data *PerformerEditData) (*Performer, error)
FindMergeIDsByPerformerIDs(ids []uuid.UUID) ([][]uuid.UUID, []error)
FindMergeIDsBySourcePerformerIDs(ids []uuid.UUID) ([][]uuid.UUID, []error)
SoftDelete(performer Performer) (*Performer, error)
MergeInto(source *Performer, target *Performer, setAlias bool) error
DeleteScenePerformers(id uuid.UUID) error
Expand Down
21 changes: 21 additions & 0 deletions pkg/sqlx/querybuilder_performer.go
Original file line number Diff line number Diff line change
Expand Up @@ -908,6 +908,27 @@ func (qb *performerQueryBuilder) FindMergeIDsByPerformerIDs(ids []uuid.UUID) ([]
return result, nil
}

func (qb *performerQueryBuilder) FindMergeIDsBySourcePerformerIDs(ids []uuid.UUID) ([][]uuid.UUID, []error) {
redirects := models.Redirects{}
err := qb.dbi.FindAllJoins(performerSourceRedirectTable, ids, &redirects)

if err != nil {
return nil, utils.DuplicateError(err, len(ids))
}

// each list should only really have one entry
m := make(map[uuid.UUID][]uuid.UUID)
for _, redirect := range redirects {
m[redirect.SourceID] = append(m[redirect.SourceID], redirect.TargetID)
}

result := make([][]uuid.UUID, len(ids))
for i, id := range ids {
result[i] = m[id]
}
return result, nil
}

func (qb *performerQueryBuilder) IsFavoriteByIds(userID uuid.UUID, ids []uuid.UUID) ([]bool, []error) {
query := "SELECT performer_id FROM performer_favorites WHERE user_id = :userid AND performer_id IN (:performer_ids)"

Expand Down
Loading