Files
RenewCMS/internal/infrastructure/useCases/publicVersions.go
T

57 lines
1.7 KiB
Go

package useCases
import (
"RenewCMS/internal/domain/article"
"RenewCMS/internal/domain/localization"
"RenewCMS/internal/domain/site"
"slices"
)
func eligibleSiblings(rows []localization.Row, versions []article.Article, served article.Article) []article.Article {
defaultTag := localization.ConfirmedDefaultTag(rows)
siblings := []article.Article{}
for _, version := range versions {
if version.ID == served.ID || version.SiteID != served.SiteID || !version.IsOnline {
continue
}
if localization.PublicTag(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 ""
}