feat: SEO backend data (1/4)

This commit is contained in:
Florian Sylvain committed 2026-10-15 19:30:29 +02:00
1 parent cb1410f0b0
commit 0eb46b0d74
90 files changed
+6094 -350

No files matched your search

+32 -7
View File
@@ -12,8 +12,33 @@ func TextChange(field string, before string, after string) Change {
}
func BodyChange(before string, after string) Change {
return SizeChange(FieldBody, before, after)
}
func SizeChange(field string, before string, after string) Change {
delta := utf8.RuneCountInString(after) - utf8.RuneCountInString(before)
return Change{Field: FieldBody, Kind: ChangeBody, Delta: &delta}
return Change{Field: field, Kind: ChangeBody, Delta: &delta}
}
func appendSizeChange(changes []Change, field string, before string, after string) []Change {
if before == after {
return changes
}
return append(changes, SizeChange(field, before, after))
}
func SEOChanges(before article.Article, after article.Article) []Change {
changes := []Change{}
changes = AppendTextChange(changes, FieldSlug, before.Slug, after.Slug)
changes = AppendTextChange(changes, FieldCanonicalURL, before.CanonicalURL, after.CanonicalURL)
changes = AppendTextChange(changes, FieldNoindex, strconv.FormatBool(before.Noindex), strconv.FormatBool(after.Noindex))
changes = appendSizeChange(changes, FieldExcerpt, before.Excerpt, after.Excerpt)
changes = appendSizeChange(changes, FieldSEOTitle, before.SEOTitle, after.SEOTitle)
changes = appendSizeChange(changes, FieldSEODescription, before.SEODescription, after.SEODescription)
changes = appendSizeChange(changes, FieldCoverImageAlt, before.CoverImageAlt, after.CoverImageAlt)
changes = appendSizeChange(changes, FieldSocialTitle, before.SocialTitle, after.SocialTitle)
changes = appendSizeChange(changes, FieldSocialDescription, before.SocialDescription, after.SocialDescription)
return changes
}
func ArticleChanges(before article.Article, after article.Article) []Change {
@@ -32,15 +57,15 @@ func ArticleChanges(before article.Article, after article.Article) []Change {
func VariantChanges(before image.VariantSettings, after image.VariantSettings) []Change {
changes := []Change{}
changes = appendChange(changes, FieldWidth, image.DimensionText(before.Width), image.DimensionText(after.Width))
changes = appendChange(changes, FieldHeight, image.DimensionText(before.Height), image.DimensionText(after.Height))
changes = appendChange(changes, FieldFit, string(before.Fit), string(after.Fit))
changes = appendChange(changes, FieldFormat, string(before.Format), string(after.Format))
changes = appendChange(changes, FieldQuality, image.QualityText(before.Quality), image.QualityText(after.Quality))
changes = AppendTextChange(changes, FieldWidth, image.DimensionText(before.Width), image.DimensionText(after.Width))
changes = AppendTextChange(changes, FieldHeight, image.DimensionText(before.Height), image.DimensionText(after.Height))
changes = AppendTextChange(changes, FieldFit, string(before.Fit), string(after.Fit))
changes = AppendTextChange(changes, FieldFormat, string(before.Format), string(after.Format))
changes = AppendTextChange(changes, FieldQuality, image.QualityText(before.Quality), image.QualityText(after.Quality))
return changes
}
func appendChange(changes []Change, field string, before string, after string) []Change {
func AppendTextChange(changes []Change, field string, before string, after string) []Change {
if before == after {
return changes
}
+65 -52
View File
@@ -121,58 +121,71 @@ const (
)
const (
SystemActorName = "System"
ReasonWrongLogin = "Wrong username or password."
MaxUserAgentLength = 255
ParamRemoved = "removed"
ParamFrom = "from"
ParamTo = "to"
ParamMaxGBFrom = "max_gb_from"
ParamMaxGBTo = "max_gb_to"
ParamMerged = "merged"
ParamArticlesUpdated = "articles_updated"
ParamFailedGroups = "failed_groups"
ParamUpdateAvailable = "update_available"
ParamKind = "kind"
ParamPurgedFiles = "purged_files"
ParamPurgedBytes = "purged_bytes"
ParamFailedFiles = "failed_files"
ParamOlderThanDays = "older_than_days"
ParamGenerated = "generated"
ParamFailed = "failed"
ParamCauses = "causes"
ParamWidth = "width"
ParamHeight = "height"
ParamFit = "fit"
ParamFormat = "format"
ParamQuality = "quality"
ParamTag = "tag"
FieldTitle = "title"
FieldOnline = "online"
FieldBody = "body"
FieldFilename = "filename"
FieldDisplayName = "display_name"
FieldWidth = "width"
FieldHeight = "height"
FieldFit = "fit"
FieldFormat = "format"
FieldQuality = "quality"
FieldName = "name"
FieldBaseURL = "base_url"
FieldDefaultRobots = "default_robots"
FieldLocale = "locale"
FieldSocialImage = "default_social_image"
FieldSite = "site"
FieldSlug = "slug"
FieldBio = "bio"
FieldWebsite = "website"
FieldSocialLinks = "social_links"
FieldAvatar = "avatar"
FieldUser = "user"
FieldAuthors = "authors"
maxNameLength = 255
maxActionLength = 64
maxFailureReasonSize = 255
SystemActorName = "System"
ReasonWrongLogin = "Wrong username or password."
MaxUserAgentLength = 255
ParamRemoved = "removed"
ParamFrom = "from"
ParamTo = "to"
ParamMaxGBFrom = "max_gb_from"
ParamMaxGBTo = "max_gb_to"
ParamMerged = "merged"
ParamArticlesUpdated = "articles_updated"
ParamFailedGroups = "failed_groups"
ParamUpdateAvailable = "update_available"
ParamKind = "kind"
ParamPurgedFiles = "purged_files"
ParamPurgedBytes = "purged_bytes"
ParamFailedFiles = "failed_files"
ParamOlderThanDays = "older_than_days"
ParamGenerated = "generated"
ParamFailed = "failed"
ParamCauses = "causes"
ParamWidth = "width"
ParamHeight = "height"
ParamFit = "fit"
ParamFormat = "format"
ParamQuality = "quality"
ParamTag = "tag"
FieldTitle = "title"
FieldOnline = "online"
FieldBody = "body"
FieldFilename = "filename"
FieldDisplayName = "display_name"
FieldWidth = "width"
FieldHeight = "height"
FieldFit = "fit"
FieldFormat = "format"
FieldQuality = "quality"
FieldName = "name"
FieldBaseURL = "base_url"
FieldDefaultRobots = "default_robots"
FieldLocale = "locale"
FieldSocialImage = "default_social_image"
FieldSite = "site"
FieldSlug = "slug"
FieldBio = "bio"
FieldWebsite = "website"
FieldSocialLinks = "social_links"
FieldAvatar = "avatar"
FieldUser = "user"
FieldAuthors = "authors"
FieldCanonicalURL = "canonical_url"
FieldNoindex = "noindex"
FieldCoverImage = "cover_image"
FieldArticleSocialImage = "social_image"
FieldExcerpt = "excerpt"
FieldSEOTitle = "seo_title"
FieldSEODescription = "seo_description"
FieldSocialTitle = "social_title"
FieldSocialDescription = "social_description"
FieldCoverImageAlt = "cover_image_alt"
FieldSiteName = "site_name"
FieldTitleTemplate = "title_template"
FieldDefaultDescription = "default_description"
maxNameLength = 255
maxActionLength = 64
maxFailureReasonSize = 255
)
func ActorTypes() []ActorType {