Files
web_hgcg_server/web/service/srv_seopush/bulk.go
T
rootandClaude Opus 4.7 f8ae5e13dd 代码优化
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-27 17:11:58 +08:00

80 lines
2.5 KiB
Go

package srv_seopush
import (
"context"
"fmt"
"net/url"
"strings"
"videoweb/pub/common/log"
"videoweb/pub/common/srvdef"
"videoweb/pub/common/utils"
"videoweb/pub/models/playletthememod"
seoindexnow "videoweb/pub/seo/indexnow"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo/options"
)
// BulkIndexNowResult 批量提交结果,包含提交的 URL 列表和 IndexNow 原始回执。
type BulkIndexNowResult struct {
URLs []string `json:"urls"`
SubmitInfo *seoindexnow.BatchResult `json:"submitInfo"`
}
// SubmitHomeAndThemes 组装主页 + 前 N 个专题(按 Rank 降序)URL,批量提交 IndexNow。
// limit 为 URL 总数(包含主页),默认 10;小于等于 1 时视为仅主页。
// hostOverride 非空时覆盖 sys_cfg.webAddr,用于把同一批内容推到新域名(支持带 scheme 或裸域名)。
func SubmitHomeAndThemes(ctx context.Context, limit int, hostOverride string) (*BulkIndexNowResult, *srvdef.SrvErr) {
if limit <= 0 {
limit = 10
}
webAddr := strings.TrimRight(strings.TrimSpace(hostOverride), "/")
if webAddr == "" {
webAddr = SEOBaseURL(ctx)
} else if !strings.HasPrefix(webAddr, "http://") && !strings.HasPrefix(webAddr, "https://") {
webAddr = "https://" + webAddr
}
if webAddr == "" {
return nil, srvdef.New(srvdef.ErrNoData, "WebAddr 未配置", "")
}
root := strings.TrimRight(webAddr, "/")
urls := make([]string, 0, limit)
urls = append(urls, root+"/")
if remain := limit - 1; remain > 0 {
themes, err := playletthememod.FindManyPlayletTheme(ctx,
bson.M{playletthememod.FN.PlayletTheme.Status: true},
options.Find().
SetSort(bson.M{playletthememod.FN.PlayletTheme.Rank: -1}).
SetLimit(int64(remain)))
if err == nil {
for _, t := range themes {
if t == nil || t.Id <= 0 {
continue
}
seg := url.PathEscape(utils.PathSegment(t.Slug, t.Id))
if seg == "" {
continue
}
urls = append(urls, root+"/collection/"+seg)
}
} else {
log.Warn("seopush bulk: list themes failed", log.Any("err", err))
}
}
config, cerr := seoindexnow.BuildConfig(webAddr)
if cerr != nil {
return nil, srvdef.New(srvdef.Failure, fmt.Sprintf("构造 IndexNow 配置失败: %v", cerr), "")
}
result := seoindexnow.NewBatchIndexNowSubmitter(config).SubmitBatch(urls)
log.Info("seopush bulk: indexnow submitted",
log.Any("urls", urls),
log.Any("statusCodes", result.StatusCodes),
log.Any("success", result.SuccessCount),
log.Any("fail", result.FailCount))
return &BulkIndexNowResult{URLs: urls, SubmitInfo: result}, nil
}