40 lines
999 B
Go
40 lines
999 B
Go
package useCases
|
|
|
|
import (
|
|
"RenewCMS/internal/domain/article"
|
|
"errors"
|
|
)
|
|
|
|
const (
|
|
firstSlugAttempt = 1
|
|
firstSuggestedAttempt = 2
|
|
maxCreateSlugAttempts = 5
|
|
maxFreeSlugAttempts = 100
|
|
)
|
|
|
|
func freeSlug(articles article.Repository, siteID uint32, base string, exceptID uint32, firstAttempt int) (string, error) {
|
|
for attempt := firstAttempt; attempt <= maxFreeSlugAttempts; attempt++ {
|
|
candidate := article.SlugWithSuffix(base, attempt)
|
|
taken, err := articles.SlugTaken(siteID, candidate, exceptID)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if !taken {
|
|
return candidate, nil
|
|
}
|
|
}
|
|
return "", article.ErrSlugTaken
|
|
}
|
|
|
|
func slugConflict(articles article.Repository, siteID uint32, slug string, exceptID uint32) error {
|
|
suggestion, err := freeSlug(articles, siteID, slug, exceptID, firstSuggestedAttempt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return &article.SlugTakenError{Suggestion: suggestion}
|
|
}
|
|
|
|
func isSlugTakenError(err error) bool {
|
|
return errors.Is(err, article.ErrSlugTaken)
|
|
}
|