@@ -0,0 +1,141 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user