diff --git a/pkg/sqlite/studio.go b/pkg/sqlite/studio.go index bddc17c12..1a05be6f3 100644 --- a/pkg/sqlite/studio.go +++ b/pkg/sqlite/studio.go @@ -181,7 +181,7 @@ func (qb *StudioStore) Create(ctx context.Context, newObject *models.Studio) err } 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 } @@ -232,10 +232,6 @@ func (qb *StudioStore) UpdatePartial(ctx context.Context, input models.StudioPar } 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 { return nil, err } diff --git a/pkg/studio/validate.go b/pkg/studio/validate.go index 8a8676351..4e2f51c84 100644 --- a/pkg/studio/validate.go +++ b/pkg/studio/validate.go @@ -10,6 +10,7 @@ import ( var ( 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") ) @@ -61,9 +62,12 @@ func EnsureStudioNameUnique(ctx context.Context, id int, name string, qb models. 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 { - 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 } } @@ -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 err := EnsureAliasesUnique(ctx, 0, studio.Aliases.List(), qb); err != nil { + if err := ValidateAliases(ctx, 0, studio.Aliases.List(), qb); err != nil { return err } } @@ -131,7 +135,7 @@ func ValidateModify(ctx context.Context, s models.StudioPartial, qb ValidateModi } 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 } } diff --git a/ui/v2.5/src/components/Tagger/scenes/StudioModal.tsx b/ui/v2.5/src/components/Tagger/scenes/StudioModal.tsx index e01c40881..a77025d57 100644 --- a/ui/v2.5/src/components/Tagger/scenes/StudioModal.tsx +++ b/ui/v2.5/src/components/Tagger/scenes/StudioModal.tsx @@ -236,7 +236,10 @@ const StudioModal: React.FC = ({ image: studio.image, parent_id: studio.parent?.stored_id, 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 | string[] | undefined, @@ -270,7 +273,10 @@ const StudioModal: React.FC = ({ urls: studio.parent?.urls, image: studio.parent?.image, 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 ?.map((t) => t.stored_id) .filter((id) => id) as string[] | undefined,