init: web_hgdjc_server
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user