mirror of https://github.com/stashapp/stash.git
103 lines
2.2 KiB
Go
103 lines
2.2 KiB
Go
|
package tag
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/stashapp/stash/pkg/models"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
ErrNameMissing = errors.New("tag name must not be blank")
|
||
|
)
|
||
|
|
||
|
type NotFoundError struct {
|
||
|
id int
|
||
|
}
|
||
|
|
||
|
func (e *NotFoundError) Error() string {
|
||
|
return fmt.Sprintf("tag with id %d not found", e.id)
|
||
|
}
|
||
|
|
||
|
func ValidateCreate(ctx context.Context, tag models.Tag, qb models.TagReader) error {
|
||
|
if tag.Name == "" {
|
||
|
return ErrNameMissing
|
||
|
}
|
||
|
|
||
|
if err := EnsureTagNameUnique(ctx, 0, tag.Name, qb); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if tag.Aliases.Loaded() {
|
||
|
if err := EnsureAliasesUnique(ctx, tag.ID, tag.Aliases.List(), qb); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if len(tag.ParentIDs.List()) > 0 || len(tag.ChildIDs.List()) > 0 {
|
||
|
if err := ValidateHierarchyNew(ctx, tag.ParentIDs.List(), tag.ChildIDs.List(), qb); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func ValidateUpdate(ctx context.Context, id int, partial models.TagPartial, qb models.TagReader) error {
|
||
|
existing, err := qb.Find(ctx, id)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if existing == nil {
|
||
|
return &NotFoundError{id}
|
||
|
}
|
||
|
|
||
|
if partial.Name.Set {
|
||
|
if partial.Name.Value == "" {
|
||
|
return ErrNameMissing
|
||
|
}
|
||
|
|
||
|
if err := EnsureTagNameUnique(ctx, id, partial.Name.Value, qb); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if partial.Aliases != nil {
|
||
|
if err := existing.LoadAliases(ctx, qb); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if err := EnsureAliasesUnique(ctx, id, partial.Aliases.Apply(existing.Aliases.List()), qb); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if partial.ParentIDs != nil || partial.ChildIDs != nil {
|
||
|
if err := existing.LoadParentIDs(ctx, qb); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if err := existing.LoadChildIDs(ctx, qb); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
parentIDs := partial.ParentIDs
|
||
|
if parentIDs == nil {
|
||
|
parentIDs = &models.UpdateIDs{IDs: existing.ParentIDs.List(), Mode: models.RelationshipUpdateModeSet}
|
||
|
}
|
||
|
|
||
|
childIDs := partial.ChildIDs
|
||
|
if childIDs == nil {
|
||
|
childIDs = &models.UpdateIDs{IDs: existing.ChildIDs.List(), Mode: models.RelationshipUpdateModeSet}
|
||
|
}
|
||
|
|
||
|
if err := ValidateHierarchyExisting(ctx, existing, parentIDs.Apply(existing.ParentIDs.List()), childIDs.Apply(existing.ChildIDs.List()), qb); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|