package mail import ( "context" "go_dreamfactory/comm" "go_dreamfactory/modules" "go_dreamfactory/pb" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/log" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/x/bsonx" ) type modelMail struct { modules.MCompModel } func (this *modelMail) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { this.TableName = comm.TableMail this.MCompModel.Init(service, module, comp, options) //创建uid索引 this.DB.CreateIndex(core.SqlTable(comm.TableMail), mongo.IndexModel{ Keys: bsonx.Doc{{Key: "uid", Value: bsonx.Int32(1)}}, }) return } func (this *modelMail) MailQueryUserMail(uId string) (mail []*pb.DBMailData, err error) { var index int32 if _data, err := this.DB.Find(comm.TableMail, bson.M{"uid": uId}); err == nil { for _data.Next(context.TODO()) { index++ temp := &pb.DBMailData{} if err = _data.Decode(temp); err == nil { if index > comm.MaxMailCount { // 删除超标的邮件 this.DB.DeleteOne(comm.TableMail, bson.M{"_id": temp.ObjId}, options.Delete()) continue } mail = append(mail, temp) } } } if len(mail) == 0 { // 没有邮件的时候 err返回空 err = nil } return } // 插入一封新的邮件 func (this *modelMail) MailInsertUserMail(mail *pb.DBMailData) (err error) { mail.ObjId = primitive.NewObjectID().Hex() mail.Check = false mail.Reward = true if len(mail.GetItems()) > 0 { mail.Reward = false } _, err = this.DB.InsertOne(comm.TableMail, mail) return err } func (this *modelMail) MailReadOneMail(objId string) (mail *pb.DBMailData, err error) { err = this.DB.FindOneAndUpdate( comm.TableMail, bson.M{"_id": objId}, bson.M{"$set": bson.M{ "check": true, }}, options.FindOneAndUpdate().SetUpsert(true).SetReturnDocument(options.After), ).Decode(&mail) return mail, err } // 查询附件信息 func (this *modelMail) MailGetMailAttachment(objId string) (itmes []*pb.UserAssets, err error) { var nd *pb.DBMailData err = this.DB.FindOne(comm.TableMail, bson.M{"_id": objId}).Decode(&nd) if err == nil { itmes = nd.GetItems() } return itmes, err } // 查看领取附件状态 func (this *modelMail) MailGetMailAttachmentState(objId string) (*pb.DBMailData, error) { var nd *pb.DBMailData err := this.DB.FindOne(comm.TableMail, bson.M{"_id": objId}).Decode(&nd) return nd, err } func (this *modelMail) GetMailCountByUid(uid string) (int32, error) { var count int64 count, err := this.DB.CountDocuments(comm.TableMail, bson.M{"uid": uid}) return int32(count), err } // 删除超过最大邮件数量的邮件 func (this *modelMail) DelOtherMail(uid string) { if _data, err := this.DB.Find(comm.TableMail, bson.M{"uid": uid}); err == nil { var index int32 for _data.Next(context.TODO()) { index++ temp := &pb.DBMailData{} if err = _data.Decode(temp); err == nil { if index >= comm.MaxMailCount { // 删除超标的邮件 this.DB.DeleteOne(comm.TableMail, bson.M{"_id": temp.ObjId}, options.Delete()) continue } } } } } // 更新领取附件状态 func (this *modelMail) MailUpdateMailAttachmentState(objId string) bool { this.DB.FindOneAndUpdate( comm.TableMail, bson.M{"_id": objId}, bson.M{"$set": bson.M{ "reward": true, "check": true, }}, options.FindOneAndUpdate().SetUpsert(false).SetReturnDocument(options.After), ) return true } // 删除一封邮件 func (this *modelMail) MailDelUserMail(objId string) bool { var obj *pb.DBMailData err := this.DB.FindOne(comm.TableMail, bson.M{"_id": objId}).Decode(&obj) if err != nil { return false } this.DB.DeleteOne(comm.TableMail, bson.M{"_id": objId}) return true } func (this *modelMail) MailQueryUserMailByReard(uId string) (mail []*pb.DBMailData, err error) { if _data, err := this.DB.Find(comm.TableMail, bson.M{"uid": uId, "reward": false}); err == nil { for _data.Next(context.TODO()) { temp := &pb.DBMailData{} if err = _data.Decode(temp); err == nil { mail = append(mail, temp) } } } return } //附件红点 func (this *modelMail) checkReddot26(uid string) bool { mailinfo, err := this.MailQueryUserMail(uid) if err != nil { return false } for _, v := range mailinfo { if !v.Reward && len(v.Items) > 0 { return true } } return false } // 未读红点 func (this *modelMail) checkReddot30(uid string) bool { mailinfo, err := this.MailQueryUserMail(uid) if err != nil { return false } if len(mailinfo) == 0 { return false } for _, v := range mailinfo { if !v.Check { return true } } return false } func (this *modelMail) MailGetAttachmentMail(objId []string) bool { Where := bson.M{} Query := bson.M{ "reward": true, "check": true, } Where = bson.M{"_id": bson.M{"$in": objId}} data, err := this.DB.UpdateMany(core.SqlTable(comm.TableMail), Where, bson.M{"$set": Query}, options.MergeUpdateOptions().SetUpsert(true)) if err != nil { log.Errorf("Update : %+v err :%v, ", data, err) } return true }