@@ -0,0 +1,355 @@
|
||||
package moduleser
|
||||
|
||||
import (
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/models/v/tagmod"
|
||||
"errors"
|
||||
"fmt"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
sli "91porn-server/common/slice"
|
||||
"91porn-server/common/stderr"
|
||||
"91porn-server/models/commod"
|
||||
"91porn-server/models/v/moduleconfmod"
|
||||
"91porn-server/models/v/modulesectionmod"
|
||||
"91porn-server/models/v/modulevidmod"
|
||||
"91porn-server/models/v/usermod"
|
||||
"91porn-server/models/v/vidmod"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
// AddModule 添加模块专题配置
|
||||
func AddModule(mconf moduleconfmod.ModuleConf) error {
|
||||
if err := validateDramaModuleName(mconf.Type, mconf.ModuleName); err != nil {
|
||||
return err
|
||||
}
|
||||
return moduleconfmod.InsertOne(&mconf)
|
||||
}
|
||||
|
||||
func validateDramaModuleName(moduleType int, moduleName string) error {
|
||||
if moduleType != moduleconfmod.Drama {
|
||||
return nil
|
||||
}
|
||||
name := strings.TrimSpace(moduleName)
|
||||
lowerName := strings.ToLower(name)
|
||||
if strings.Contains(lowerName, "ai") || strings.Contains(name, "热门") || strings.Contains(lowerName, "hot") {
|
||||
return nil
|
||||
}
|
||||
return errors.New("短剧模块名称必须包含AI、热门或hot")
|
||||
}
|
||||
|
||||
func AddSection(section modulesectionmod.Section) error {
|
||||
return modulesectionmod.InsertOne(section)
|
||||
}
|
||||
|
||||
// UpdateModule 更新模块专题配置
|
||||
func UpdateModule(editSelector moduleconfmod.EditSelector) error {
|
||||
current, err := moduleconfmod.GetByID(editSelector.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
moduleType := current.Type
|
||||
moduleName := current.ModuleName
|
||||
if editSelector.Type != nil {
|
||||
moduleType = *editSelector.Type
|
||||
}
|
||||
if editSelector.ModuleName != nil {
|
||||
moduleName = *editSelector.ModuleName
|
||||
}
|
||||
if err = validateDramaModuleName(moduleType, moduleName); err != nil {
|
||||
return err
|
||||
}
|
||||
return moduleconfmod.UpdateOne(editSelector)
|
||||
}
|
||||
|
||||
func UpdateSection(editSelector modulesectionmod.EditSelector) error {
|
||||
var tagIds []primitive.ObjectID
|
||||
if editSelector.Tags != nil && len(*editSelector.Tags) > 0 {
|
||||
tags, err := tagmod.FindOneTagByNames(*editSelector.Tags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(tags) <= 0 {
|
||||
return errors.New("tag is null")
|
||||
}
|
||||
for _, t := range tags {
|
||||
tagIds = append(tagIds, t.ID)
|
||||
}
|
||||
}
|
||||
editSelector.TagIds = tagIds
|
||||
return modulesectionmod.UpdateOne(editSelector)
|
||||
}
|
||||
|
||||
func DeleteSection(id primitive.ObjectID) error {
|
||||
return modulesectionmod.DeleteById(id)
|
||||
}
|
||||
|
||||
// GetModuleList 获取专题下视频列表
|
||||
func GetModuleList(query modulevidmod.QuerySelector, page commod.Page) (resp ModuleVideoList, err error) {
|
||||
list, hasNext, total, err := modulevidmod.Search(&query, page)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
listLen := len(list)
|
||||
sectionIDs := make([]primitive.ObjectID, listLen)
|
||||
videoIDs := make([]primitive.ObjectID, listLen)
|
||||
for i, sec := range list {
|
||||
sectionIDs[i] = sec.SectionID
|
||||
videoIDs[i] = sec.VideoID
|
||||
}
|
||||
sections, err := modulesectionmod.GetByIDs(sli.RemoveRepObjectID(sectionIDs))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
sectionModuleMap := make(map[primitive.ObjectID]modulesectionmod.SectionModule)
|
||||
for _, v := range sections {
|
||||
sectionModuleMap[v.ID] = v
|
||||
}
|
||||
videos, err := vidmod.GetVideoListByIDsNoStatus(videoIDs)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
videoMap := make(map[primitive.ObjectID]vidmod.VideoModel)
|
||||
for _, video := range videos {
|
||||
videoMap[video.ID] = *video
|
||||
}
|
||||
resp.List = make([]ModuleVideo, listLen)
|
||||
for i, sec := range list {
|
||||
secVideo := ModuleVideo{
|
||||
ID: sec.ID,
|
||||
SectionID: sec.SectionID,
|
||||
CreatedAt: sec.CreatedAt,
|
||||
SortCode: sec.SortCode,
|
||||
}
|
||||
if module, ok := sectionModuleMap[sec.SectionID]; ok {
|
||||
secVideo.SectionName = module.SectionName
|
||||
if len(module.SectionModule) > 0 {
|
||||
secVideo.ModuleName = module.SectionModule[0].ModuleName
|
||||
secVideo.SubModuleName = module.SectionModule[0].SubModuleName
|
||||
}
|
||||
}
|
||||
secVideo.VideoInfo = VideoInfo{
|
||||
VideoID: videoMap[sec.VideoID].ID,
|
||||
Title: videoMap[sec.VideoID].Title,
|
||||
PublisherID: videoMap[sec.VideoID].PublisherID,
|
||||
Cover: videoMap[sec.VideoID].Cover,
|
||||
}
|
||||
resp.List[i] = secVideo
|
||||
}
|
||||
resp.Total = total
|
||||
resp.HasNext = hasNext
|
||||
return
|
||||
}
|
||||
|
||||
// AddVideoBatch 专题下批量添加视频
|
||||
func AddVideoBatch(req AddVideoBatchReq) error {
|
||||
section, err := modulesectionmod.GetBySectionByID(req.SectionID)
|
||||
if err != nil {
|
||||
return stderr.ErrDbQueryError
|
||||
}
|
||||
|
||||
if section.ID.IsZero() {
|
||||
return stderr.CodeEmptyData
|
||||
}
|
||||
mId := section.SubModuleID
|
||||
|
||||
videoIdStrs := strings.Split(req.VideoIDs, ",")
|
||||
vids := make([]primitive.ObjectID, len(videoIdStrs))
|
||||
for i, vidIDStr := range videoIdStrs {
|
||||
videoID, err := primitive.ObjectIDFromHex(vidIDStr)
|
||||
if err != nil {
|
||||
return stderr.ErrParamError
|
||||
}
|
||||
vids[i] = videoID
|
||||
}
|
||||
list, err := vidmod.GetVideoListByIDs(vids)
|
||||
if err != nil {
|
||||
return stderr.ErrNetWorkBusy
|
||||
}
|
||||
records := make([]modulevidmod.SectionVideo, len(list))
|
||||
var vIds []primitive.ObjectID
|
||||
var ids []primitive.ObjectID
|
||||
for i := range list {
|
||||
records[i] = modulevidmod.SectionVideo{
|
||||
SectionID: req.SectionID,
|
||||
VideoID: list[i].ID,
|
||||
VideoReviewedAt: list[i].ReviewAt,
|
||||
}
|
||||
vIds = append(vIds, list[i].ID)
|
||||
}
|
||||
sectionVideos, err := modulevidmod.GetSectionsByVideoIds(vIds)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(sectionVideos) > 0 {
|
||||
for i := range sectionVideos {
|
||||
ids = append(ids, sectionVideos[i].ID)
|
||||
}
|
||||
}
|
||||
if len(ids) > 0 {
|
||||
err := modulevidmod.DeleteManyVideo(ids)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// 批量更新视频信息
|
||||
update := bson.M{}
|
||||
update["mId"] = mId.Hex()
|
||||
update["updatedAt"] = time.Now()
|
||||
|
||||
result, err := vidmod.UpdateManyVideo(vIds, update)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if result == 0 {
|
||||
return errors.New("video update failed")
|
||||
}
|
||||
|
||||
return modulevidmod.InsertMany(records)
|
||||
}
|
||||
|
||||
// AddVideo 专题下添加一条视频
|
||||
func AddVideo(sectionVid modulevidmod.SectionVideo) error {
|
||||
videoID := sectionVid.VideoID
|
||||
video, err := vidmod.GetVideoInfo(videoID.Hex())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sectionVid.VideoReviewedAt = video.ReviewAt
|
||||
sectionVid.NewsType = video.NewsType
|
||||
return modulevidmod.InsertOne(§ionVid)
|
||||
}
|
||||
|
||||
// AllSections 获取所有专题
|
||||
func AllSections() (data []modulesectionmod.ModuleSection, err error) {
|
||||
modules, err := moduleconfmod.GetAllModule()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
sections, err := modulesectionmod.AllSections()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
sectionMap := make(map[primitive.ObjectID][]modulesectionmod.Section)
|
||||
for _, s := range sections {
|
||||
sectionMap[s.SubModuleID] = append(sectionMap[s.SubModuleID], s)
|
||||
}
|
||||
data = make([]modulesectionmod.ModuleSection, len(modules))
|
||||
for i, m := range modules {
|
||||
data[i] = modulesectionmod.ModuleSection{
|
||||
ModuleConf: m,
|
||||
Sections: sectionMap[m.ID],
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func SectionSearch(q modulesectionmod.QuerySelector, p commod.Page) (resp modulesectionmod.ListResp, err error) {
|
||||
sections, hasNext, total, err := modulesectionmod.Search(q, p)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
resp.HasNext = hasNext
|
||||
resp.Total = total
|
||||
sectionsLen := len(sections)
|
||||
originalUserIDs := make([]uint64, 0, sectionsLen)
|
||||
subModuleIDs := make([]primitive.ObjectID, 0, sectionsLen)
|
||||
for _, section := range sections {
|
||||
if section.OriginalUserID != nil && *section.OriginalUserID != 0 {
|
||||
originalUserIDs = append(originalUserIDs, *section.OriginalUserID)
|
||||
}
|
||||
if !section.SubModuleID.IsZero() {
|
||||
subModuleIDs = append(subModuleIDs, section.SubModuleID)
|
||||
}
|
||||
}
|
||||
users, err := usermod.FindUsersByUID(originalUserIDs)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
subModules, err := moduleconfmod.FindByIDs(subModuleIDs)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
originalBloggerInfo := make(map[uint64]usermod.User)
|
||||
subModuleInfo := make(map[primitive.ObjectID]moduleconfmod.ModuleConf)
|
||||
for _, user := range users {
|
||||
originalBloggerInfo[user.UID] = *user
|
||||
}
|
||||
for _, module := range subModules {
|
||||
subModuleInfo[module.ID] = module
|
||||
}
|
||||
resp.List = make([]modulesectionmod.SectionDetail, sectionsLen)
|
||||
for i, section := range sections {
|
||||
detail := modulesectionmod.SectionDetail{
|
||||
Section: section,
|
||||
}
|
||||
if section.OriginalUserID != nil && *section.OriginalUserID != 0 {
|
||||
detail.OriginalBloggerInfo = modulesectionmod.OriginalBloggerInfo{
|
||||
Name: originalBloggerInfo[*section.OriginalUserID].Name,
|
||||
Portrait: originalBloggerInfo[*section.OriginalUserID].Portrait,
|
||||
OfficialCert: originalBloggerInfo[*section.OriginalUserID].OfficialCert,
|
||||
}
|
||||
}
|
||||
if !section.SubModuleID.IsZero() {
|
||||
detail.ModuleInfo = modulesectionmod.ModuleInfo{
|
||||
ModuleName: subModuleInfo[section.SubModuleID].ModuleName,
|
||||
SubModuleName: subModuleInfo[section.SubModuleID].SubModuleName,
|
||||
SectionLimit: subModuleInfo[detail.SubModuleID].SectionLimit,
|
||||
}
|
||||
}
|
||||
resp.List[i] = detail
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// QueryAllCartoonList 查询动漫模块专题配置
|
||||
func QueryAllCartoonList() ([]*modulesectionmod.AllSectionConf, error) {
|
||||
var out []*modulesectionmod.AllSectionConf
|
||||
filter := bson.M{"type": bson.M{"$in": []int{moduleconfmod.Novel, moduleconfmod.Comics, moduleconfmod.Cartoon}}, "status": 1, "deletedAt": bson.M{"$exists": false}}
|
||||
op := options.Find().SetSort(bson.M{"sortNum": -1})
|
||||
list, err := moduleconfmod.QueryAllList(filter, op)
|
||||
if err != nil {
|
||||
log.Error(fmt.Sprintf("moduleconfmod QueryAllList error:%+v:", err))
|
||||
return nil, err
|
||||
}
|
||||
var subIds []primitive.ObjectID
|
||||
if len(list) > 0 {
|
||||
for _, m := range list {
|
||||
subIds = append(subIds, m.ID)
|
||||
}
|
||||
}
|
||||
sf := bson.M{"subModuleID": bson.M{"$in": subIds}, "status": 1, "deletedAt": bson.M{"$exists": false}}
|
||||
sop := options.Find().SetSort(bson.M{"sort": -1})
|
||||
sections, err := modulesectionmod.QueryAllList(sf, sop)
|
||||
if err != nil {
|
||||
log.Error(fmt.Sprintf("modulesectionmod QueryAllList error:%+v:", err))
|
||||
return nil, err
|
||||
}
|
||||
if len(sections) > 0 {
|
||||
for _, m := range list {
|
||||
mes := &modulesectionmod.AllSectionConf{
|
||||
ID: m.ID,
|
||||
ModuleName: m.ModuleName,
|
||||
}
|
||||
var allSection []modulesectionmod.SectionConf
|
||||
for _, s := range sections {
|
||||
if s.SubModuleID.Hex() == m.ID.Hex() {
|
||||
nes := modulesectionmod.SectionConf{
|
||||
ID: s.ID,
|
||||
SectionName: s.SectionName,
|
||||
}
|
||||
allSection = append(allSection, nes)
|
||||
}
|
||||
}
|
||||
mes.AllSection = allSection
|
||||
out = append(out, mes)
|
||||
}
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
Reference in New Issue
Block a user