142 lines
3.7 KiB
Go
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)
|
|
}
|
|
}
|