package mediabookshelfser import ( "91porn-server/app/service/mediaser" "91porn-server/common" "91porn-server/common/log" "91porn-server/middleware/ua" "91porn-server/models/cache/mediabookshelfdata" "91porn-server/models/commod" "91porn-server/models/v/mediabookshelfmod" "91porn-server/models/v/mediamod" "91porn-server/models/v/usermod" "errors" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" ) type AppQueryListReq struct { Type string `json:"type" form:"type" binding:"required,oneof=video image text drama"` // 类型 "video":动漫,"image":漫画,"text":小说,"drama":短剧 SortType int `json:"sortType" form:"sortType"` // 排序 0、最新收藏 1.最近更新 commod.Page } type AppListRes struct { Total int64 `json:"total" bson:"total"` // 总数 HasNext bool `json:"hasNext" bson:"hasNext"` // 是否有下一页 List []mediabookshelfdata.AppSimpleData `json:"list" bson:"list"` // 列表数据 } // GetList 获取列表 func (p *AppQueryListReq) GetList(uid uint64) (any, error) { if p.Type == mediamod.MediaTypeDrama { return p.getDramaList(uid) } if p.SortType == 0 { return p.getListByCreateAt(uid) } // 按照更新时间获取 // 获取列表 filter := bson.M{"shelfType": p.Type, "uid": uid} data, _, _, err := mediabookshelfdata.GetListFromCache(uid, filter, 0, 100, bson.D{}) if err != nil { log.Error("获取媒体书架列表列表数据错误", log.Any("Params", *p), log.E(err)) return nil, err } ids := []primitive.ObjectID{} for _, v := range data { ids = append(ids, v.MID) } // 按照子集更新时间来排 res := AppListRes{} res.List = mediabookshelfdata.FormatAppSimpleDataList(data, int64(p.Skip()), int64(p.Limit()), bson.D{{Key: "contentUpdateTime", Value: -1}}) return res, nil } func (p *AppQueryListReq) getDramaList(uid uint64) (res struct { Total int64 `json:"total"` HasNext bool `json:"hasNext"` List []*mediamod.AppMediaBase `json:"list"` }, err error) { ids, total, hasNext, err := mediabookshelfmod.GetDramaMediaIDs( uid, int64(p.Skip()), int64(p.Limit()), p.SortType == 1, ) if err != nil { return res, err } _, mediaMap, err := mediamod.GetListByIds(ids) if err != nil { return res, err } ordered := make([]*mediamod.Media, 0, len(ids)) for _, id := range ids { media, ok := mediaMap[id] if !ok || media.MediaType != mediamod.MediaTypeDrama || media.Status != 1 || media.IsDelete { continue } copy := media ordered = append(ordered, ©) } res.Total = total res.HasNext = hasNext res.List = mediaser.FillMedias(ordered, uid, true) if res.List == nil { res.List = make([]*mediamod.AppMediaBase, 0) } return res, nil } func (p *AppQueryListReq) getListByCreateAt(uid uint64) (res AppListRes, err error) { filter := bson.M{"shelfType": p.Type, "uid": uid} sort := bson.D{{"readAt", -1}, {"_id", -1}} // 获取列表 var data []mediabookshelfmod.MediaBookshelf data, res.Total, res.HasNext, err = mediabookshelfdata.GetListFromCache(uid, filter, int64(p.Skip()), int64(p.Limit()), sort) if err != nil { log.Error("获取媒体书架列表列表数据错误", log.Any("Params", *p), log.E(err)) return } res.List = mediabookshelfdata.FormatAppSimpleDataList(data, 0, int64(len(data)), bson.D{}) return } type AppAddBookshelfReq struct { Id string `json:"id" form:"id"` // 媒体ID } // Add 添加入书架 func (p *AppAddBookshelfReq) Add(uid uint64, ua ua.UA, ip string) (err error) { oid, err := primitive.ObjectIDFromHex(p.Id) if err != nil { return err } // 获取媒体 mediaInfo, err := mediamod.GetInfo(oid) if err != nil { return err } if mediaInfo.ID.IsZero() { return errors.New("media is not exist") } if mediaInfo.MediaType == mediamod.MediaTypeDrama && (mediaInfo.Status != 1 || mediaInfo.IsDelete) { return errors.New("drama is inactive") } //// 获取当前用户书架里的书的数量 //total, err := mediabookshelfmod.GetCount(uid) //if err != nil { // return //} //user, err := usermod.FindUserByUID(uid) //if err != nil { // return //} //if (user.VipLevel > 0 && total >= 100) || (user.VipLevel == 0 && total >= 30) { // log.Info("加入书架失败,超过数量限制", log.Any("uid", uid), log.Any("vipLvel", user.VipLevel), log.Any("total", total)) // return errors.New("加入失败") //} // 获取是否添加书架 filter := bson.M{"uid": uid, "mid": mediaInfo.ID} info, err := mediabookshelfmod.GetInfoByCond(filter) if err != nil { return err } if !info.ID.IsZero() { return errors.New("book already added") } now := time.Now() // 添加数据记录 data := mediabookshelfmod.MediaBookshelf{ ShelfType: mediaInfo.MediaType, MID: mediaInfo.ID, UID: uid, IsDelete: false, ReadAt: now, UpdateTime: now, CreatedAt: now, } // 创建数据 if _, err := mediabookshelfdata.InsertData(nil, uid, data); err != nil { return err } common.Go(func() { mediamod.IncCollectCount(mediaInfo.ID, 1) }) return nil } type AppDelBookshelfReq struct { Id string `json:"id" bson:"id"` // 媒体id } // Del 删除书架中书籍 func (p *AppDelBookshelfReq) Del(uid uint64, ua ua.UA, ip string) (err error) { user, err := usermod.FindUserByUID(uid) if err != nil { return err } if user == nil || user.ID.IsZero() { return errors.New("user is not exist") } oid, _ := primitive.ObjectIDFromHex(p.Id) // 获取媒体 mediaInfo, err := mediamod.GetInfo(oid) if err != nil { return err } filter := bson.M{"mid": oid, "uid": uid} err = mediabookshelfdata.DeleteDataByCond(nil, uid, filter) if err != nil { return err } common.Go(func() { mediamod.IncCollectCount(mediaInfo.ID, -1) }) return nil } type AppDelBatchBookshelfReq struct { IDS []primitive.ObjectID `json:"ids" bson:"ids"` // acg的id } // Del 删除书架中书籍 func (p *AppDelBatchBookshelfReq) Del(uid uint64) (err error) { user, err := usermod.FindUserByUID(uid) if err != nil { return err } if user == nil || user.ID.IsZero() { return errors.New("user is not exist") } err = mediabookshelfdata.DeleteDataByIds(nil, uid, p.IDS) if err != nil { return err } go func() { for _, id := range p.IDS { mediamod.IncCollectCount(id, -1) } }() return nil }