mirror of
https://github.com/stashapp/stash.git
synced 2025-12-06 08:26:00 +01:00
Bugfix: Fix empty Aliases Being Created for Studios (#6273)
* Filter out empty alias strings in studio modal create * Reject empty alias strings in backend * Remove invalid ValidateAliases call from UpdatePartial This was calling using the values which are not necessarily the final values. --------- Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
parent
e3b3fbbf63
commit
957c4fe1b5
3 changed files with 17 additions and 11 deletions
|
|
@ -181,7 +181,7 @@ func (qb *StudioStore) Create(ctx context.Context, newObject *models.Studio) err
|
||||||
}
|
}
|
||||||
|
|
||||||
if newObject.Aliases.Loaded() {
|
if newObject.Aliases.Loaded() {
|
||||||
if err := studio.EnsureAliasesUnique(ctx, id, newObject.Aliases.List(), qb); err != nil {
|
if err := studio.ValidateAliases(ctx, id, newObject.Aliases.List(), qb); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -232,10 +232,6 @@ func (qb *StudioStore) UpdatePartial(ctx context.Context, input models.StudioPar
|
||||||
}
|
}
|
||||||
|
|
||||||
if input.Aliases != nil {
|
if input.Aliases != nil {
|
||||||
if err := studio.EnsureAliasesUnique(ctx, input.ID, input.Aliases.Values, qb); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := studiosAliasesTableMgr.modifyJoins(ctx, input.ID, input.Aliases.Values, input.Aliases.Mode); err != nil {
|
if err := studiosAliasesTableMgr.modifyJoins(ctx, input.ID, input.Aliases.Values, input.Aliases.Mode); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrNameMissing = errors.New("studio name must not be blank")
|
ErrNameMissing = errors.New("studio name must not be blank")
|
||||||
|
ErrEmptyAlias = errors.New("studio alias must not be an empty string")
|
||||||
ErrStudioOwnAncestor = errors.New("studio cannot be an ancestor of itself")
|
ErrStudioOwnAncestor = errors.New("studio cannot be an ancestor of itself")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -61,9 +62,12 @@ func EnsureStudioNameUnique(ctx context.Context, id int, name string, qb models.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func EnsureAliasesUnique(ctx context.Context, id int, aliases []string, qb models.StudioQueryer) error {
|
func ValidateAliases(ctx context.Context, id int, aliases []string, qb models.StudioQueryer) error {
|
||||||
for _, a := range aliases {
|
for _, a := range aliases {
|
||||||
if err := EnsureStudioNameUnique(ctx, id, a, qb); err != nil {
|
if err := validateName(ctx, id, a, qb); err != nil {
|
||||||
|
if errors.Is(err, ErrNameMissing) {
|
||||||
|
return ErrEmptyAlias
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -77,7 +81,7 @@ func ValidateCreate(ctx context.Context, studio models.Studio, qb models.StudioQ
|
||||||
}
|
}
|
||||||
|
|
||||||
if studio.Aliases.Loaded() && len(studio.Aliases.List()) > 0 {
|
if studio.Aliases.Loaded() && len(studio.Aliases.List()) > 0 {
|
||||||
if err := EnsureAliasesUnique(ctx, 0, studio.Aliases.List(), qb); err != nil {
|
if err := ValidateAliases(ctx, 0, studio.Aliases.List(), qb); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -131,7 +135,7 @@ func ValidateModify(ctx context.Context, s models.StudioPartial, qb ValidateModi
|
||||||
}
|
}
|
||||||
|
|
||||||
effectiveAliases := s.Aliases.Apply(existing.Aliases.List())
|
effectiveAliases := s.Aliases.Apply(existing.Aliases.List())
|
||||||
if err := EnsureAliasesUnique(ctx, s.ID, effectiveAliases, qb); err != nil {
|
if err := ValidateAliases(ctx, s.ID, effectiveAliases, qb); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -236,7 +236,10 @@ const StudioModal: React.FC<IStudioModalProps> = ({
|
||||||
image: studio.image,
|
image: studio.image,
|
||||||
parent_id: studio.parent?.stored_id,
|
parent_id: studio.parent?.stored_id,
|
||||||
details: studio.details,
|
details: studio.details,
|
||||||
aliases: studio.aliases?.split(",").map((a) => a.trim()),
|
aliases: studio.aliases
|
||||||
|
?.split(",")
|
||||||
|
.map((a) => a.trim())
|
||||||
|
.filter((a) => a),
|
||||||
tag_ids: studio.tags?.map((t) => t.stored_id).filter((id) => id) as
|
tag_ids: studio.tags?.map((t) => t.stored_id).filter((id) => id) as
|
||||||
| string[]
|
| string[]
|
||||||
| undefined,
|
| undefined,
|
||||||
|
|
@ -270,7 +273,10 @@ const StudioModal: React.FC<IStudioModalProps> = ({
|
||||||
urls: studio.parent?.urls,
|
urls: studio.parent?.urls,
|
||||||
image: studio.parent?.image,
|
image: studio.parent?.image,
|
||||||
details: studio.parent?.details,
|
details: studio.parent?.details,
|
||||||
aliases: studio.parent?.aliases?.split(",").map((a) => a.trim()),
|
aliases: studio.parent?.aliases
|
||||||
|
?.split(",")
|
||||||
|
.map((a) => a.trim())
|
||||||
|
.filter((a) => a),
|
||||||
tag_ids: studio.parent?.tags
|
tag_ids: studio.parent?.tags
|
||||||
?.map((t) => t.stored_id)
|
?.map((t) => t.stored_id)
|
||||||
.filter((id) => id) as string[] | undefined,
|
.filter((id) => id) as string[] | undefined,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue