Files
rootandClaude Opus 4.7 79ac89b458 Initial commit
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-11-07 10:47:18 +08:00

143 lines
5.1 KiB
Go

package srv_homeconfig
import (
"context"
"videoweb/pub/common/srvdef"
"videoweb/pub/models/homeconfigmod"
"videoweb/pub/models/playletthememod"
"videoweb/web/api/proto"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo/options"
)
// validateHomeConfigTopics 校验题材配置、去重,并阻止启用模块重复占用题材
func validateHomeConfigTopics(ctx context.Context, config *homeconfigmod.HomeConfig) *srvdef.SrvErr {
if config.Style != "" && (len(config.Style) != 1 || config.Style[0] < 'A' || config.Style[0] > 'H') {
return srvdef.New(srvdef.ErrParamError, "样式仅支持 A-H", "")
}
if config.CategoryId < 0 || config.RecommendType < 0 || config.RecommendType > 5 {
return srvdef.New(srvdef.ErrParamError, "推荐配置无效", "")
}
if config.RecommendType == 5 && config.CategoryId == 0 {
return srvdef.New(srvdef.ErrParamError, "按分类推荐时必须填写分类ID", "")
}
if config.Type != homeconfigmod.TypeTheme {
if len(config.TopicIds) != 0 {
return srvdef.New(srvdef.ErrParamError, "短剧模块不能配置题材ID", "")
}
return nil
}
seen := map[int64]bool{}
ids := make([]int64, 0, len(config.TopicIds))
for _, id := range config.TopicIds {
if id <= 0 {
return srvdef.New(srvdef.ErrParamError, "题材ID无效", "")
}
if !seen[id] {
ids = append(ids, id)
seen[id] = true
}
}
config.TopicIds = ids
if !config.Status {
return nil
}
if len(ids) == 0 {
if config.Id == 0 {
return srvdef.New(srvdef.ErrParamError, "启用的题材模块必须配置题材ID", "")
}
return nil // 历史题材配置沿用自动选题材
}
themes, err := playletthememod.FindManyPlayletTheme(ctx, bson.M{playletthememod.FN.PlayletTheme.Id: bson.M{"$in": ids}, playletthememod.FN.PlayletTheme.Status: true})
if err != nil {
return err
}
if len(themes) != len(ids) {
return srvdef.New(srvdef.ErrParamError, "题材不存在或未上架", "")
}
others, err := homeconfigmod.FindManyHomeConfig(ctx, bson.M{homeconfigmod.FN.HomeConfig.Status: true, homeconfigmod.FN.HomeConfig.Type: homeconfigmod.TypeTheme, homeconfigmod.FN.HomeConfig.TopicIds: bson.M{"$in": ids}})
if err != nil {
return err
}
for _, other := range others {
if other != nil && other.Id != config.Id {
return srvdef.New(srvdef.ErrParamError, "题材已被其他启用模块使用", "")
}
}
return nil
}
// ListHomeTopicOptions 分页查询可选的已上架短剧题材,并回显当前配置已选题材
func ListHomeTopicOptions(ctx context.Context, req *proto.HomeTopicOptionsReq) (*proto.HomeTopicOptionsResp, *srvdef.SrvErr) {
if req == nil || req.ConfigId < 0 {
return nil, srvdef.New(srvdef.ErrParamError, "配置ID无效", "")
}
pageNum, pageSize := normalizeHomeConfigPage(req.PageNum, req.PageSize)
resp := &proto.HomeTopicOptionsResp{List: make([]*proto.HomeTopicOption, 0), SelectedList: make([]*proto.HomeTopicOption, 0), PageNum: pageNum, PageSize: pageSize}
var selected []int64
if req.ConfigId > 0 {
current, err := homeconfigmod.FindOneHomeConfig(ctx, bson.M{homeconfigmod.FN.HomeConfig.Id: req.ConfigId})
if err != nil {
return nil, err
}
if current.Type != homeconfigmod.TypeTheme {
return nil, srvdef.New(srvdef.ErrParamError, "当前配置不是题材模块", "")
}
selected = current.TopicIds
}
occupied := map[int64]bool{}
configs, err := homeconfigmod.FindManyHomeConfig(ctx, bson.M{homeconfigmod.FN.HomeConfig.Status: true, homeconfigmod.FN.HomeConfig.Type: homeconfigmod.TypeTheme})
if err != nil {
return nil, err
}
for _, config := range configs {
if config != nil && config.Id != req.ConfigId {
for _, id := range config.TopicIds {
occupied[id] = true
}
}
}
filter := bson.M{playletthememod.FN.PlayletTheme.Status: true}
if len(occupied) > 0 {
ids := make([]int64, 0, len(occupied))
for id := range occupied {
ids = append(ids, id)
}
filter[playletthememod.FN.PlayletTheme.Id] = bson.M{"$nin": ids}
}
resp.TotalCount, err = playletthememod.CountPlayletTheme(ctx, filter)
if err != nil {
return nil, err
}
list, err := playletthememod.FindManyPlayletTheme(ctx, filter, options.Find().SetSort(bson.D{{Key: playletthememod.FN.PlayletTheme.Rank, Value: -1}, {Key: playletthememod.FN.PlayletTheme.Id, Value: -1}}).SetSkip((pageNum-1)*pageSize).SetLimit(pageSize))
if err != nil {
return nil, err
}
for _, item := range list {
if item != nil {
resp.List = append(resp.List, &proto.HomeTopicOption{Id: item.Id, Name: item.Name, Status: item.Status})
}
}
if len(selected) > 0 {
themes, err := playletthememod.FindManyPlayletTheme(ctx, bson.M{playletthememod.FN.PlayletTheme.Id: bson.M{"$in": selected}})
if err != nil {
return nil, err
}
byID := map[int64]*proto.HomeTopicOption{}
for _, item := range themes {
if item != nil {
byID[item.Id] = &proto.HomeTopicOption{Id: item.Id, Name: item.Name, Status: item.Status}
}
}
for _, id := range selected {
if item := byID[id]; item != nil {
resp.SelectedList = append(resp.SelectedList, item)
} else {
resp.SelectedList = append(resp.SelectedList, &proto.HomeTopicOption{Id: id})
}
}
}
return resp, nil
}