Files
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

142 lines
3.7 KiB
Go

package officialwebsiteser
import (
"91porn-server/common/log"
officialwebsitemod "91porn-server/models/v/officialWebsitemod"
"github.com/robfig/cron/v3"
)
var seoSlugBackfillCron *cron.Cron
// StartSeoSlugBackfillCron 启动定时任务:扫描官网各表(Video/Hero/Album/News/Photograph)
// 中缺失 seoSlug 的记录,按标题自动生成并回填。
// 启动后异步先跑一次(补存量),之后每小时扫一次(兜底导入/批量遗漏的记录)。
func StartSeoSlugBackfillCron() {
go backfillAllSeoSlug() // 首次异步执行,避免阻塞服务启动
seoSlugBackfillCron = cron.New()
if _, err := seoSlugBackfillCron.AddFunc("@every 1h", backfillAllSeoSlug); err != nil {
log.Error("StartSeoSlugBackfillCron AddFunc fail", log.E(err))
return
}
seoSlugBackfillCron.Start()
}
func backfillAllSeoSlug() {
backfillVideoSeoSlug()
backfillHeroSeoSlug()
backfillAlbumSeoSlug()
backfillNewsSeoSlug()
backfillPhotographSeoSlug()
}
// seoSlugMissingFilter 匹配 seoSlug 字段缺失或为空的记录。
func seoSlugMissingFilter() officialwebsitemod.M {
return officialwebsitemod.M{"$or": []officialwebsitemod.M{
{"seoSlug": officialwebsitemod.M{"$exists": false}},
{"seoSlug": ""},
}}
}
// setSeoSlug 回填单条记录的 seoSlug。
func setSeoSlug(update func(officialwebsitemod.M, officialwebsitemod.M) (int64, error), id interface{}, slug string) {
if _, err := update(officialwebsitemod.M{"_id": id}, officialwebsitemod.M{"$set": officialwebsitemod.M{"seoSlug": slug}}); err != nil {
log.Error("backfill seoSlug update fail", log.E(err), log.Any("id", id))
}
}
func backfillVideoSeoSlug() {
mod := &officialwebsitemod.Video{}
list, err := mod.FindMany(seoSlugMissingFilter())
if err != nil {
log.Error("backfill video seoSlug find fail", log.E(err))
return
}
for i := range list {
if list[i].Title == "" {
continue
}
slug, e := resolveVideoSeoSlug("", list[i].Title, list[i].ID)
if e != nil || slug == "" {
continue
}
setSeoSlug(mod.Update, list[i].ID, slug)
}
}
func backfillHeroSeoSlug() {
mod := &officialwebsitemod.Hero{}
list, err := mod.FindMany(seoSlugMissingFilter())
if err != nil {
log.Error("backfill hero seoSlug find fail", log.E(err))
return
}
for i := range list {
if list[i].Name == "" {
continue
}
slug, e := resolveHeroSeoSlug("", list[i].Name, list[i].ID)
if e != nil || slug == "" {
continue
}
setSeoSlug(mod.Update, list[i].ID, slug)
}
}
func backfillAlbumSeoSlug() {
mod := &officialwebsitemod.Album{}
list, err := mod.FindMany(seoSlugMissingFilter())
if err != nil {
log.Error("backfill album seoSlug find fail", log.E(err))
return
}
for i := range list {
if list[i].Title == "" {
continue
}
slug, e := resolveAlbumSeoSlug("", list[i].Title, list[i].ID)
if e != nil || slug == "" {
continue
}
setSeoSlug(mod.Update, list[i].ID, slug)
}
}
func backfillNewsSeoSlug() {
mod := &officialwebsitemod.News{}
list, err := mod.FindMany(seoSlugMissingFilter())
if err != nil {
log.Error("backfill news seoSlug find fail", log.E(err))
return
}
for i := range list {
if list[i].Title == "" {
continue
}
slug, e := resolveNewsSeoSlug("", list[i].Title, list[i].ID)
if e != nil || slug == "" {
continue
}
setSeoSlug(mod.Update, list[i].ID, slug)
}
}
func backfillPhotographSeoSlug() {
mod := &officialwebsitemod.Photograph{}
list, err := mod.FindMany(seoSlugMissingFilter())
if err != nil {
log.Error("backfill photograph seoSlug find fail", log.E(err))
return
}
for i := range list {
if list[i].Name == "" {
continue
}
slug, e := resolvePhotographSeoSlug("", list[i].Name, list[i].ID)
if e != nil || slug == "" {
continue
}
setSeoSlug(mod.Update, list[i].ID, slug)
}
}