From 0da2c76d0b5f358b17eae986aaf29059c78906c0 Mon Sep 17 00:00:00 2001 From: alimy Date: Thu, 16 Jun 2022 11:32:16 +0800 Subject: [PATCH] optimize #97 user stars/collections update when post visibility changed --- config.yaml.sample | 6 ++--- internal/conf/db.go | 8 +++--- internal/conf/settting.go | 17 ++++++++++++- internal/dao/post.go | 4 +-- internal/model/post_collection.go | 33 ++++++++++++++++--------- internal/model/post_star.go | 41 ++++++++++++++++++------------- internal/routers/api/post.go | 18 +++++++++++--- internal/service/post.go | 25 +++++++++++++++++++ internal/service/user.go | 33 ++++++------------------- 9 files changed, 117 insertions(+), 68 deletions(-) diff --git a/config.yaml.sample b/config.yaml.sample index 93506fb4..524cf9df 100644 --- a/config.yaml.sample +++ b/config.yaml.sample @@ -77,8 +77,8 @@ LocalOSS: # 本地文件OSS存储配置 Bucket: paopao Domain: 127.0.0.1:8008 Database: # Database通用配置 - LogLevel: 2 - TablePrefix: p_ + LogLevel: error # 日志级别 silent|error|warn|info + TablePrefix: p_ # 表名前缀 MySQL: # MySQL数据库 Username: paopao Password: paopao @@ -88,7 +88,7 @@ MySQL: # MySQL数据库 ParseTime: True MaxIdleConns: 10 MaxOpenConns: 30 -Postgres: +Postgres: # PostgreSQL数据库 User: paopao Password: paopao DBName: paopao diff --git a/internal/conf/db.go b/internal/conf/db.go index b517b1c0..649a0627 100644 --- a/internal/conf/db.go +++ b/internal/conf/db.go @@ -23,10 +23,10 @@ func newDBEngine() (*gorm.DB, error) { newLogger := logger.New( logrus.StandardLogger(), // io writer(日志输出的目标,前缀和日志包含的内容) logger.Config{ - SlowThreshold: time.Second, // 慢 SQL 阈值 - LogLevel: databaseSetting.LogLevel, // 日志级别 - IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 - Colorful: false, // 禁用彩色打印 + SlowThreshold: time.Second, // 慢 SQL 阈值 + LogLevel: databaseSetting.logLevel(), // 日志级别 + IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: false, // 禁用彩色打印 }, ) diff --git a/internal/conf/settting.go b/internal/conf/settting.go index 7ac6548e..33cb9131 100644 --- a/internal/conf/settting.go +++ b/internal/conf/settting.go @@ -80,7 +80,7 @@ type ZincSettingS struct { type DatabaseSetingS struct { TablePrefix string - LogLevel logger.LogLevel + LogLevel string } type MySQLSettingS struct { @@ -282,3 +282,18 @@ func (s PostgresSettingS) Dsn() string { } return strings.Join(params, " ") } + +func (s *DatabaseSetingS) logLevel() logger.LogLevel { + switch strings.ToLower(s.LogLevel) { + case "silent": + return logger.Silent + case "error": + return logger.Error + case "warn": + return logger.Warn + case "info": + return logger.Info + default: + return logger.Error + } +} diff --git a/internal/dao/post.go b/internal/dao/post.go index de69205c..328de819 100644 --- a/internal/dao/post.go +++ b/internal/dao/post.go @@ -120,7 +120,7 @@ func (d *dataServant) GetUserPostStars(userID int64, offset, limit int) ([]*mode } return star.List(d.engine, &model.ConditionsT{ - "ORDER": "id DESC", + "ORDER": d.engine.NamingStrategy.TableName("PostStar") + ".id DESC", }, offset, limit) } @@ -159,7 +159,7 @@ func (d *dataServant) GetUserPostCollections(userID int64, offset, limit int) ([ } return collection.List(d.engine, &model.ConditionsT{ - "ORDER": "id DESC", + "ORDER": d.engine.NamingStrategy.TableName("PostCollection") + ".id DESC", }, offset, limit) } diff --git a/internal/model/post_collection.go b/internal/model/post_collection.go index 2c7196ea..aec5d270 100644 --- a/internal/model/post_collection.go +++ b/internal/model/post_collection.go @@ -8,22 +8,26 @@ import ( type PostCollection struct { *Model + Post *Post `json:"-"` PostID int64 `json:"post_id"` UserID int64 `json:"user_id"` } func (p *PostCollection) Get(db *gorm.DB) (*PostCollection, error) { var star PostCollection + tn := db.NamingStrategy.TableName("PostCollection") + "." + if p.Model != nil && p.ID > 0 { - db = db.Where("id = ? AND is_del = ?", p.ID, 0) + db = db.Where(tn+"id = ? AND "+tn+"is_del = ?", p.ID, 0) } if p.PostID > 0 { - db = db.Where("post_id = ?", p.PostID) + db = db.Where(tn+"post_id = ?", p.PostID) } if p.UserID > 0 { - db = db.Where("user_id = ?", p.UserID) + db = db.Where(tn+"user_id = ?", p.UserID) } + db = db.Joins("Post").Where("Post.visibility <> ?", PostVisitPrivate).Order("Post.id DESC") err := db.First(&star).Error if err != nil { return &star, err @@ -33,13 +37,13 @@ func (p *PostCollection) Get(db *gorm.DB) (*PostCollection, error) { } func (p *PostCollection) Create(db *gorm.DB) (*PostCollection, error) { - err := db.Create(&p).Error + err := db.Omit("Post").Create(&p).Error return p, err } func (p *PostCollection) Delete(db *gorm.DB) error { - return db.Model(&PostCollection{}).Where("id = ? AND is_del = ?", p.Model.ID, 0).Updates(map[string]interface{}{ + return db.Model(&PostCollection{}).Omit("Post").Where("id = ? AND is_del = ?", p.Model.ID, 0).Updates(map[string]interface{}{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error @@ -48,22 +52,25 @@ func (p *PostCollection) Delete(db *gorm.DB) error { func (p *PostCollection) List(db *gorm.DB, conditions *ConditionsT, offset, limit int) ([]*PostCollection, error) { var collections []*PostCollection var err error + tn := db.NamingStrategy.TableName("PostCollection") + "." + if offset >= 0 && limit > 0 { db = db.Offset(offset).Limit(limit) } if p.UserID > 0 { - db = db.Where("user_id = ?", p.UserID) + db = db.Where(tn+"user_id = ?", p.UserID) } for k, v := range *conditions { if k == "ORDER" { db = db.Order(v) } else { - db = db.Where(k, v) + db = db.Where(tn+k, v) } } - if err = db.Where("is_del = ?", 0).Find(&collections).Error; err != nil { + db = db.Joins("Post").Where("Post.visibility <> ?", PostVisitPrivate).Order("Post.id DESC") + if err = db.Where(tn+"is_del = ?", 0).Find(&collections).Error; err != nil { return nil, err } @@ -72,17 +79,21 @@ func (p *PostCollection) List(db *gorm.DB, conditions *ConditionsT, offset, limi func (p *PostCollection) Count(db *gorm.DB, conditions *ConditionsT) (int64, error) { var count int64 + tn := db.NamingStrategy.TableName("PostCollection") + "." + if p.PostID > 0 { - db = db.Where("post_id = ?", p.PostID) + db = db.Where(tn+"post_id = ?", p.PostID) } if p.UserID > 0 { - db = db.Where("user_id = ?", p.UserID) + db = db.Where(tn+"user_id = ?", p.UserID) } for k, v := range *conditions { if k != "ORDER" { - db = db.Where(k, v) + db = db.Where(tn+k, v) } } + + db = db.Joins("Post").Where("Post.visibility <> ?", PostVisitPrivate) if err := db.Model(p).Count(&count).Error; err != nil { return 0, err } diff --git a/internal/model/post_star.go b/internal/model/post_star.go index 3f672664..d6c712ce 100644 --- a/internal/model/post_star.go +++ b/internal/model/post_star.go @@ -8,38 +8,40 @@ import ( type PostStar struct { *Model + Post *Post `json:"-"` PostID int64 `json:"post_id"` UserID int64 `json:"user_id"` } func (p *PostStar) Get(db *gorm.DB) (*PostStar, error) { var star PostStar + tn := db.NamingStrategy.TableName("PostStar") + "." + if p.Model != nil && p.ID > 0 { - db = db.Where("id = ? AND is_del = ?", p.ID, 0) + db = db.Where(tn+"id = ? AND "+tn+"is_del = ?", p.ID, 0) } if p.PostID > 0 { - db = db.Where("post_id = ?", p.PostID) + db = db.Where(tn+"post_id = ?", p.PostID) } if p.UserID > 0 { - db = db.Where("user_id = ?", p.UserID) + db = db.Where(tn+"user_id = ?", p.UserID) } - err := db.First(&star).Error - if err != nil { - return &star, err + db = db.Joins("Post").Where("Post.visibility <> ?", PostVisitPrivate).Order("Post.id DESC") + if err := db.First(&star).Error; err != nil { + return nil, err } - return &star, nil } func (p *PostStar) Create(db *gorm.DB) (*PostStar, error) { - err := db.Create(&p).Error + err := db.Omit("Post").Create(&p).Error return p, err } func (p *PostStar) Delete(db *gorm.DB) error { - return db.Model(&PostStar{}).Where("id = ? AND is_del = ?", p.Model.ID, 0).Updates(map[string]interface{}{ + return db.Model(&PostStar{}).Omit("Post").Where("id = ? AND is_del = ?", p.Model.ID, 0).Updates(map[string]interface{}{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error @@ -48,44 +50,49 @@ func (p *PostStar) Delete(db *gorm.DB) error { func (p *PostStar) List(db *gorm.DB, conditions *ConditionsT, offset, limit int) ([]*PostStar, error) { var stars []*PostStar var err error + tn := db.NamingStrategy.TableName("PostStar") + "." + if offset >= 0 && limit > 0 { db = db.Offset(offset).Limit(limit) } if p.UserID > 0 { - db = db.Where("user_id = ?", p.UserID) + db = db.Where(tn+"user_id = ?", p.UserID) } for k, v := range *conditions { if k == "ORDER" { db = db.Order(v) } else { - db = db.Where(k, v) + db = db.Where(tn+k, v) } } - if err = db.Where("is_del = ?", 0).Find(&stars).Error; err != nil { + db = db.Joins("Post").Where("Post.visibility <> ?", PostVisitPrivate).Order("Post.id DESC") + if err = db.Find(&stars).Error; err != nil { return nil, err } - return stars, nil } func (p *PostStar) Count(db *gorm.DB, conditions *ConditionsT) (int64, error) { var count int64 + tn := db.NamingStrategy.TableName("PostStar") + "." + if p.PostID > 0 { - db = db.Where("post_id = ?", p.PostID) + db = db.Where(tn+"post_id = ?", p.PostID) } if p.UserID > 0 { - db = db.Where("user_id = ?", p.UserID) + db = db.Where(tn+"user_id = ?", p.UserID) } for k, v := range *conditions { if k != "ORDER" { - db = db.Where(k, v) + db = db.Where(tn+k, v) } } + + db = db.Joins("Post").Where("Post.visibility <> ?", PostVisitPrivate) if err := db.Model(p).Count(&count).Error; err != nil { return 0, err } - return count, nil } diff --git a/internal/routers/api/post.go b/internal/routers/api/post.go index f7d0fc1e..af352afb 100644 --- a/internal/routers/api/post.go +++ b/internal/routers/api/post.go @@ -156,11 +156,16 @@ func PostStar(c *gin.Context) { star, err := service.GetPostStar(param.ID, userID.(int64)) if err != nil { // 创建Star - service.CreatePostStar(param.ID, userID.(int64)) + _, err = service.CreatePostStar(param.ID, userID.(int64)) status = true } else { // 取消Star - service.DeletePostStar(star) + err = service.DeletePostStar(star) + } + + if err != nil { + response.ToErrorResponse(errcode.NoPermission) + return } response.ToResponse(gin.H{ @@ -204,11 +209,16 @@ func PostCollection(c *gin.Context) { collection, err := service.GetPostCollection(param.ID, userID.(int64)) if err != nil { // 创建collection - service.CreatePostCollection(param.ID, userID.(int64)) + _, err = service.CreatePostCollection(param.ID, userID.(int64)) status = true } else { // 取消Star - service.DeletePostCollection(collection) + err = service.DeletePostCollection(collection) + } + + if err != nil { + response.ToErrorResponse(errcode.NoPermission) + return } response.ToResponse(gin.H{ diff --git a/internal/service/post.go b/internal/service/post.go index 5d89dceb..3ab372a2 100644 --- a/internal/service/post.go +++ b/internal/service/post.go @@ -2,6 +2,7 @@ package service import ( "encoding/json" + "errors" "fmt" "math" "strings" @@ -269,6 +270,12 @@ func CreatePostStar(postID, userID int64) (*model.PostStar, error) { if err != nil { return nil, err } + + // 私密post不可操作 + if post.Visibility == model.PostVisitPrivate { + return nil, errors.New("no permision") + } + star, err := ds.CreatePostStar(postID, userID) if err != nil { return nil, err @@ -294,6 +301,12 @@ func DeletePostStar(star *model.PostStar) error { if err != nil { return err } + + // 私密post不可操作 + if post.Visibility == model.PostVisitPrivate { + return errors.New("no permision") + } + // 更新Post点赞数 post.UpvoteCount-- ds.UpdatePost(post) @@ -314,6 +327,12 @@ func CreatePostCollection(postID, userID int64) (*model.PostCollection, error) { if err != nil { return nil, err } + + // 私密post不可操作 + if post.Visibility == model.PostVisitPrivate { + return nil, errors.New("no permision") + } + collection, err := ds.CreatePostCollection(postID, userID) if err != nil { return nil, err @@ -339,6 +358,12 @@ func DeletePostCollection(collection *model.PostCollection) error { if err != nil { return err } + + // 私密post不可操作 + if post.Visibility == model.PostVisitPrivate { + return errors.New("no permision") + } + // 更新Post点赞数 post.CollectionCount-- ds.UpdatePost(post) diff --git a/internal/service/user.go b/internal/service/user.go index 934b8525..c4d0234e 100644 --- a/internal/service/user.go +++ b/internal/service/user.go @@ -274,21 +274,11 @@ func GetUserCollections(userID int64, offset, limit int) ([]*model.PostFormated, if err != nil { return nil, 0, err } - postIDs := []int64{} + var posts []*model.Post for _, collection := range collections { - postIDs = append(postIDs, collection.PostID) + posts = append(posts, collection.Post) } - - // 获取Posts - posts, err := ds.GetPosts(&model.ConditionsT{ - "id IN ?": postIDs, - "ORDER": "id DESC", - }, 0, 0) - if err != nil { - return nil, 0, err - } - - postsFormated, err := FormatPosts(posts) + postsFormated, err := ds.MergePosts(posts) if err != nil { return nil, 0, err } @@ -306,21 +296,12 @@ func GetUserStars(userID int64, offset, limit int) ([]*model.PostFormated, int64 if err != nil { return nil, 0, err } - postIDs := []int64{} - for _, star := range stars { - postIDs = append(postIDs, star.PostID) - } - // 获取Posts - posts, err := ds.GetPosts(&model.ConditionsT{ - "id IN ?": postIDs, - "ORDER": "id DESC", - }, 0, 0) - if err != nil { - return nil, 0, err + var posts []*model.Post + for _, star := range stars { + posts = append(posts, star.Post) } - - postsFormated, err := FormatPosts(posts) + postsFormated, err := ds.MergePosts(posts) if err != nil { return nil, 0, err }