package srv_playlet import ( "context" "strings" "videoweb/pub/common/srvdef" "videoweb/pub/models/playletthememod" "videoweb/pub/models/playlettopicgroupmod" "videoweb/web/api/proto" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo/options" ) // ListPlayletTopicGroups 查询后台专题区块 func ListPlayletTopicGroups(ctx context.Context, req *proto.PlayletTopicGroupListReq) (*proto.PlayletTopicGroupListResp, *srvdef.SrvErr) { if req == nil { return nil, srvdef.New(srvdef.ErrParamError, "", "") } pageNum, pageSize := normalizePage(req.PageNum, req.PageSize) filter := bson.M{} if req.Status != nil { filter["status"] = *req.Status } totalCount, err := playlettopicgroupmod.Count(ctx, filter) if err != nil { return nil, err } resp := &proto.PlayletTopicGroupListResp{ TotalCount: totalCount, PageNum: int(pageNum), PageSize: int(pageSize), List: make(playlettopicgroupmod.PlayletTopicGroupList, 0), } if totalCount == 0 || (pageNum-1)*pageSize >= totalCount { return resp, nil } list, err := playlettopicgroupmod.FindMany(ctx, filter, options.Find().SetSkip((pageNum-1)*pageSize).SetLimit(pageSize)) if err != nil { return nil, err } resp.List = list return resp, nil } // AddPlayletTopicGroup 新增专题区块 func AddPlayletTopicGroup(ctx context.Context, req *proto.PlayletTopicGroupAddReq) (*proto.PlayletTopicGroupAddResp, *srvdef.SrvErr) { if req == nil || strings.TrimSpace(req.Name) == "" || req.Status == nil { return nil, srvdef.New(srvdef.ErrParamError, "专题区块参数无效", "") } ids, err := validateTopicGroupIDs(ctx, req.TopicIds) if err != nil { return nil, err } doc := &playlettopicgroupmod.PlayletTopicGroup{ Name: strings.TrimSpace(req.Name), Desc: strings.TrimSpace(req.Desc), TopicIds: ids, Rank: req.Rank, Status: *req.Status, } if err := playlettopicgroupmod.Insert(ctx, doc); err != nil { return nil, err } return &proto.PlayletTopicGroupAddResp{Id: doc.Id}, nil } // UpdatePlayletTopicGroup 更新专题区块 func UpdatePlayletTopicGroup(ctx context.Context, req *proto.PlayletTopicGroupUpdateReq) *srvdef.SrvErr { if req == nil || req.Id <= 0 { return srvdef.New(srvdef.ErrParamError, "专题区块ID无效", "") } set := bson.M{} if req.Name != nil { name := strings.TrimSpace(*req.Name) if name == "" { return srvdef.New(srvdef.ErrParamError, "专题区块名称不能为空", "") } set["name"] = name } if req.Desc != nil { set["desc"] = strings.TrimSpace(*req.Desc) } if req.TopicIds != nil { ids, err := validateTopicGroupIDs(ctx, *req.TopicIds) if err != nil { return err } set["topicIds"] = ids } if req.Rank != nil { set["rank"] = *req.Rank } if req.Status != nil { set["status"] = *req.Status } if len(set) == 0 { return srvdef.New(srvdef.ErrParamError, "没有可更新字段", "") } return playlettopicgroupmod.Update(ctx, req.Id, set) } // DeletePlayletTopicGroup 删除专题区块 func DeletePlayletTopicGroup(ctx context.Context, id int64) *srvdef.SrvErr { if id <= 0 { return srvdef.New(srvdef.ErrParamError, "专题区块ID无效", "") } return playlettopicgroupmod.Delete(ctx, id) } func validateTopicGroupIDs(ctx context.Context, ids []int64) ([]int64, *srvdef.SrvErr) { if len(ids) == 0 { return []int64{}, nil } seen := make(map[int64]bool, len(ids)) for _, id := range ids { if id <= 0 || seen[id] { return nil, srvdef.New(srvdef.ErrParamError, "专题ID无效或重复", "") } seen[id] = true } count, err := playletthememod.CountPlayletTheme(ctx, bson.M{playletthememod.FN.PlayletTheme.Id: bson.M{"$in": ids}}) if err != nil { return nil, err } if count != int64(len(ids)) { return nil, srvdef.New(srvdef.ErrParamError, "专题不存在", "") } return ids, nil }