From 7fc279a329c3b6a9ec101dd3ba7f60234fbc212f Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Sat, 28 Jan 2023 16:36:38 +0800 Subject: [PATCH] errcode --- pkg/common/db/controller/group.go | 2 +- pkg/common/db/relation/init_mysql.go | 1 + pkg/common/db/unrelation/init_mongo.go | 2 +- pkg/common/db/unrelation/mongo_model.go | 305 +----------------------- pkg/common/db/unrelation/office.go | 284 ++++++++++++++++++++++ pkg/common/db/unrelation/super_group.go | 20 +- 6 files changed, 298 insertions(+), 316 deletions(-) diff --git a/pkg/common/db/controller/group.go b/pkg/common/db/controller/group.go index 350014f8a..ae4aa3007 100644 --- a/pkg/common/db/controller/group.go +++ b/pkg/common/db/controller/group.go @@ -62,7 +62,7 @@ type DataBase interface { type GroupDataBase struct { sqlDB *relation.Group cache *cache.GroupCache - mongoDB *unrelation.SuperGroupMgo + mongoDB *unrelation.SuperGroupMgoDB } func newGroupDatabase(db *gorm.DB, rdb redis.UniversalClient, mgoDB *mongo.Database) DataBase { diff --git a/pkg/common/db/relation/init_mysql.go b/pkg/common/db/relation/init_mysql.go index d6b11ae28..b5439a9e6 100644 --- a/pkg/common/db/relation/init_mysql.go +++ b/pkg/common/db/relation/init_mysql.go @@ -21,6 +21,7 @@ func (m *Mysql) GormConn() *gorm.DB { func (m *Mysql) SetGormConn(gormConn *gorm.DB) { m.gormConn = gormConn } + func (m *Mysql) InitConn() *Mysql { dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=true&loc=Local", config.Config.Mysql.DBUserName, config.Config.Mysql.DBPassword, config.Config.Mysql.DBAddress[0], "mysql") diff --git a/pkg/common/db/unrelation/init_mongo.go b/pkg/common/db/unrelation/init_mongo.go index 8d290752c..efd75c623 100644 --- a/pkg/common/db/unrelation/init_mongo.go +++ b/pkg/common/db/unrelation/init_mongo.go @@ -45,7 +45,7 @@ func (m *Mongo) InitMongo() { config.Config.Mongo.DBMaxPoolSize) } } - log.Println("start to init mongoDB:", uri) + log.Println(utils.GetFuncName(1), "start to init mongoDB:", uri) mongoClient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri)) if err != nil { time.Sleep(time.Duration(30) * time.Second) diff --git a/pkg/common/db/unrelation/mongo_model.go b/pkg/common/db/unrelation/mongo_model.go index 3de74f686..9cb4daaef 100644 --- a/pkg/common/db/unrelation/mongo_model.go +++ b/pkg/common/db/unrelation/mongo_model.go @@ -30,9 +30,7 @@ import ( const cChat = "msg" const cGroup = "group" -const cTag = "tag" -const cSendLog = "send_log" -const cWorkMoment = "work_moment" + const cCommentMsg = "comment_msg" const singleGocMsgNum = 5000 @@ -788,307 +786,6 @@ func (d *db.DataBases) DelGroupMember(groupID, uid string) error { //return nil } -type Tag struct { - UserID string `bson:"user_id"` - TagID string `bson:"tag_id"` - TagName string `bson:"tag_name"` - UserList []string `bson:"user_list"` -} - -func (d *db.DataBases) GetUserTags(userID string) ([]Tag, error) { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cTag) - var tags []Tag - cursor, err := c.Find(ctx, bson.M{"user_id": userID}) - if err != nil { - return tags, err - } - if err = cursor.All(ctx, &tags); err != nil { - return tags, err - } - return tags, nil -} - -func (d *db.DataBases) CreateTag(userID, tagName string, userList []string) error { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cTag) - tagID := generateTagID(tagName, userID) - tag := Tag{ - UserID: userID, - TagID: tagID, - TagName: tagName, - UserList: userList, - } - _, err := c.InsertOne(ctx, tag) - return err -} - -func (d *db.DataBases) GetTagByID(userID, tagID string) (Tag, error) { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cTag) - var tag Tag - err := c.FindOne(ctx, bson.M{"user_id": userID, "tag_id": tagID}).Decode(&tag) - return tag, err -} - -func (d *db.DataBases) DeleteTag(userID, tagID string) error { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cTag) - _, err := c.DeleteOne(ctx, bson.M{"user_id": userID, "tag_id": tagID}) - return err -} - -func (d *db.DataBases) SetTag(userID, tagID, newName string, increaseUserIDList []string, reduceUserIDList []string) error { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cTag) - var tag Tag - if err := c.FindOne(ctx, bson.M{"tag_id": tagID, "user_id": userID}).Decode(&tag); err != nil { - return err - } - if newName != "" { - _, err := c.UpdateOne(ctx, bson.M{"user_id": userID, "tag_id": tagID}, bson.M{"$set": bson.M{"tag_name": newName}}) - if err != nil { - return err - } - } - tag.UserList = append(tag.UserList, increaseUserIDList...) - tag.UserList = utils.RemoveRepeatedStringInList(tag.UserList) - for _, v := range reduceUserIDList { - for i2, v2 := range tag.UserList { - if v == v2 { - tag.UserList[i2] = "" - } - } - } - var newUserList []string - for _, v := range tag.UserList { - if v != "" { - newUserList = append(newUserList, v) - } - } - _, err := c.UpdateOne(ctx, bson.M{"user_id": userID, "tag_id": tagID}, bson.M{"$set": bson.M{"user_list": newUserList}}) - if err != nil { - return err - } - return nil -} - -func (d *db.DataBases) GetUserIDListByTagID(userID, tagID string) ([]string, error) { - var tag Tag - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cTag) - _ = c.FindOne(ctx, bson.M{"user_id": userID, "tag_id": tagID}).Decode(&tag) - return tag.UserList, nil -} - -type TagUser struct { - UserID string `bson:"user_id"` - UserName string `bson:"user_name"` -} - -type TagSendLog struct { - UserList []TagUser `bson:"tag_list"` - SendID string `bson:"send_id"` - SenderPlatformID int32 `bson:"sender_platform_id"` - Content string `bson:"content"` - SendTime int64 `bson:"send_time"` -} - -func (d *db.DataBases) SaveTagSendLog(tagSendLog *TagSendLog) error { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cSendLog) - _, err := c.InsertOne(ctx, tagSendLog) - return err -} - -func (d *db.DataBases) GetTagSendLogs(userID string, showNumber, pageNumber int32) ([]TagSendLog, error) { - var tagSendLogs []TagSendLog - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cSendLog) - findOpts := options.Find().SetLimit(int64(showNumber)).SetSkip(int64(showNumber) * (int64(pageNumber) - 1)).SetSort(bson.M{"send_time": -1}) - cursor, err := c.Find(ctx, bson.M{"send_id": userID}, findOpts) - if err != nil { - return tagSendLogs, err - } - err = cursor.All(ctx, &tagSendLogs) - if err != nil { - return tagSendLogs, err - } - return tagSendLogs, nil -} - -type WorkMoment struct { - WorkMomentID string `bson:"work_moment_id"` - UserID string `bson:"user_id"` - UserName string `bson:"user_name"` - FaceURL string `bson:"face_url"` - Content string `bson:"content"` - LikeUserList []*WorkMomentUser `bson:"like_user_list"` - AtUserList []*WorkMomentUser `bson:"at_user_list"` - PermissionUserList []*WorkMomentUser `bson:"permission_user_list"` - Comments []*Comment `bson:"comments"` - PermissionUserIDList []string `bson:"permission_user_id_list"` - Permission int32 `bson:"permission"` - CreateTime int32 `bson:"create_time"` -} - -type WorkMomentUser struct { - UserID string `bson:"user_id"` - UserName string `bson:"user_name"` -} - -type Comment struct { - UserID string `bson:"user_id" json:"user_id"` - UserName string `bson:"user_name" json:"user_name"` - ReplyUserID string `bson:"reply_user_id" json:"reply_user_id"` - ReplyUserName string `bson:"reply_user_name" json:"reply_user_name"` - ContentID string `bson:"content_id" json:"content_id"` - Content string `bson:"content" json:"content"` - CreateTime int32 `bson:"create_time" json:"create_time"` -} - -func (d *db.DataBases) CreateOneWorkMoment(workMoment *WorkMoment) error { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cWorkMoment) - workMomentID := generateWorkMomentID(workMoment.UserID) - workMoment.WorkMomentID = workMomentID - workMoment.CreateTime = int32(time.Now().Unix()) - _, err := c.InsertOne(ctx, workMoment) - return err -} - -func (d *db.DataBases) DeleteOneWorkMoment(workMomentID string) error { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cWorkMoment) - _, err := c.DeleteOne(ctx, bson.M{"work_moment_id": workMomentID}) - return err -} - -func (d *db.DataBases) DeleteComment(workMomentID, contentID, opUserID string) error { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cWorkMoment) - _, err := c.UpdateOne(ctx, bson.D{{"work_moment_id", workMomentID}, - {"$or", bson.A{ - bson.D{{"user_id", opUserID}}, - bson.D{{"comments", bson.M{"$elemMatch": bson.M{"user_id": opUserID}}}}, - }, - }}, bson.M{"$pull": bson.M{"comments": bson.M{"content_id": contentID}}}) - return err -} - -func (d *db.DataBases) GetWorkMomentByID(workMomentID string) (*WorkMoment, error) { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cWorkMoment) - workMoment := &WorkMoment{} - err := c.FindOne(ctx, bson.M{"work_moment_id": workMomentID}).Decode(workMoment) - return workMoment, err -} - -func (d *db.DataBases) LikeOneWorkMoment(likeUserID, userName, workMomentID string) (*WorkMoment, bool, error) { - workMoment, err := d.GetWorkMomentByID(workMomentID) - if err != nil { - return nil, false, err - } - var isAlreadyLike bool - for i, user := range workMoment.LikeUserList { - if likeUserID == user.UserID { - isAlreadyLike = true - workMoment.LikeUserList = append(workMoment.LikeUserList[0:i], workMoment.LikeUserList[i+1:]...) - } - } - if !isAlreadyLike { - workMoment.LikeUserList = append(workMoment.LikeUserList, &WorkMomentUser{UserID: likeUserID, UserName: userName}) - } - log.NewDebug("", utils.GetSelfFuncName(), workMoment) - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cWorkMoment) - _, err = c.UpdateOne(ctx, bson.M{"work_moment_id": workMomentID}, bson.M{"$set": bson.M{"like_user_list": workMoment.LikeUserList}}) - return workMoment, !isAlreadyLike, err -} - -func (d *db.DataBases) SetUserWorkMomentsLevel(userID string, level int32) error { - return nil -} - -func (d *db.DataBases) CommentOneWorkMoment(comment *Comment, workMomentID string) (WorkMoment, error) { - comment.ContentID = generateWorkMomentCommentID(workMomentID) - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cWorkMoment) - var workMoment WorkMoment - err := c.FindOneAndUpdate(ctx, bson.M{"work_moment_id": workMomentID}, bson.M{"$push": bson.M{"comments": comment}}).Decode(&workMoment) - return workMoment, err -} - -func (d *db.DataBases) GetUserSelfWorkMoments(userID string, showNumber, pageNumber int32) ([]WorkMoment, error) { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cWorkMoment) - var workMomentList []WorkMoment - findOpts := options.Find().SetLimit(int64(showNumber)).SetSkip(int64(showNumber) * (int64(pageNumber) - 1)).SetSort(bson.M{"create_time": -1}) - result, err := c.Find(ctx, bson.M{"user_id": userID}, findOpts) - if err != nil { - return workMomentList, nil - } - err = result.All(ctx, &workMomentList) - return workMomentList, err -} - -func (d *db.DataBases) GetUserWorkMoments(opUserID, userID string, showNumber, pageNumber int32, friendIDList []string) ([]WorkMoment, error) { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cWorkMoment) - var workMomentList []WorkMoment - findOpts := options.Find().SetLimit(int64(showNumber)).SetSkip(int64(showNumber) * (int64(pageNumber) - 1)).SetSort(bson.M{"create_time": -1}) - result, err := c.Find(ctx, bson.D{ // 等价条件: select * from - {"user_id", userID}, - {"$or", bson.A{ - bson.D{{"permission", constant.WorkMomentPermissionCantSee}, {"permission_user_id_list", bson.D{{"$nin", bson.A{opUserID}}}}}, - bson.D{{"permission", constant.WorkMomentPermissionCanSee}, {"permission_user_id_list", bson.D{{"$in", bson.A{opUserID}}}}}, - bson.D{{"permission", constant.WorkMomentPublic}}, - }}, - }, findOpts) - if err != nil { - return workMomentList, nil - } - err = result.All(ctx, &workMomentList) - return workMomentList, err -} - -func (d *db.DataBases) GetUserFriendWorkMoments(showNumber, pageNumber int32, userID string, friendIDList []string) ([]WorkMoment, error) { - ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cWorkMoment) - var workMomentList []WorkMoment - findOpts := options.Find().SetLimit(int64(showNumber)).SetSkip(int64(showNumber) * (int64(pageNumber) - 1)).SetSort(bson.M{"create_time": -1}) - var filter bson.D - permissionFilter := bson.D{ - {"$or", bson.A{ - bson.D{{"permission", constant.WorkMomentPermissionCantSee}, {"permission_user_id_list", bson.D{{"$nin", bson.A{userID}}}}}, - bson.D{{"permission", constant.WorkMomentPermissionCanSee}, {"permission_user_id_list", bson.D{{"$in", bson.A{userID}}}}}, - bson.D{{"permission", constant.WorkMomentPublic}}, - }}} - if config.Config.WorkMoment.OnlyFriendCanSee { - filter = bson.D{ - {"$or", bson.A{ - bson.D{{"user_id", userID}}, //self - bson.D{{"$and", bson.A{permissionFilter, bson.D{{"user_id", bson.D{{"$in", friendIDList}}}}}}}, - }, - }, - } - } else { - filter = bson.D{ - {"$or", bson.A{ - bson.D{{"user_id", userID}}, //self - permissionFilter, - }, - }, - } - } - result, err := c.Find(ctx, filter, findOpts) - if err != nil { - return workMomentList, err - } - err = result.All(ctx, &workMomentList) - return workMomentList, err -} - //type SuperGroup struct { // GroupID string `bson:"group_id" json:"groupID"` // MemberIDList []string `bson:"member_id_list" json:"memberIDList"` diff --git a/pkg/common/db/unrelation/office.go b/pkg/common/db/unrelation/office.go index 5cad2078d..e0e3c08e2 100644 --- a/pkg/common/db/unrelation/office.go +++ b/pkg/common/db/unrelation/office.go @@ -1 +1,285 @@ package unrelation + +import ( + "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" + "Open_IM/pkg/utils" + "context" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "time" +) + +const cTag = "tag" +const cSendLog = "send_log" +const cWorkMoment = "work_moment" + +type OfficeMgoDB struct { + mgoDB *mongo.Database + TagCollection *mongo.Collection + TagSendLogCollection *mongo.Collection + WorkMomentCollection *mongo.Collection +} + +type Tag struct { + UserID string `bson:"user_id"` + TagID string `bson:"tag_id"` + TagName string `bson:"tag_name"` + UserList []string `bson:"user_list"` +} + +type commonUser struct { + UserID string `bson:"user_id"` + UserName string `bson:"user_name"` +} + +type TagSendLog struct { + UserList []commonUser `bson:"tag_list"` + SendID string `bson:"send_id"` + SenderPlatformID int32 `bson:"sender_platform_id"` + Content string `bson:"content"` + SendTime int64 `bson:"send_time"` +} + +type WorkMoment struct { + WorkMomentID string `bson:"work_moment_id"` + UserID string `bson:"user_id"` + UserName string `bson:"user_name"` + FaceURL string `bson:"face_url"` + Content string `bson:"content"` + LikeUserList []*commonUser `bson:"like_user_list"` + AtUserList []*commonUser `bson:"at_user_list"` + PermissionUserList []*commonUser `bson:"permission_user_list"` + Comments []*commonUser `bson:"comments"` + PermissionUserIDList []string `bson:"permission_user_id_list"` + Permission int32 `bson:"permission"` + CreateTime int32 `bson:"create_time"` +} + +type Comment struct { + UserID string `bson:"user_id" json:"user_id"` + UserName string `bson:"user_name" json:"user_name"` + ReplyUserID string `bson:"reply_user_id" json:"reply_user_id"` + ReplyUserName string `bson:"reply_user_name" json:"reply_user_name"` + ContentID string `bson:"content_id" json:"content_id"` + Content string `bson:"content" json:"content"` + CreateTime int32 `bson:"create_time" json:"create_time"` +} + +func NewOfficeMgoDB(mgoDB *mongo.Database) *OfficeMgoDB { + return &OfficeMgoDB{mgoDB: mgoDB, TagCollection: mgoDB.Collection(cTag), TagSendLogCollection: mgoDB.Collection(cSendLog), WorkMomentCollection: mgoDB.Collection(cSendLog)} +} + +func (db *OfficeMgoDB) GetUserTags(ctx context.Context, userID string) ([]Tag, error) { + var tags []Tag + cursor, err := db.TagCollection.Find(ctx, bson.M{"user_id": userID}) + if err != nil { + return tags, err + } + if err = cursor.All(ctx, &tags); err != nil { + return tags, err + } + return tags, nil +} + +func (db *OfficeMgoDB) CreateTag(ctx context.Context, userID, tagName string, userList []string) error { + tagID := generateTagID(tagName, userID) + tag := Tag{ + UserID: userID, + TagID: tagID, + TagName: tagName, + UserList: userList, + } + _, err := db.TagCollection.InsertOne(ctx, tag) + return err +} + +func (db *OfficeMgoDB) GetTagByID(ctx context.Context, userID, tagID string) (Tag, error) { + var tag Tag + err := db.TagCollection.FindOne(ctx, bson.M{"user_id": userID, "tag_id": tagID}).Decode(&tag) + return tag, err +} + +func (db *OfficeMgoDB) DeleteTag(ctx context.Context, userID, tagID string) error { + _, err := db.TagCollection.DeleteOne(ctx, bson.M{"user_id": userID, "tag_id": tagID}) + return err +} + +func (db *OfficeMgoDB) SetTag(ctx context.Context, userID, tagID, newName string, increaseUserIDList []string, reduceUserIDList []string) error { + var tag Tag + if err := db.TagCollection.FindOne(ctx, bson.M{"tag_id": tagID, "user_id": userID}).Decode(&tag); err != nil { + return err + } + if newName != "" { + _, err := db.TagCollection.UpdateOne(ctx, bson.M{"user_id": userID, "tag_id": tagID}, bson.M{"$set": bson.M{"tag_name": newName}}) + if err != nil { + return err + } + } + tag.UserList = append(tag.UserList, increaseUserIDList...) + tag.UserList = utils.RemoveRepeatedStringInList(tag.UserList) + for _, v := range reduceUserIDList { + for i2, v2 := range tag.UserList { + if v == v2 { + tag.UserList[i2] = "" + } + } + } + var newUserList []string + for _, v := range tag.UserList { + if v != "" { + newUserList = append(newUserList, v) + } + } + _, err := db.TagCollection.UpdateOne(ctx, bson.M{"user_id": userID, "tag_id": tagID}, bson.M{"$set": bson.M{"user_list": newUserList}}) + if err != nil { + return err + } + return nil +} + +func (db *OfficeMgoDB) GetUserIDListByTagID(ctx context.Context, userID, tagID string) ([]string, error) { + var tag Tag + err := db.TagCollection.FindOne(ctx, bson.M{"user_id": userID, "tag_id": tagID}).Decode(&tag) + return tag.UserList, err +} + +func (db *OfficeMgoDB) SaveTagSendLog(ctx context.Context, tagSendLog *TagSendLog) error { + _, err := db.TagSendLogCollection.InsertOne(ctx, tagSendLog) + return err +} + +func (db *OfficeMgoDB) GetTagSendLogs(ctx context.Context, userID string, showNumber, pageNumber int32) ([]TagSendLog, error) { + var tagSendLogs []TagSendLog + findOpts := options.Find().SetLimit(int64(showNumber)).SetSkip(int64(showNumber) * (int64(pageNumber) - 1)).SetSort(bson.M{"send_time": -1}) + cursor, err := db.TagSendLogCollection.Find(ctx, bson.M{"send_id": userID}, findOpts) + if err != nil { + return tagSendLogs, err + } + err = cursor.All(ctx, &tagSendLogs) + return tagSendLogs, err +} + +func (db *OfficeMgoDB) CreateOneWorkMoment(ctx context.Context, workMoment *WorkMoment) error { + workMomentID := generateWorkMomentID(workMoment.UserID) + workMoment.WorkMomentID = workMomentID + workMoment.CreateTime = int32(time.Now().Unix()) + _, err := db.WorkMomentCollection.InsertOne(ctx, workMoment) + return err +} + +func (db *OfficeMgoDB) DeleteOneWorkMoment(ctx context.Context, workMomentID string) error { + _, err := db.WorkMomentCollection.DeleteOne(ctx, bson.M{"work_moment_id": workMomentID}) + return err +} + +func (db *OfficeMgoDB) DeleteComment(ctx context.Context, workMomentID, contentID, opUserID string) error { + _, err := db.WorkMomentCollection.UpdateOne(ctx, bson.D{{"work_moment_id", workMomentID}, + {"$or", bson.A{ + bson.D{{"user_id", opUserID}}, + bson.D{{"comments", bson.M{"$elemMatch": bson.M{"user_id": opUserID}}}}, + }, + }}, bson.M{"$pull": bson.M{"comments": bson.M{"content_id": contentID}}}) + return err +} + +func (db *OfficeMgoDB) GetWorkMomentByID(ctx context.Context, workMomentID string) (*WorkMoment, error) { + workMoment := &WorkMoment{} + err := db.WorkMomentCollection.FindOne(ctx, bson.M{"work_moment_id": workMomentID}).Decode(workMoment) + return workMoment, err +} + +func (db *OfficeMgoDB) LikeOneWorkMoment(ctx context.Context, likeUserID, userName, workMomentID string) (*WorkMoment, bool, error) { + workMoment, err := db.GetWorkMomentByID(ctx, workMomentID) + if err != nil { + return nil, false, err + } + var isAlreadyLike bool + for i, user := range workMoment.LikeUserList { + if likeUserID == user.UserID { + isAlreadyLike = true + workMoment.LikeUserList = append(workMoment.LikeUserList[0:i], workMoment.LikeUserList[i+1:]...) + } + } + if !isAlreadyLike { + workMoment.LikeUserList = append(workMoment.LikeUserList, &commonUser{UserID: likeUserID, UserName: userName}) + } + _, err = db.WorkMomentCollection.UpdateOne(ctx, bson.M{"work_moment_id": workMomentID}, bson.M{"$set": bson.M{"like_user_list": workMoment.LikeUserList}}) + return workMoment, !isAlreadyLike, err +} + +func (db *OfficeMgoDB) SetUserWorkMomentsLevel(ctx context.Context, userID string, level int32) error { + return nil +} + +func (db *OfficeMgoDB) CommentOneWorkMoment(ctx context.Context, comment *Comment, workMomentID string) (WorkMoment, error) { + comment.ContentID = generateWorkMomentCommentID(workMomentID) + var workMoment WorkMoment + err := db.WorkMomentCollection.FindOneAndUpdate(ctx, bson.M{"work_moment_id": workMomentID}, bson.M{"$push": bson.M{"comments": comment}}).Decode(&workMoment) + return workMoment, err +} + +func (db *OfficeMgoDB) GetUserSelfWorkMoments(ctx context.Context, userID string, showNumber, pageNumber int32) ([]WorkMoment, error) { + var workMomentList []WorkMoment + findOpts := options.Find().SetLimit(int64(showNumber)).SetSkip(int64(showNumber) * (int64(pageNumber) - 1)).SetSort(bson.M{"create_time": -1}) + result, err := db.WorkMomentCollection.Find(ctx, bson.M{"user_id": userID}, findOpts) + if err != nil { + return workMomentList, nil + } + err = result.All(ctx, &workMomentList) + return workMomentList, err +} + +func (db *OfficeMgoDB) GetUserWorkMoments(ctx context.Context, opUserID, userID string, showNumber, pageNumber int32, friendIDList []string) ([]WorkMoment, error) { + var workMomentList []WorkMoment + findOpts := options.Find().SetLimit(int64(showNumber)).SetSkip(int64(showNumber) * (int64(pageNumber) - 1)).SetSort(bson.M{"create_time": -1}) + result, err := db.WorkMomentCollection.Find(ctx, bson.D{ // 等价条件: select * from + {"user_id", userID}, + {"$or", bson.A{ + bson.D{{"permission", constant.WorkMomentPermissionCantSee}, {"permission_user_id_list", bson.D{{"$nin", bson.A{opUserID}}}}}, + bson.D{{"permission", constant.WorkMomentPermissionCanSee}, {"permission_user_id_list", bson.D{{"$in", bson.A{opUserID}}}}}, + bson.D{{"permission", constant.WorkMomentPublic}}, + }}, + }, findOpts) + if err != nil { + return workMomentList, nil + } + err = result.All(ctx, &workMomentList) + return workMomentList, err +} + +func (db *OfficeMgoDB) GetUserFriendWorkMoments(ctx context.Context, showNumber, pageNumber int32, userID string, friendIDList []string) ([]WorkMoment, error) { + var workMomentList []WorkMoment + findOpts := options.Find().SetLimit(int64(showNumber)).SetSkip(int64(showNumber) * (int64(pageNumber) - 1)).SetSort(bson.M{"create_time": -1}) + var filter bson.D + permissionFilter := bson.D{ + {"$or", bson.A{ + bson.D{{"permission", constant.WorkMomentPermissionCantSee}, {"permission_user_id_list", bson.D{{"$nin", bson.A{userID}}}}}, + bson.D{{"permission", constant.WorkMomentPermissionCanSee}, {"permission_user_id_list", bson.D{{"$in", bson.A{userID}}}}}, + bson.D{{"permission", constant.WorkMomentPublic}}, + }}} + if config.Config.WorkMoment.OnlyFriendCanSee { + filter = bson.D{ + {"$or", bson.A{ + bson.D{{"user_id", userID}}, //self + bson.D{{"$and", bson.A{permissionFilter, bson.D{{"user_id", bson.D{{"$in", friendIDList}}}}}}}, + }, + }, + } + } else { + filter = bson.D{ + {"$or", bson.A{ + bson.D{{"user_id", userID}}, //self + permissionFilter, + }, + }, + } + } + result, err := db.WorkMomentCollection.Find(ctx, filter, findOpts) + if err != nil { + return workMomentList, err + } + err = result.All(ctx, &workMomentList) + return workMomentList, err +} diff --git a/pkg/common/db/unrelation/super_group.go b/pkg/common/db/unrelation/super_group.go index 83be83e42..48dd40505 100644 --- a/pkg/common/db/unrelation/super_group.go +++ b/pkg/common/db/unrelation/super_group.go @@ -14,7 +14,7 @@ const ( cUserToSuperGroup = "user_to_super_group" ) -type SuperGroupMgo struct { +type SuperGroupMgoDB struct { mgoDB *mongo.Database superGroupCollection *mongo.Collection userToSuperGroupCollection *mongo.Collection @@ -30,11 +30,11 @@ type UserToSuperGroup struct { GroupIDList []string `bson:"group_id_list" json:"groupIDList"` } -func NewSuperGroupMgoDB(mgoDB *mongo.Database) *SuperGroupMgo { - return &SuperGroupMgo{mgoDB: mgoDB, superGroupCollection: mgoDB.Collection(cSuperGroup), userToSuperGroupCollection: mgoDB.Collection(cUserToSuperGroup)} +func NewSuperGroupMgoDB(mgoDB *mongo.Database) *SuperGroupMgoDB { + return &SuperGroupMgoDB{mgoDB: mgoDB, superGroupCollection: mgoDB.Collection(cSuperGroup), userToSuperGroupCollection: mgoDB.Collection(cUserToSuperGroup)} } -func (db *SuperGroupMgo) CreateSuperGroup(ctx context.Context, groupID string, initMemberIDList []string, memberNumCount int) error { +func (db *SuperGroupMgoDB) CreateSuperGroup(ctx context.Context, groupID string, initMemberIDList []string, memberNumCount int) error { //ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) //c := db.mgoDB.Database(config.Config.Mongo.DBDatabase).Collection(cSuperGroup) opts := options.Session().SetDefaultReadConcern(readconcern.Majority()) @@ -67,13 +67,13 @@ func (db *SuperGroupMgo) CreateSuperGroup(ctx context.Context, groupID string, i }) } -func (db *SuperGroupMgo) GetSuperGroup(ctx context.Context, groupID string) (*SuperGroup, error) { +func (db *SuperGroupMgoDB) GetSuperGroup(ctx context.Context, groupID string) (*SuperGroup, error) { superGroup := SuperGroup{} err := db.superGroupCollection.FindOne(ctx, bson.M{"group_id": groupID}).Decode(&superGroup) return &superGroup, err } -func (db *SuperGroupMgo) AddUserToSuperGroup(ctx context.Context, groupID string, userIDList []string) error { +func (db *SuperGroupMgoDB) AddUserToSuperGroup(ctx context.Context, groupID string, userIDList []string) error { opts := options.Session().SetDefaultReadConcern(readconcern.Majority()) return db.mgoDB.Client().UseSessionWithOptions(ctx, opts, func(sCtx mongo.SessionContext) error { _, err := db.superGroupCollection.UpdateOne(sCtx, bson.M{"group_id": groupID}, bson.M{"$addToSet": bson.M{"member_id_list": bson.M{"$each": userIDList}}}) @@ -96,7 +96,7 @@ func (db *SuperGroupMgo) AddUserToSuperGroup(ctx context.Context, groupID string }) } -func (db *SuperGroupMgo) RemoverUserFromSuperGroup(ctx context.Context, groupID string, userIDList []string) error { +func (db *SuperGroupMgoDB) RemoverUserFromSuperGroup(ctx context.Context, groupID string, userIDList []string) error { opts := options.Session().SetDefaultReadConcern(readconcern.Majority()) return db.mgoDB.Client().UseSessionWithOptions(ctx, opts, func(sCtx mongo.SessionContext) error { _, err := db.superGroupCollection.UpdateOne(sCtx, bson.M{"group_id": groupID}, bson.M{"$pull": bson.M{"member_id_list": bson.M{"$in": userIDList}}}) @@ -113,13 +113,13 @@ func (db *SuperGroupMgo) RemoverUserFromSuperGroup(ctx context.Context, groupID }) } -func (db *SuperGroupMgo) GetSuperGroupByUserID(ctx context.Context, userID string) (*UserToSuperGroup, error) { +func (db *SuperGroupMgoDB) GetSuperGroupByUserID(ctx context.Context, userID string) (*UserToSuperGroup, error) { var user UserToSuperGroup _ = db.userToSuperGroupCollection.FindOne(ctx, bson.M{"user_id": userID}).Decode(&user) return &user, nil } -func (db *SuperGroupMgo) DeleteSuperGroup(ctx context.Context, groupID string) error { +func (db *SuperGroupMgoDB) DeleteSuperGroup(ctx context.Context, groupID string) error { opts := options.Session().SetDefaultReadConcern(readconcern.Majority()) return db.mgoDB.Client().UseSessionWithOptions(ctx, opts, func(sCtx mongo.SessionContext) error { superGroup := &SuperGroup{} @@ -136,7 +136,7 @@ func (db *SuperGroupMgo) DeleteSuperGroup(ctx context.Context, groupID string) e }) } -func (db *SuperGroupMgo) RemoveGroupFromUser(sCtx context.Context, groupID string, userIDList []string) error { +func (db *SuperGroupMgoDB) RemoveGroupFromUser(sCtx context.Context, groupID string, userIDList []string) error { _, err := db.userToSuperGroupCollection.UpdateOne(sCtx, bson.M{"user_id": bson.M{"$in": userIDList}}, bson.M{"$pull": bson.M{"group_id_list": groupID}}) return err }