45 lines
1.4 KiB
Go
45 lines
1.4 KiB
Go
// Package sitemapdirty 在 web 与 app 之间传递「站点内容已变更」的标记。
|
|
// web 进程负责文章的发布/更新/删除,而 sitemap 文件由 app 进程生成并对外提供,
|
|
// 两者独立部署且不互相调用,因此借数据库中的一条记录做跨进程通知。
|
|
package sitemapdirty
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
"videoweb/pub/common/log"
|
|
"videoweb/pub/models/syncfilemod"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
)
|
|
|
|
func recordFilter() bson.M {
|
|
return bson.M{syncfilemod.FN.SyncRecord.Job: syncfilemod.SitemapDirtyJob}
|
|
}
|
|
|
|
// Mark 标记内容已变更,app 侧会在下一个检查周期重新生成 sitemap
|
|
func Mark(ctx context.Context) {
|
|
now := time.Now()
|
|
update := bson.M{
|
|
"$set": bson.M{
|
|
syncfilemod.FN.SyncRecord.RecordTime: now,
|
|
syncfilemod.FN.SyncRecord.UpdatedAt: now,
|
|
},
|
|
"$setOnInsert": bson.M{
|
|
syncfilemod.FN.SyncRecord.Job: syncfilemod.SitemapDirtyJob,
|
|
syncfilemod.FN.SyncRecord.CreatedAt: now,
|
|
},
|
|
}
|
|
if serr := syncfilemod.UpsertOneSyncRecord(ctx, recordFilter(), update); serr != nil {
|
|
log.Warn("sitemapdirty: mark failed", log.E(serr))
|
|
}
|
|
}
|
|
|
|
// LastDirtyAt 读取最近一次内容变更时间,无记录时返回零值
|
|
func LastDirtyAt(ctx context.Context) time.Time {
|
|
record, serr := syncfilemod.FindOneSyncRecord(ctx, recordFilter())
|
|
if serr != nil || record == nil {
|
|
return time.Time{}
|
|
}
|
|
return record.RecordTime
|
|
}
|