64 lines
1.9 KiB
Go
64 lines
1.9 KiB
Go
package useCases
|
|
|
|
import (
|
|
"RenewCMS/internal/domain/article"
|
|
"RenewCMS/internal/domain/localization"
|
|
"RenewCMS/internal/domain/site"
|
|
"slices"
|
|
)
|
|
|
|
func confirmedDefault(rows []localization.Row) string {
|
|
if localization.NeedsSetup(rows) {
|
|
return ""
|
|
}
|
|
return localization.DefaultTag(rows)
|
|
}
|
|
|
|
func eligibleSiblings(rows []localization.Row, versions []article.Article, served article.Article) []article.Article {
|
|
defaultTag := confirmedDefault(rows)
|
|
siblings := []article.Article{}
|
|
for _, version := range versions {
|
|
if version.ID == served.ID || version.SiteID != served.SiteID || !version.IsOnline || version.Lang == "" {
|
|
continue
|
|
}
|
|
if localization.EnabledTag(rows, version.Lang) {
|
|
siblings = append(siblings, version)
|
|
}
|
|
}
|
|
slices.SortFunc(siblings, func(left article.Article, right article.Article) int {
|
|
return localization.CompareTags(defaultTag, left.Lang, right.Lang)
|
|
})
|
|
return siblings
|
|
}
|
|
|
|
func storyVersions(repository article.Repository, art article.Article) ([]article.Article, error) {
|
|
if art.StoryID == 0 {
|
|
return []article.Article{}, nil
|
|
}
|
|
return repository.ListByStory(art.StoryID)
|
|
}
|
|
|
|
func alternatesOf(owner site.Site, siblings []article.Article) []article.Alternate {
|
|
alternates := make([]article.Alternate, 0, len(siblings))
|
|
for _, sibling := range siblings {
|
|
alternates = append(alternates, article.Alternate{ID: sibling.ID, Lang: sibling.Lang, StoryID: sibling.StoryID, Slug: sibling.Slug, URL: owner.PublicURL(sibling.Lang, sibling.Slug)})
|
|
}
|
|
return alternates
|
|
}
|
|
|
|
func rowOf(rows []localization.Row, tag string) localization.Row {
|
|
for _, row := range rows {
|
|
if row.Tag == tag {
|
|
return row
|
|
}
|
|
}
|
|
return localization.Row{Tag: tag}
|
|
}
|
|
|
|
func socialLocaleOf(rows []localization.Row, tag string, siteLocale *string) string {
|
|
if resolved := localization.EffectiveSocialLocale(rowOf(rows, tag), siteLocale); resolved != nil {
|
|
return *resolved
|
|
}
|
|
return ""
|
|
}
|