From f0c80f3dcf2ba0cd821ec43623a91c3e61987830 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Wed, 11 Sep 2024 00:11:46 +0800 Subject: [PATCH] optimize tweet detail visit permission check logic --- cmd/serve/serve.go | 3 +-- internal/conf/db.go | 11 +++++++++++ internal/conf/db_gorm.go | 8 +++++--- internal/dao/dao.go | 13 ------------- internal/dao/jinzhu/jinzhu.go | 4 ---- internal/model/web/loose.go | 5 ++--- internal/servants/base/base.go | 21 ++++++++++----------- internal/servants/web/loose.go | 23 +++++++++++++++++------ internal/servants/web/utils.go | 1 + 9 files changed, 47 insertions(+), 42 deletions(-) diff --git a/cmd/serve/serve.go b/cmd/serve/serve.go index 3b791645..abf859e3 100644 --- a/cmd/serve/serve.go +++ b/cmd/serve/serve.go @@ -18,7 +18,6 @@ import ( "github.com/rocboss/paopao-ce/cmd" "github.com/rocboss/paopao-ce/internal" "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/dao" "github.com/rocboss/paopao-ce/internal/service" "github.com/rocboss/paopao-ce/pkg/debug" "github.com/rocboss/paopao-ce/pkg/utils" @@ -48,11 +47,11 @@ func init() { } func deferFn() { - dao.CloseDsx() if cfg.If("Sentry") { // Flush buffered events before the program terminates. sentry.Flush(2 * time.Second) } + conf.CloseDB() } func serveRun(_cmd *cobra.Command, _args []string) { diff --git a/internal/conf/db.go b/internal/conf/db.go index db0a1e43..f2cbeaa7 100644 --- a/internal/conf/db.go +++ b/internal/conf/db.go @@ -58,6 +58,17 @@ func MustSqlDB() *sql.DB { return _sqldb } +// CloseDB close databse to prevent data missing +func CloseDB() { + cfg.On(cfg.Actions{ + "Gorm": func() { + closeGormDB() + }, + }, func() { + closeGormDB() + }) +} + func newSqlDB() (driver string, db *sql.DB, err error) { if cfg.If("MySQL") { driver = "mysql" diff --git a/internal/conf/db_gorm.go b/internal/conf/db_gorm.go index dfa381cf..ffe6425d 100644 --- a/internal/conf/db_gorm.go +++ b/internal/conf/db_gorm.go @@ -34,12 +34,14 @@ func MustGormDB() *gorm.DB { return _gormdb } -func CloseGormDB() { +func closeGormDB() { db, err := _gormdb.DB() if err != nil { - log.Fatalf("close gorm db failed: %s", err) + logrus.WithError(err).Error("get db from grom failed") + } + if err = db.Close(); err != nil { + logrus.WithError(err).Error("close db failed") } - _ = db.Close() } func newGormDB() (db *gorm.DB, err error) { diff --git a/internal/dao/dao.go b/internal/dao/dao.go index 9cbb7051..8b355e36 100644 --- a/internal/dao/dao.go +++ b/internal/dao/dao.go @@ -88,19 +88,6 @@ func initDsX() { logrus.Infof("use %s as core.ServantA with version %s", dsaVer.Name(), dsaVer.Version()) } -func CloseDsx() { - if cfg.If("Gorm") { - jinzhu.CloseDbObject() - } else if cfg.If("Sqlx") { - sakila.CloseDbObject() - } else if cfg.If("Sqlc") && cfg.Any("Postgres", "PostgreSQL") { - slonik.CloseDbObject() - } else { - // default use gorm as orm for sql database - jinzhu.CloseDbObject() - } -} - func initOSS() { var v core.VersionInfo if cfg.If("AliOSS") { diff --git a/internal/dao/jinzhu/jinzhu.go b/internal/dao/jinzhu/jinzhu.go index ddc9cd2f..16b6d64a 100644 --- a/internal/dao/jinzhu/jinzhu.go +++ b/internal/dao/jinzhu/jinzhu.go @@ -87,10 +87,6 @@ func NewDataService() (core.DataService, core.VersionInfo) { return cache.NewCacheDataService(ds), ds } -func CloseDbObject() { - conf.CloseGormDB() -} - func NewWebDataServantA() (core.WebDataServantA, core.VersionInfo) { lazyInitial() db := conf.MustGormDB() diff --git a/internal/model/web/loose.go b/internal/model/web/loose.go index db701dfe..8ca847f0 100644 --- a/internal/model/web/loose.go +++ b/internal/model/web/loose.go @@ -113,9 +113,8 @@ type TopicListResp struct { } type TweetDetailReq struct { - BaseInfo `form:"-" binding:"-"` - SimpleInfo `form:"-" binding:"-"` - TweetId int64 `form:"id"` + BaseInfo `form:"-" binding:"-"` + TweetId int64 `form:"id"` } type TweetDetailResp ms.PostFormated diff --git a/internal/servants/base/base.go b/internal/servants/base/base.go index d031e344..c08de75f 100644 --- a/internal/servants/base/base.go +++ b/internal/servants/base/base.go @@ -231,23 +231,22 @@ func (s *DaoServant) PrepareMessages(userId int64, messages []*ms.MessageFormate return nil } -func (s *DaoServant) PrepareTweet(userId int64, tweet *ms.PostFormated) error { +func (s *DaoServant) PrepareTweet(user *ms.User, tweet *ms.PostFormated) error { + // guest用户 + if user == nil { + return nil + } // 转换一下可见性的值 tweet.Visibility = ms.PostVisibleT(tweet.Visibility.ToOutValue()) - // guest用户的userId<0 - if userId < 0 { - return nil + friendMap, err := s.Ds.IsMyFriend(user.ID, tweet.UserID) + if err != nil { + return err } - // friendMap, err := s.Ds.IsMyFriend(userId, userIds) - // if err != nil { - // return err - // } - followMap, err := s.Ds.IsMyFollow(userId, tweet.UserID) + followMap, err := s.Ds.IsMyFollow(user.ID, tweet.UserID) if err != nil { return err } - // tweet.User.IsFriend, tweet.User.IsFollowing = friendMap[tweet.UserID], followMap[tweet.UserID] - tweet.User.IsFollowing = followMap[tweet.UserID] + tweet.User.IsFriend, tweet.User.IsFollowing = friendMap[tweet.UserID], followMap[tweet.UserID] return nil } diff --git a/internal/servants/web/loose.go b/internal/servants/web/loose.go index 088178d2..17df24bd 100644 --- a/internal/servants/web/loose.go +++ b/internal/servants/web/loose.go @@ -508,11 +508,6 @@ func (s *looseSrv) TweetDetail(req *web.TweetDetailReq) (*web.TweetDetailResp, m if err != nil { return nil, web.ErrGetPostFailed } - - // check current user permission - if xerr := checkPostViewPermission(req.User, post, s.Ds); xerr != nil { - return nil, xerr - } postContents, err := s.Ds.GetPostContentsByIDs([]int64{post.ID}) if err != nil { return nil, web.ErrGetPostFailed @@ -531,7 +526,23 @@ func (s *looseSrv) TweetDetail(req *web.TweetDetailReq) (*web.TweetDetailResp, m postFormated.Contents = append(postFormated.Contents, content.Format()) } } - s.PrepareTweet(req.Uid, postFormated) + if err = s.PrepareTweet(req.User, postFormated); err != nil { + return nil, web.ErrGetPostFailed + } + // 检测访问权限 + // TODO: 提到最前面去检测 + switch { + case req.User.IsAdmin: + break + case post.Visibility == core.PostVisitPublic: + break + case post.Visibility == core.PostVisitFriend && postFormated.User.IsFriend: + break + case post.Visibility == core.PostVisitFollowing && postFormated.User.IsFollowing: + break + default: + return nil, web.ErrNoPermission + } return (*web.TweetDetailResp)(postFormated), nil } diff --git a/internal/servants/web/utils.go b/internal/servants/web/utils.go index d2191681..596c0e92 100644 --- a/internal/servants/web/utils.go +++ b/internal/servants/web/utils.go @@ -231,5 +231,6 @@ func checkPostViewPermission(user *ms.User, post *ms.Post, ds core.DataService) return web.ErrNoPermission } } + // TODO: add following check logic return nil }