diff --git a/internal/core/ms/comments.go b/internal/core/ms/comments.go index 87ef2473..7af8b13a 100644 --- a/internal/core/ms/comments.go +++ b/internal/core/ms/comments.go @@ -14,4 +14,5 @@ type ( CommentReply = dbr.CommentReply CommentContent = dbr.CommentContent CommentReplyFormated = dbr.CommentReplyFormated + TweetCommentThumbs = dbr.TweetCommentThumbs ) diff --git a/internal/dao/sakila/auto/pg/pg.go b/internal/dao/sakila/auto/pg/pg.go index a06dc020..6dff0350 100644 --- a/internal/dao/sakila/auto/pg/pg.go +++ b/internal/dao/sakila/auto/pg/pg.go @@ -8,7 +8,6 @@ import ( "context" "fmt" - "github.com/alimy/yesql" "github.com/bitbus/sqlx" ) @@ -17,8 +16,7 @@ var ( ) const ( - _TweetManage_AddPost = `INSERT INTO @post (user_id, tags, ip, ip_loc, attachment_price, visibility, latest_replied_on, created_on) VALUES (:user_id, :tags, :ip, :ip_loc, :attachment_price, :visibility, :latest_replied_on, :created_on) RETURNING id` - _TweetManage_AddPostContent = `INSERT INTO @post_content (post_id, user_id, content, type, sort, created_on) VALUES (:post_id, :user_id, :content, :type, :sort, :created_on) RETURNING id` + _InsertTag = `INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1) RETURNING id` ) // PreparexContext enhances the Conn interface with context. @@ -41,25 +39,20 @@ type PreparexBuilder interface { QueryHook(query string) string } -type TweetManage struct { - yesql.Namespace `yesql:"tweet_manage"` - AddPost *sqlx.NamedStmt `yesql:"add_post"` - AddPostContent *sqlx.NamedStmt `yesql:"add_post_content"` +type Yesql struct { + InsertTag *sqlx.Stmt `yesql:"insert_tag"` } -func BuildTweetManage(p PreparexBuilder, ctx ...context.Context) (obj *TweetManage, err error) { +func BuildYesql(p PreparexBuilder, ctx ...context.Context) (obj *Yesql, err error) { var c context.Context if len(ctx) > 0 && ctx[0] != nil { c = ctx[0] } else { c = context.Background() } - obj = &TweetManage{} - if obj.AddPost, err = p.PrepareNamedContext(c, p.Rebind(p.QueryHook(_TweetManage_AddPost))); err != nil { - return nil, fmt.Errorf("prepare _TweetManage_AddPost error: %w", err) - } - if obj.AddPostContent, err = p.PrepareNamedContext(c, p.Rebind(p.QueryHook(_TweetManage_AddPostContent))); err != nil { - return nil, fmt.Errorf("prepare _TweetManage_AddPostContent error: %w", err) + obj = &Yesql{} + if obj.InsertTag, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_InsertTag))); err != nil { + return nil, fmt.Errorf("prepare _InsertTag error: %w", err) } return } diff --git a/internal/dao/sakila/auto/pga/pga.go b/internal/dao/sakila/auto/pga/pga.go new file mode 100644 index 00000000..c0d7d17a --- /dev/null +++ b/internal/dao/sakila/auto/pga/pga.go @@ -0,0 +1,60 @@ +// Code generated by Yesql. DO NOT EDIT. +// versions: +// - Yesql v1.9.0 + +package pga + +import ( + "context" + "fmt" + + "github.com/alimy/yesql" + "github.com/bitbus/sqlx" +) + +var ( + _ = fmt.Errorf("error for placeholder") +) + +const ( + _TopicA_InsertTag = `INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1) RETURNING id` +) + +// PreparexContext enhances the Conn interface with context. +type PreparexContext interface { + // PrepareContext prepares a statement. + // The provided context is used for the preparation of the statement, not for + // the execution of the statement. + PreparexContext(ctx context.Context, query string) (*sqlx.Stmt, error) + + // PrepareNamedContext returns an sqlx.NamedStmt + PrepareNamedContext(ctx context.Context, query string) (*sqlx.NamedStmt, error) + + // Rebind rebind query to adapte SQL Driver + Rebind(query string) string +} + +// PreparexBuilder preparex builder interface for sqlx +type PreparexBuilder interface { + PreparexContext + QueryHook(query string) string +} + +type TopicA struct { + yesql.Namespace `yesql:"topic_a"` + InsertTag *sqlx.Stmt `yesql:"insert_tag"` +} + +func BuildTopicA(p PreparexBuilder, ctx ...context.Context) (obj *TopicA, err error) { + var c context.Context + if len(ctx) > 0 && ctx[0] != nil { + c = ctx[0] + } else { + c = context.Background() + } + obj = &TopicA{} + if obj.InsertTag, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_TopicA_InsertTag))); err != nil { + return nil, fmt.Errorf("prepare _TopicA_InsertTag error: %w", err) + } + return +} diff --git a/internal/dao/sakila/auto/pgc/pgc.go b/internal/dao/sakila/auto/pgc/pgc.go new file mode 100644 index 00000000..84b81d7b --- /dev/null +++ b/internal/dao/sakila/auto/pgc/pgc.go @@ -0,0 +1,190 @@ +// Code generated by Yesql. DO NOT EDIT. +// versions: +// - Yesql v1.9.0 + +package pgc + +import ( + "context" + "fmt" + + "github.com/alimy/yesql" + "github.com/bitbus/sqlx" +) + +var ( + _ = fmt.Errorf("error for placeholder") +) + +const ( + _CommentManage_CreateComment = `INSERT INTO @comment (post_id, user_id, ip, ip_loc, created_on) VALUES (?, ?, ?, ?, ?) RETURNING *` + _CommentManage_CreateCommentContent = `INSERT INTO @comment_content (comment_id, user_id, content, type, sort, created_on) VALUES (?, ?, ?, ?, ?, ?) RETURNING *` + _CommentManage_CreateCommentReply = `INSERT INTO @comment_reply (comment_id, user_id, content, at_user_id, ip, ip_loc, created_on) VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING *` + _ContactManager_CreateContact = `INSERT INTO @contact (user_id, friend_id, status, created_on) VALUES (?, ?, ?, ?) RETURNING *` + _Message_CreateMessage = `INSERT INTO @message (sender_user_id, receiver_user_id, type, brief, content, post_id, comment_id, reply_id, created_on) VALUES (:sender_user_id, :receiver_user_id, :type, :brief, :content, :post_id, :comment_id, :reply_id, :created_on) RETURNING id` + _TweetManage_AddAttachment = `INSERT INTO @attachment (user_id, file_size, img_width, img_height, type, content, created_on) VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING id` + _TweetManage_AddPost = `INSERT INTO @post (user_id, tags, ip, ip_loc, attachment_price, visibility, latest_replied_on, created_on) VALUES (:user_id, :tags, :ip, :ip_loc, :attachment_price, :visibility, :latest_replied_on, :created_on) RETURNING id` + _TweetManage_AddPostCollection = `INSERT INTO @post_collection (post_id, user_id, created_on) VALUES (?, ?, ?) RETURNING *` + _TweetManage_AddPostContent = `INSERT INTO @post_content (post_id, user_id, content, type, sort, created_on) VALUES (:post_id, :user_id, :content, :type, :sort, :created_on) RETURNING id` + _TweetManage_AddPostStar = `INSERT INTO @post_star (post_id, user_id, created_on) VALUES (?, ?, ?) RETURNING *` + _UserManage_CreateUser = `INSERT INTO @user (username, nickname, password, salt, avatar, status, created_on) VALUES (:username, :nickname, :password, :salt, :avatar, :status, :created_on) RETURNING id` + _Wallet_CreateRecharge = `INSERT INTO @wallet_recharge (user_id, amount, created_on) VALUES (?, ?, ?) RETURNING *` +) + +// PreparexContext enhances the Conn interface with context. +type PreparexContext interface { + // PrepareContext prepares a statement. + // The provided context is used for the preparation of the statement, not for + // the execution of the statement. + PreparexContext(ctx context.Context, query string) (*sqlx.Stmt, error) + + // PrepareNamedContext returns an sqlx.NamedStmt + PrepareNamedContext(ctx context.Context, query string) (*sqlx.NamedStmt, error) + + // Rebind rebind query to adapte SQL Driver + Rebind(query string) string +} + +// PreparexBuilder preparex builder interface for sqlx +type PreparexBuilder interface { + PreparexContext + QueryHook(query string) string +} + +type CommentManage struct { + yesql.Namespace `yesql:"comment_manage"` + CreateComment *sqlx.Stmt `yesql:"create_comment"` + CreateCommentContent *sqlx.Stmt `yesql:"create_comment_content"` + CreateCommentReply *sqlx.Stmt `yesql:"create_comment_reply"` +} + +type ContactManager struct { + yesql.Namespace `yesql:"contact_manager"` + CreateContact *sqlx.Stmt `yesql:"create_contact"` +} + +type Message struct { + yesql.Namespace `yesql:"message"` + CreateMessage *sqlx.NamedStmt `yesql:"create_message"` +} + +type TweetManage struct { + yesql.Namespace `yesql:"tweet_manage"` + AddAttachment *sqlx.Stmt `yesql:"add_attachment"` + AddPostCollection *sqlx.Stmt `yesql:"add_post_collection"` + AddPostStar *sqlx.Stmt `yesql:"add_post_star"` + AddPost *sqlx.NamedStmt `yesql:"add_post"` + AddPostContent *sqlx.NamedStmt `yesql:"add_post_content"` +} + +type UserManage struct { + yesql.Namespace `yesql:"user_manage"` + CreateUser *sqlx.NamedStmt `yesql:"create_user"` +} + +type Wallet struct { + yesql.Namespace `yesql:"wallet"` + CreateRecharge *sqlx.Stmt `yesql:"create_recharge"` +} + +func BuildCommentManage(p PreparexBuilder, ctx ...context.Context) (obj *CommentManage, err error) { + var c context.Context + if len(ctx) > 0 && ctx[0] != nil { + c = ctx[0] + } else { + c = context.Background() + } + obj = &CommentManage{} + if obj.CreateComment, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_CommentManage_CreateComment))); err != nil { + return nil, fmt.Errorf("prepare _CommentManage_CreateComment error: %w", err) + } + if obj.CreateCommentContent, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_CommentManage_CreateCommentContent))); err != nil { + return nil, fmt.Errorf("prepare _CommentManage_CreateCommentContent error: %w", err) + } + if obj.CreateCommentReply, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_CommentManage_CreateCommentReply))); err != nil { + return nil, fmt.Errorf("prepare _CommentManage_CreateCommentReply error: %w", err) + } + return +} + +func BuildContactManager(p PreparexBuilder, ctx ...context.Context) (obj *ContactManager, err error) { + var c context.Context + if len(ctx) > 0 && ctx[0] != nil { + c = ctx[0] + } else { + c = context.Background() + } + obj = &ContactManager{} + if obj.CreateContact, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_ContactManager_CreateContact))); err != nil { + return nil, fmt.Errorf("prepare _ContactManager_CreateContact error: %w", err) + } + return +} + +func BuildMessage(p PreparexBuilder, ctx ...context.Context) (obj *Message, err error) { + var c context.Context + if len(ctx) > 0 && ctx[0] != nil { + c = ctx[0] + } else { + c = context.Background() + } + obj = &Message{} + if obj.CreateMessage, err = p.PrepareNamedContext(c, p.Rebind(p.QueryHook(_Message_CreateMessage))); err != nil { + return nil, fmt.Errorf("prepare _Message_CreateMessage error: %w", err) + } + return +} + +func BuildTweetManage(p PreparexBuilder, ctx ...context.Context) (obj *TweetManage, err error) { + var c context.Context + if len(ctx) > 0 && ctx[0] != nil { + c = ctx[0] + } else { + c = context.Background() + } + obj = &TweetManage{} + if obj.AddAttachment, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_TweetManage_AddAttachment))); err != nil { + return nil, fmt.Errorf("prepare _TweetManage_AddAttachment error: %w", err) + } + if obj.AddPostCollection, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_TweetManage_AddPostCollection))); err != nil { + return nil, fmt.Errorf("prepare _TweetManage_AddPostCollection error: %w", err) + } + if obj.AddPostStar, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_TweetManage_AddPostStar))); err != nil { + return nil, fmt.Errorf("prepare _TweetManage_AddPostStar error: %w", err) + } + if obj.AddPost, err = p.PrepareNamedContext(c, p.Rebind(p.QueryHook(_TweetManage_AddPost))); err != nil { + return nil, fmt.Errorf("prepare _TweetManage_AddPost error: %w", err) + } + if obj.AddPostContent, err = p.PrepareNamedContext(c, p.Rebind(p.QueryHook(_TweetManage_AddPostContent))); err != nil { + return nil, fmt.Errorf("prepare _TweetManage_AddPostContent error: %w", err) + } + return +} + +func BuildUserManage(p PreparexBuilder, ctx ...context.Context) (obj *UserManage, err error) { + var c context.Context + if len(ctx) > 0 && ctx[0] != nil { + c = ctx[0] + } else { + c = context.Background() + } + obj = &UserManage{} + if obj.CreateUser, err = p.PrepareNamedContext(c, p.Rebind(p.QueryHook(_UserManage_CreateUser))); err != nil { + return nil, fmt.Errorf("prepare _UserManage_CreateUser error: %w", err) + } + return +} + +func BuildWallet(p PreparexBuilder, ctx ...context.Context) (obj *Wallet, err error) { + var c context.Context + if len(ctx) > 0 && ctx[0] != nil { + c = ctx[0] + } else { + c = context.Background() + } + obj = &Wallet{} + if obj.CreateRecharge, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_CreateRecharge))); err != nil { + return nil, fmt.Errorf("prepare _Wallet_CreateRecharge error: %w", err) + } + return +} diff --git a/internal/dao/sakila/comments.go b/internal/dao/sakila/comments.go index 221875de..87a98555 100644 --- a/internal/dao/sakila/comments.go +++ b/internal/dao/sakila/comments.go @@ -7,12 +7,13 @@ package sakila import ( "time" + "github.com/alimy/cfg" "github.com/bitbus/sqlx" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core/cs" "github.com/rocboss/paopao-ce/internal/core/ms" - "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/cc" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" "github.com/rocboss/paopao-ce/pkg/types" ) @@ -144,7 +145,7 @@ func (s *commentManageSrv) CreateComment(r *ms.Comment) (*ms.Comment, error) { if err != nil { return nil, err } - r.Model = &dbr.Model{ + r.Model = &ms.Model{ ID: id, } return r, nil @@ -160,7 +161,7 @@ func (s *commentManageSrv) CreateCommentReply(r *ms.CommentReply) (*ms.CommentRe if err != nil { return nil, err } - r.Model = &dbr.Model{ID: id} + r.Model = &ms.Model{ID: id} return r, nil } @@ -184,7 +185,7 @@ func (s *commentManageSrv) CreateCommentContent(r *ms.CommentContent) (*ms.Comme if err != nil { return nil, err } - r.Model = &dbr.Model{ID: id} + r.Model = &ms.Model{ID: id} return r, nil } @@ -195,7 +196,7 @@ func (s *commentManageSrv) ThumbsUpComment(userId int64, tweetId, commentId int6 thumbsDownCount int32 = 0 ) now := time.Now().Unix() - commentThumbs := &dbr.TweetCommentThumbs{} + commentThumbs := &ms.TweetCommentThumbs{} // 检查thumbs状态 err := tx.Stmtx(s.q.GetTweetCommentThumb).Get(commentThumbs, userId, tweetId, commentId) if err == nil { @@ -214,14 +215,14 @@ func (s *commentManageSrv) ThumbsUpComment(userId int64, tweetId, commentId int6 return err } } else { - commentThumbs = &dbr.TweetCommentThumbs{ + commentThumbs = &ms.TweetCommentThumbs{ UserID: userId, TweetID: tweetId, CommentID: commentId, IsThumbsUp: types.Yes, IsThumbsDown: types.No, CommentType: 0, - Model: &dbr.Model{ + Model: &ms.Model{ CreatedOn: now, }, } @@ -243,7 +244,7 @@ func (s *commentManageSrv) ThumbsDownComment(userId int64, tweetId, commentId in thumbsDownCount int32 = 0 ) now := time.Now().Unix() - commentThumbs := &dbr.TweetCommentThumbs{} + commentThumbs := &ms.TweetCommentThumbs{} // 检查thumbs状态 err := tx.Stmtx(s.q.GetTweetCommentThumb).Get(commentThumbs, userId, tweetId, commentId) if err == nil { @@ -263,14 +264,14 @@ func (s *commentManageSrv) ThumbsDownComment(userId int64, tweetId, commentId in return err } } else { - commentThumbs = &dbr.TweetCommentThumbs{ + commentThumbs = &ms.TweetCommentThumbs{ UserID: userId, TweetID: tweetId, CommentID: commentId, IsThumbsUp: types.No, IsThumbsDown: types.Yes, CommentType: 0, - Model: &dbr.Model{ + Model: &ms.Model{ CreatedOn: now, }, } @@ -292,7 +293,7 @@ func (s *commentManageSrv) ThumbsUpReply(userId int64, tweetId, commentId, reply thumbsDownCount int32 = 0 ) now := time.Now().Unix() - commentThumbs := &dbr.TweetCommentThumbs{} + commentThumbs := &ms.TweetCommentThumbs{} // 检查thumbs状态 err := tx.Stmtx(s.q.GetCommentReplyThumb).Get(commentThumbs, userId, tweetId, commentId, replyId) if err == nil { @@ -311,7 +312,7 @@ func (s *commentManageSrv) ThumbsUpReply(userId int64, tweetId, commentId, reply return err } } else { - commentThumbs = &dbr.TweetCommentThumbs{ + commentThumbs = &ms.TweetCommentThumbs{ UserID: userId, TweetID: tweetId, CommentID: commentId, @@ -319,7 +320,7 @@ func (s *commentManageSrv) ThumbsUpReply(userId int64, tweetId, commentId, reply IsThumbsUp: types.Yes, IsThumbsDown: types.No, CommentType: 1, - Model: &dbr.Model{ + Model: &ms.Model{ CreatedOn: now, }, } @@ -341,7 +342,7 @@ func (s *commentManageSrv) ThumbsDownReply(userId int64, tweetId, commentId, rep thumbsDownCount int32 = 0 ) now := time.Now().Unix() - commentThumbs := &dbr.TweetCommentThumbs{} + commentThumbs := &ms.TweetCommentThumbs{} // 检查thumbs状态 err := tx.Stmtx(s.q.GetCommentReplyThumb).Get(commentThumbs, userId, tweetId, commentId, replyId) if err == nil { @@ -360,7 +361,7 @@ func (s *commentManageSrv) ThumbsDownReply(userId int64, tweetId, commentId, rep return err } } else { - commentThumbs = &dbr.TweetCommentThumbs{ + commentThumbs = &ms.TweetCommentThumbs{ UserID: userId, TweetID: tweetId, CommentID: commentId, @@ -368,7 +369,7 @@ func (s *commentManageSrv) ThumbsDownReply(userId int64, tweetId, commentId, rep IsThumbsUp: types.No, IsThumbsDown: types.Yes, CommentType: 1, - Model: &dbr.Model{ + Model: &ms.Model{ CreatedOn: now, }, } @@ -390,9 +391,17 @@ func newCommentService(db *sqlx.DB) core.CommentService { } } -func newCommentManageService(db *sqlx.DB) core.CommentManageService { - return &commentManageSrv{ +func newCommentManageService(db *sqlx.DB) (s core.CommentManageService) { + cms := &commentManageSrv{ sqlxSrv: newSqlxSrv(db), q: ccBuild(db, cc.BuildCommentManage), } + s = cms + if cfg.Any("PostgreSQL", "PgSQL", "Postgres") { + s = &pgcCommentManageSrv{ + commentManageSrv: cms, + p: pgcBuild(db, pgc.BuildCommentManage), + } + } + return } diff --git a/internal/dao/sakila/comments_pgc.go b/internal/dao/sakila/comments_pgc.go new file mode 100644 index 00000000..fe763e54 --- /dev/null +++ b/internal/dao/sakila/comments_pgc.go @@ -0,0 +1,43 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package sakila + +import ( + "time" + + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/core/ms" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" +) + +var ( + _ core.CommentManageService = (*pgcCommentManageSrv)(nil) +) + +type pgcCommentManageSrv struct { + *commentManageSrv + p *pgc.CommentManage +} + +func (s *pgcCommentManageSrv) CreateComment(r *ms.Comment) (res *ms.Comment, err error) { + err = stmtGet(s.q.CreateComment, res, + r.PostID, r.UserID, r.IP, + r.IPLoc, time.Now().Unix()) + return +} + +func (s *pgcCommentManageSrv) CreateCommentReply(r *ms.CommentReply) (res *ms.CommentReply, err error) { + err = stmtGet(s.q.CreateCommentReply, res, + r.CommentID, r.UserID, r.Content, + r.AtUserID, r.IP, r.IPLoc, time.Now().Unix()) + return +} + +func (s *pgcCommentManageSrv) CreateCommentContent(r *ms.CommentContent) (res *ms.CommentContent, err error) { + err = stmtGet(s.q.CreateCommentContent, res, + r.CommentID, r.UserID, r.Content, + r.Type, r.Sort, time.Now().Unix()) + return +} diff --git a/internal/dao/sakila/contacts.go b/internal/dao/sakila/contacts.go index 51a35c55..20348502 100644 --- a/internal/dao/sakila/contacts.go +++ b/internal/dao/sakila/contacts.go @@ -7,11 +7,13 @@ package sakila import ( "time" + "github.com/alimy/cfg" "github.com/bitbus/sqlx" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core/cs" "github.com/rocboss/paopao-ce/internal/core/ms" "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/cc" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" "github.com/sirupsen/logrus" ) @@ -21,12 +23,13 @@ var ( type contactManageSrv struct { *sqlxSrv - q *cc.ContactManager + q *cc.ContactManager + upsertContact func(tx *sqlx.Tx, userId int64, friendId int64, status int8) (*cs.Contact, error) } func (s *contactManageSrv) RequestingFriend(userId int64, friendId int64, greetings string) error { return s.db.Withx(func(tx *sqlx.Tx) error { - contact, err := s.fetchOrNewContact(tx, userId, friendId, cs.ContactStatusRequesting) + contact, err := s.upsertContact(tx, userId, friendId, cs.ContactStatusRequesting) if err != nil { return err } @@ -78,7 +81,7 @@ func (s *contactManageSrv) AddFriend(userId int64, friendId int64) error { if _, err = tx.Stmtx(s.q.FreshContactStatus).Exec(args...); err != nil { return err } - contact, err = s.fetchOrNewContact(tx, userId, friendId, cs.ContactStatusAgree) + contact, err = s.upsertContact(tx, userId, friendId, cs.ContactStatusAgree) if err != nil { return err } @@ -179,9 +182,20 @@ func (s *contactManageSrv) fetchOrNewContact(tx *sqlx.Tx, userId int64, friendId }, nil } -func newContactManageService(db *sqlx.DB) core.ContactManageService { - return &contactManageSrv{ +func newContactManageService(db *sqlx.DB) (s core.ContactManageService) { + cms := &contactManageSrv{ sqlxSrv: newSqlxSrv(db), q: ccBuild(db, cc.BuildContactManager), } + cms.upsertContact = cms.fetchOrNewContact + s = cms + if cfg.Any("PostgreSQL", "PgSQL", "Postgres") { + pgcms := &pgcContactManageSrv{ + contactManageSrv: cms, + p: pgcBuild(db, pgc.BuildContactManager), + } + pgcms.upsertContact = pgcms.pgcFetchOrNewContact + s = pgcms + } + return } diff --git a/internal/dao/sakila/contacts_pgc.go b/internal/dao/sakila/contacts_pgc.go new file mode 100644 index 00000000..e1d3376a --- /dev/null +++ b/internal/dao/sakila/contacts_pgc.go @@ -0,0 +1,30 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package sakila + +import ( + "time" + + "github.com/bitbus/sqlx" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/core/cs" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" +) + +var ( + _ core.ContactManageService = (*pgcContactManageSrv)(nil) +) + +type pgcContactManageSrv struct { + *contactManageSrv + p *pgc.ContactManager +} + +func (s *pgcContactManageSrv) pgcFetchOrNewContact(tx *sqlx.Tx, userId int64, friendId int64, status int8) (res *cs.Contact, err error) { + if err = stmtGet(tx.Stmtx(s.q.GetContact), res, userId, friendId); err != nil { + err = stmtGet(tx.Stmtx(s.p.CreateContact), res, userId, friendId, status, time.Now().Unix()) + } + return +} diff --git a/internal/dao/sakila/messages.go b/internal/dao/sakila/messages.go index 8de72d59..209295b6 100644 --- a/internal/dao/sakila/messages.go +++ b/internal/dao/sakila/messages.go @@ -7,11 +7,12 @@ package sakila import ( "time" + "github.com/alimy/cfg" "github.com/bitbus/sqlx" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core/ms" - "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/cc" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" "github.com/sirupsen/logrus" ) @@ -25,7 +26,7 @@ type messageSrv struct { } func (s *messageSrv) CreateMessage(r *ms.Message) (*ms.Message, error) { - r.Model = &dbr.Model{ + r.Model = &ms.Model{ CreatedOn: time.Now().Unix(), } res, err := s.q.CreateMessage.Exec(r) @@ -60,7 +61,7 @@ func (s *messageSrv) GetMessages(r *ms.ConditionsT, offset, limit int) ([]*ms.Me if err := s.q.GetMessages.Select(&messages, *r); err != nil { return nil, err } - mfs := make([]*dbr.MessageFormated, 0, len(messages)) + mfs := make([]*ms.MessageFormated, 0, len(messages)) for _, message := range messages { mf := message.Format() mfs = append(mfs, mf) @@ -75,9 +76,17 @@ func (s *messageSrv) GetMessageCount(r *ms.ConditionsT) (res int64, err error) { return } -func newMessageService(db *sqlx.DB) core.MessageService { - return &messageSrv{ +func newMessageService(db *sqlx.DB) (s core.MessageService) { + ms := &messageSrv{ sqlxSrv: newSqlxSrv(db), q: ccBuild(db, cc.BuildMessage), } + s = ms + if cfg.Any("PostgreSQL", "PgSQL", "Postgres") { + s = &pgcMessageSrv{ + messageSrv: ms, + p: pgcBuild(db, pgc.BuildMessage), + } + } + return } diff --git a/internal/dao/sakila/messages_pgc.go b/internal/dao/sakila/messages_pgc.go new file mode 100644 index 00000000..1f96eec9 --- /dev/null +++ b/internal/dao/sakila/messages_pgc.go @@ -0,0 +1,33 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package sakila + +import ( + "time" + + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/core/ms" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" +) + +var ( + _ core.MessageService = (*pgcMessageSrv)(nil) +) + +type pgcMessageSrv struct { + *messageSrv + p *pgc.Message +} + +func (s *pgcMessageSrv) CreateMessage(r *ms.Message) (*ms.Message, error) { + r.Model = &dbr.Model{ + CreatedOn: time.Now().Unix(), + } + if err := s.p.CreateMessage.Get(&r.ID, r); err != nil { + return nil, err + } + return r, nil +} diff --git a/internal/dao/sakila/sqlx.go b/internal/dao/sakila/sqlx.go index 92cc4711..34e8f5d3 100644 --- a/internal/dao/sakila/sqlx.go +++ b/internal/dao/sakila/sqlx.go @@ -8,6 +8,7 @@ import ( "bytes" "context" + "github.com/alimy/cfg" "github.com/alimy/yesql" "github.com/bitbus/sqlx" "github.com/rocboss/paopao-ce/internal/conf" @@ -15,6 +16,8 @@ import ( "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/ac" "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/cc" "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pg" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pga" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" "github.com/sirupsen/logrus" ) @@ -24,15 +27,22 @@ var ( ) type sqlxSrv struct { - db *sqlx.DB - y *yc.Yesql + db *sqlx.DB + y *yc.Yesql + insertTag *sqlx.Stmt } -func newSqlxSrv(db *sqlx.DB) *sqlxSrv { - return &sqlxSrv{ +func newSqlxSrv(db *sqlx.DB) (s *sqlxSrv) { + s = &sqlxSrv{ db: db, y: mustBuild(db, yc.BuildYesql), } + s.insertTag = s.y.InsertTag + if cfg.Any("PostgreSQL", "PgSQL", "Postgres") { + g := pgBuild(s.db, pg.BuildYesql) + s.insertTag = g.InsertTag + } + return } //lint:ignore U1000 stmtGet @@ -47,6 +57,18 @@ func stmtGetContext[T any](ctx context.Context, stmt *sqlx.Stmt, dest *T, args . return stmt.GetContext(ctx, dest, args...) } +//lint:ignore U1000 namedGet +func namedGet[T any](stmt *sqlx.NamedStmt, dest *T, arg any) error { + *dest = *new(T) + return stmt.Get(dest, arg) +} + +//lint:ignore U1000 namesGetContext +func namesGetContext[T any](ctx context.Context, stmt *sqlx.NamedStmt, dest *T, arg any) error { + *dest = *new(T) + return stmt.GetContext(ctx, dest, arg) +} + //lint:ignore U1000 inGet func inGet[T any](q sqlx.Queryable, dest *T, query string, args ...any) error { *dest = *new(T) @@ -188,6 +210,46 @@ func pgBuildFn[T any](db *sqlx.DB, fn func(pg.PreparexBuilder) (T, error)) T { return obj } +//lint:ignore U1000 pgBuild +func pgaBuild[T any](db *sqlx.DB, fn func(pga.PreparexBuilder, ...context.Context) (T, error)) T { + p := yesql.NewPreparexBuilder(db, t) + obj, err := fn(p) + if err != nil { + logrus.Fatalf("build object failure: %s", err) + } + return obj +} + +//lint:ignore U1000 pgBuildFn +func pgaBuildFn[T any](db *sqlx.DB, fn func(pga.PreparexBuilder) (T, error)) T { + p := yesql.NewPreparexBuilder(db, t) + obj, err := fn(p) + if err != nil { + logrus.Fatalf("build object failure: %s", err) + } + return obj +} + +//lint:ignore U1000 pgBuild +func pgcBuild[T any](db *sqlx.DB, fn func(pgc.PreparexBuilder, ...context.Context) (T, error)) T { + p := yesql.NewPreparexBuilder(db, t) + obj, err := fn(p) + if err != nil { + logrus.Fatalf("build object failure: %s", err) + } + return obj +} + +//lint:ignore U1000 pgBuildFn +func pgcBuildFn[T any](db *sqlx.DB, fn func(pgc.PreparexBuilder) (T, error)) T { + p := yesql.NewPreparexBuilder(db, t) + obj, err := fn(p) + if err != nil { + logrus.Fatalf("build object failure: %s", err) + } + return obj +} + func initSqlxDB() { _db = conf.MustSqlxDB() _tablePrefix = conf.DatabaseSetting.TablePrefix diff --git a/internal/dao/sakila/topics.go b/internal/dao/sakila/topics_a.go similarity index 89% rename from internal/dao/sakila/topics.go rename to internal/dao/sakila/topics_a.go index baf46b56..a7f7d5d3 100644 --- a/internal/dao/sakila/topics.go +++ b/internal/dao/sakila/topics_a.go @@ -8,10 +8,12 @@ import ( "strings" "time" + "github.com/alimy/cfg" "github.com/bitbus/sqlx" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core/cs" "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/ac" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pga" ) var ( @@ -187,16 +189,32 @@ func (s *topicSrvA) tagsFormatA(userId int64, tags cs.TagList) (cs.TagList, erro return tags, nil } -func newTopicService(db *sqlx.DB) core.TopicService { - return &topicSrvA{ +func newTopicService(db *sqlx.DB) (s core.TopicService) { + ts := &topicSrvA{ sqlxSrv: newSqlxSrv(db), q: acBuild(db, ac.BuildTopicA), } + s = ts + if cfg.Any("PostgreSQL", "PgSQL", "Postgres") { + s = &pgaTopicSrvA{ + topicSrvA: ts, + p: pgaBuild(db, pga.BuildTopicA), + } + } + return } -func newTopicServantA(db *sqlx.DB) core.TopicServantA { - return &topicSrvA{ +func newTopicServantA(db *sqlx.DB) (s core.TopicServantA) { + ts := &topicSrvA{ sqlxSrv: newSqlxSrv(db), q: acBuild(db, ac.BuildTopicA), } + s = ts + if cfg.Any("PostgreSQL", "PgSQL", "Postgres") { + s = &pgaTopicSrvA{ + topicSrvA: ts, + p: pgaBuild(db, pga.BuildTopicA), + } + } + return } diff --git a/internal/dao/sakila/topics_pga.go b/internal/dao/sakila/topics_pga.go new file mode 100644 index 00000000..5db16ecc --- /dev/null +++ b/internal/dao/sakila/topics_pga.go @@ -0,0 +1,80 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package sakila + +import ( + "time" + + "github.com/bitbus/sqlx" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/core/cs" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pga" +) + +var ( + _ core.TopicService = (*pgaTopicSrvA)(nil) + _ core.TopicServantA = (*pgaTopicSrvA)(nil) +) + +type pgaTopicSrvA struct { + *topicSrvA + p *pga.TopicA +} + +func (s *pgaTopicSrvA) UpsertTags(userId int64, tags []string) (res cs.TagInfoList, xerr error) { + if len(tags) == 0 { + return nil, nil + } + xerr = s.db.Withx(func(tx *sqlx.Tx) error { + var upTags cs.TagInfoList + err := tx.InSelect(&upTags, s.q.TagsForIncr, tags) + if err != nil { + return err + } + now := time.Now().Unix() + if len(upTags) > 0 { + var ids []int64 + for _, t := range upTags { + ids = append(ids, t.ID) + t.QuoteNum++ + // prepare remain tags just delete updated tag + // notice ensure tags slice is distinct elements + for i, name := range tags { + if name == t.Tag { + lastIdx := len(tags) - 1 + tags[i] = tags[lastIdx] + tags = tags[:lastIdx] + break + } + } + } + if _, err := tx.InExec(s.q.IncrTagsById, now, ids); err != nil { + return err + } + res = append(res, upTags...) + } + // process remain tags if tags is not empty + if len(tags) == 0 { + return nil + } + var ( + id int64 + ids []int64 + ) + for _, tag := range tags { + if err = s.p.InsertTag.Get(&id, userId, tag, now, now); err != nil { + return err + } + ids = append(ids, id) + } + var newTags cs.TagInfoList + if err := tx.InSelect(&newTags, s.q.TagsByIdB, ids); err != nil { + return err + } + res = append(res, newTags...) + return nil + }) + return +} diff --git a/internal/dao/sakila/tweets.go b/internal/dao/sakila/tweets.go index 7e387805..98a68372 100644 --- a/internal/dao/sakila/tweets.go +++ b/internal/dao/sakila/tweets.go @@ -13,9 +13,8 @@ import ( "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core/cs" "github.com/rocboss/paopao-ce/internal/core/ms" - "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/cc" - "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pg" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" ) var ( @@ -59,16 +58,16 @@ func (s *tweetHelpSrv) MergePosts(posts []*ms.Post) ([]*ms.PostFormated, error) if err != nil { return nil, err } - userMap := make(map[int64]*dbr.UserFormated, len(users)) + userMap := make(map[int64]*ms.UserFormated, len(users)) for _, user := range users { userMap[user.ID] = user } - contentMap := make(map[int64][]*dbr.PostContentFormated, len(postContents)) + contentMap := make(map[int64][]*ms.PostContentFormated, len(postContents)) for _, content := range postContents { contentMap[content.PostID] = append(contentMap[content.PostID], content) } // 数据整合 - postsFormated := make([]*dbr.PostFormated, 0, len(posts)) + postsFormated := make([]*ms.PostFormated, 0, len(posts)) for _, post := range posts { postFormated := post.Format() postFormated.User = userMap[post.UserID] @@ -97,11 +96,11 @@ func (s *tweetHelpSrv) RevampPosts(posts []*ms.PostFormated) ([]*ms.PostFormated if err != nil { return nil, err } - userMap := make(map[int64]*dbr.UserFormated, len(users)) + userMap := make(map[int64]*ms.UserFormated, len(users)) for _, user := range users { userMap[user.ID] = user } - contentMap := make(map[int64][]*dbr.PostContentFormated, len(postContents)) + contentMap := make(map[int64][]*ms.PostContentFormated, len(postContents)) for _, content := range postContents { contentMap[content.PostID] = append(contentMap[content.PostID], content) } @@ -113,12 +112,12 @@ func (s *tweetHelpSrv) RevampPosts(posts []*ms.PostFormated) ([]*ms.PostFormated return posts, nil } -func (s *tweetHelpSrv) getPostContentsByIDs(ids []int64) (res []*dbr.PostContentFormated, err error) { +func (s *tweetHelpSrv) getPostContentsByIDs(ids []int64) (res []*ms.PostContentFormated, err error) { err = s.db.InSelect(&res, s.q.GetPostContentByIds, ids) return } -func (s *tweetHelpSrv) getUsersByIDs(ids []int64) (res []*dbr.UserFormated, err error) { +func (s *tweetHelpSrv) getUsersByIDs(ids []int64) (res []*ms.UserFormated, err error) { err = s.db.InSelect(&res, s.q.GetUsersByIds, ids) return } @@ -134,7 +133,7 @@ func (s *tweetManageSrv) CreatePostCollection(postID, userID int64) (*ms.PostCol return nil, err } return &ms.PostCollection{ - Model: &dbr.Model{ + Model: &ms.Model{ ID: id, CreatedOn: now, }, @@ -172,7 +171,7 @@ func (s *tweetManageSrv) CreateAttachment(r *ms.Attachment) (int64, error) { func (s *tweetManageSrv) CreatePost(r *ms.Post) (*ms.Post, error) { now := time.Now().Unix() - r.Model = &dbr.Model{CreatedOn: now} + r.Model = &ms.Model{CreatedOn: now} r.LatestRepliedOn = now res, err := s.q.AddPost.Exec(r) if err != nil { @@ -287,10 +286,10 @@ func (s *tweetManageSrv) VisiblePost(post *ms.Post, visibility core.PostVisibleT // tag处理 tags := strings.Split(post.Tags, ",") // TODO: 暂时宽松不处理错误,这里或许可以有优化,后续完善 - if oldVisibility == dbr.PostVisitPrivate { + if oldVisibility == ms.PostVisitPrivate { // 从私密转为非私密才需要重新创建tag s.createTags(tx, post.UserID, tags) - } else if visibility == dbr.PostVisitPrivate { + } else if visibility == ms.PostVisitPrivate { // 从非私密转为私密才需要删除tag s.deleteTags(tx, tags) } @@ -320,7 +319,7 @@ func (s *tweetManageSrv) CreatePostStar(postID, userID int64) (*ms.PostStar, err return nil, err } return &ms.PostStar{ - Model: &dbr.Model{ + Model: &ms.Model{ ID: id, CreatedOn: now, }, @@ -485,9 +484,9 @@ func newTweetManageService(db *sqlx.DB, cacheIndex core.CacheIndexService) (s co } s = tms if cfg.Any("PostgreSQL", "PgSQL", "Postgres") { - s = &pgTweetManageSrv{ + s = &pgcTweetManageSrv{ tweetManageSrv: tms, - p: pgBuild(db, pg.BuildTweetManage), + p: pgcBuild(db, pgc.BuildTweetManage), } } return diff --git a/internal/dao/sakila/tweets_pg.go b/internal/dao/sakila/tweets_pg.go deleted file mode 100644 index 633f4c20..00000000 --- a/internal/dao/sakila/tweets_pg.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2023 ROC. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package sakila - -import ( - "time" - - "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/core/ms" - "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" - "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pg" -) - -var ( - _ core.TweetManageService = (*pgTweetManageSrv)(nil) -) - -type pgTweetManageSrv struct { - *tweetManageSrv - p *pg.TweetManage -} - -func (s *pgTweetManageSrv) CreatePost(r *ms.Post) (*ms.Post, error) { - now := time.Now().Unix() - r.Model = &dbr.Model{CreatedOn: now} - r.LatestRepliedOn = now - err := s.p.AddPost.Get(&r.ID, r) - if err != nil { - return nil, err - } - s.cis.SendAction(core.IdxActCreatePost, r) - return r, nil -} - -func (s *pgTweetManageSrv) CreatePostContent(r *ms.PostContent) (*ms.PostContent, error) { - r.Model = &ms.Model{CreatedOn: time.Now().Unix()} - err := s.p.AddPostContent.Get(&r.ID, r) - if err != nil { - return nil, err - } - return r, nil -} diff --git a/internal/dao/sakila/tweets_pgc.go b/internal/dao/sakila/tweets_pgc.go new file mode 100644 index 00000000..48c90d0c --- /dev/null +++ b/internal/dao/sakila/tweets_pgc.go @@ -0,0 +1,58 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package sakila + +import ( + "time" + + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/core/ms" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" +) + +var ( + _ core.TweetManageService = (*pgcTweetManageSrv)(nil) +) + +type pgcTweetManageSrv struct { + *tweetManageSrv + p *pgc.TweetManage +} + +func (s *pgcTweetManageSrv) CreatePost(r *ms.Post) (*ms.Post, error) { + now := time.Now().Unix() + r.Model = &ms.Model{CreatedOn: now} + r.LatestRepliedOn = now + err := s.p.AddPost.Get(&r.ID, r) + if err != nil { + return nil, err + } + s.cis.SendAction(core.IdxActCreatePost, r) + return r, nil +} + +func (s *pgcTweetManageSrv) CreatePostContent(r *ms.PostContent) (*ms.PostContent, error) { + r.Model = &ms.Model{CreatedOn: time.Now().Unix()} + if err := s.p.AddPostContent.Get(&r.ID, r); err != nil { + return nil, err + } + return r, nil +} + +func (s *pgcTweetManageSrv) CreateAttachment(r *ms.Attachment) (res int64, err error) { + args := []any{r.UserID, r.FileSize, r.ImgWidth, r.ImgHeight, r.Type, r.Content, time.Now().Unix()} + err = s.p.AddAttachment.Get(&res, args...) + return +} + +func (s *pgcTweetManageSrv) CreatePostStar(postID, userID int64) (res *ms.PostStar, err error) { + err = stmtGet(s.q.AddPostStar, res, postID, userID, time.Now().Unix()) + return +} + +func (s *pgcTweetManageSrv) CreatePostCollection(postID, userID int64) (res *ms.PostCollection, err error) { + err = stmtGet(s.q.AddPostCollection, res, postID, userID, time.Now().Unix()) + return +} diff --git a/internal/dao/sakila/user.go b/internal/dao/sakila/user.go index e2dd7370..655c7442 100644 --- a/internal/dao/sakila/user.go +++ b/internal/dao/sakila/user.go @@ -8,10 +8,12 @@ import ( "strings" "time" + "github.com/alimy/cfg" "github.com/bitbus/sqlx" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core/ms" "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/cc" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" ) var ( @@ -73,9 +75,17 @@ func (s *userManageSrv) UpdateUser(r *ms.User) error { return err } -func newUserManageService(db *sqlx.DB) core.UserManageService { - return &userManageSrv{ +func newUserManageService(db *sqlx.DB) (s core.UserManageService) { + ums := &userManageSrv{ sqlxSrv: newSqlxSrv(db), q: ccBuild(db, cc.BuildUserManage), } + s = ums + if cfg.Any("PostgreSQL", "PgSQL", "Postgres") { + s = &pgcUserManageSrv{ + userManageSrv: ums, + p: pgcBuild(db, pgc.BuildUserManage), + } + } + return } diff --git a/internal/dao/sakila/user_pgc.go b/internal/dao/sakila/user_pgc.go new file mode 100644 index 00000000..f6128b33 --- /dev/null +++ b/internal/dao/sakila/user_pgc.go @@ -0,0 +1,30 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package sakila + +import ( + "time" + + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/core/ms" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" +) + +var ( + _ core.UserManageService = (*pgcUserManageSrv)(nil) +) + +type pgcUserManageSrv struct { + *userManageSrv + p *pgc.UserManage +} + +func (s *pgcUserManageSrv) CreateUser(r *ms.User) (*ms.User, error) { + r.Model = &ms.Model{CreatedOn: time.Now().Unix()} + if err := s.q.CreateUser.Get(&r.ID, r); err != nil { + return nil, err + } + return r, nil +} diff --git a/internal/dao/sakila/utils.go b/internal/dao/sakila/utils.go index 88c8a55a..4165551a 100644 --- a/internal/dao/sakila/utils.go +++ b/internal/dao/sakila/utils.go @@ -32,7 +32,8 @@ func (s *sqlxSrv) createTags(tx *sqlx.Tx, userId int64, tags []string) (res cs.T } xerr = s.db.Withx(func(tx *sqlx.Tx) error { var upTags cs.TagInfoList - if err := tx.InSelect(&upTags, s.y.TagsForIncr, tags); err != nil { + err := tx.InSelect(&upTags, s.y.TagsForIncr, tags) + if err != nil { return err } now := time.Now().Unix() @@ -61,14 +62,12 @@ func (s *sqlxSrv) createTags(tx *sqlx.Tx, userId int64, tags []string) (res cs.T if len(tags) == 0 { return nil } - var ids []int64 + var ( + id int64 + ids []int64 + ) for _, tag := range tags { - res, err := s.y.InsertTag.Exec(userId, tag, now, now) - if err != nil { - return err - } - id, err := res.LastInsertId() - if err != nil { + if err = s.insertTag.Get(&id, userId, tag, now, now); err != nil { return err } ids = append(ids, id) diff --git a/internal/dao/sakila/wallet.go b/internal/dao/sakila/wallet.go index 9801732d..a70e2a59 100644 --- a/internal/dao/sakila/wallet.go +++ b/internal/dao/sakila/wallet.go @@ -7,12 +7,13 @@ package sakila import ( "time" + "github.com/alimy/cfg" "github.com/bitbus/sqlx" "github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core/ms" - "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/cc" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" ) var ( @@ -40,7 +41,7 @@ func (s *walletSrv) CreateRecharge(userId, amount int64) (*ms.WalletRecharge, er return nil, err } return &ms.WalletRecharge{ - Model: &dbr.Model{ + Model: &ms.Model{ ID: id, CreatedOn: now, }, @@ -123,9 +124,17 @@ func (s *walletSrv) HandlePostAttachmentBought(post *ms.Post, user *ms.User) err }) } -func newWalletService(db *sqlx.DB) core.WalletService { - return &walletSrv{ +func newWalletService(db *sqlx.DB) (s core.WalletService) { + ws := &walletSrv{ sqlxSrv: newSqlxSrv(db), q: ccBuild(db, cc.BuildWallet), } + s = ws + if cfg.Any("PostgreSQL", "PgSQL", "Postgres") { + s = &pgcWalletSrv{ + walletSrv: ws, + p: pgcBuild(db, pgc.BuildWallet), + } + } + return } diff --git a/internal/dao/sakila/wallet_pgc.go b/internal/dao/sakila/wallet_pgc.go new file mode 100644 index 00000000..7213139d --- /dev/null +++ b/internal/dao/sakila/wallet_pgc.go @@ -0,0 +1,27 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package sakila + +import ( + "time" + + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/core/ms" + "github.com/rocboss/paopao-ce/internal/dao/sakila/auto/pgc" +) + +var ( + _ core.WalletService = (*pgcWalletSrv)(nil) +) + +type pgcWalletSrv struct { + *walletSrv + p *pgc.Wallet +} + +func (s *pgcWalletSrv) CreateRecharge(userId, amount int64) (res *ms.WalletRecharge, err error) { + err = stmtGet(s.q.CreateRecharge, res, userId, amount, time.Now().Unix()) + return +} diff --git a/internal/dao/sakila/yesql/yesql.yaml b/internal/dao/sakila/yesql/yesql.yaml index 4dcf3c51..554eabaf 100644 --- a/internal/dao/sakila/yesql/yesql.yaml +++ b/internal/dao/sakila/yesql/yesql.yaml @@ -26,3 +26,13 @@ sql: package: pg out: ../auto/pg go_file_name: pg + - queries: yesql_pga.sql + gen: + package: pga + out: ../auto/pga + go_file_name: pga + - queries: yesql_pgc.sql + gen: + package: pgc + out: ../auto/pgc + go_file_name: pgc diff --git a/internal/dao/sakila/yesql/yesql_pg.sql b/internal/dao/sakila/yesql/yesql_pg.sql index 3406d098..ec797074 100644 --- a/internal/dao/sakila/yesql/yesql_pg.sql +++ b/internal/dao/sakila/yesql/yesql_pg.sql @@ -1,16 +1,16 @@ -------------------------------------------------------------------------------- --- file yesql.sql +-- file yesql_pg.sql +-- this sql file just define global sql dml -- this sql file contain some PostgreSQL special sql dml -------------------------------------------------------------------------------- --- name: add_post@tweet_manage --- prepare: named_stmt -INSERT INTO @post (user_id, tags, ip, ip_loc, attachment_price, visibility, latest_replied_on, created_on) -VALUES (:user_id, :tags, :ip, :ip_loc, :attachment_price, :visibility, :latest_replied_on, :created_on) -RETURNING id; +-------------------------------------------------------------------------------- +-- global sql dml +-------------------------------------------------------------------------------- --- name: add_post_content@tweet_manage --- prepare: named_stmt -INSERT INTO @post_content (post_id, user_id, content, type, sort, created_on) -VALUES (:post_id, :user_id, :content, :type, :sort, :created_on) +-- name: insert_tag +-- prepare: stmt +INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) +VALUES (?, ?, ?, ?, 1) RETURNING id; + diff --git a/internal/dao/sakila/yesql/yesql_pga.sql b/internal/dao/sakila/yesql/yesql_pga.sql new file mode 100644 index 00000000..0706e5c0 --- /dev/null +++ b/internal/dao/sakila/yesql/yesql_pga.sql @@ -0,0 +1,14 @@ +-------------------------------------------------------------------------------- +-- file yesql.sql +-- this sql file contain some PostgreSQL special sql dml +-- version is a* +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- topic_a sql dml +-------------------------------------------------------------------------------- + +-- name: insert_tag@topic_a +INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) +VALUES (?, ?, ?, ?, 1) +RETURNING id; diff --git a/internal/dao/sakila/yesql/yesql_pgc.sql b/internal/dao/sakila/yesql/yesql_pgc.sql new file mode 100644 index 00000000..b8ba0b59 --- /dev/null +++ b/internal/dao/sakila/yesql/yesql_pgc.sql @@ -0,0 +1,99 @@ +-------------------------------------------------------------------------------- +-- file yesql.sql +-- this sql file contain some PostgreSQL special sql dml +-- version is c* +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- tweet_manage sql dml +-------------------------------------------------------------------------------- + +-- name: add_post@tweet_manage +-- prepare: named_stmt +INSERT INTO @post (user_id, tags, ip, ip_loc, attachment_price, visibility, latest_replied_on, created_on) +VALUES (:user_id, :tags, :ip, :ip_loc, :attachment_price, :visibility, :latest_replied_on, :created_on) +RETURNING id; + +-- name: add_post_content@tweet_manage +-- prepare: named_stmt +INSERT INTO @post_content (post_id, user_id, content, type, sort, created_on) +VALUES (:post_id, :user_id, :content, :type, :sort, :created_on) +RETURNING id; + +-- name: add_attachment@tweet_manage +-- prepare: stmt +INSERT INTO @attachment (user_id, file_size, img_width, img_height, type, content, created_on) +VALUES (?, ?, ?, ?, ?, ?, ?) +RETURNING id; + +-- name: add_post_star@tweet_manage +-- prepare: stmt +INSERT INTO @post_star (post_id, user_id, created_on) +VALUES (?, ?, ?) +RETURNING *; + +-- name: add_post_collection@tweet_manage +-- prepare: stmt +INSERT INTO @post_collection (post_id, user_id, created_on) +VALUES (?, ?, ?) +RETURNING *; + +-------------------------------------------------------------------------------- +-- user_manage sql dml +-------------------------------------------------------------------------------- + +-- name: create_user@user_manage +-- prepare: named_stmt +INSERT INTO @user (username, nickname, password, salt, avatar, status, created_on) +VALUES (:username, :nickname, :password, :salt, :avatar, :status, :created_on) +RETURNING id; + +-------------------------------------------------------------------------------- +-- comment_manage sql dml +-------------------------------------------------------------------------------- + +-- name: create_comment@comment_manage +-- prepare: stmt +INSERT INTO @comment (post_id, user_id, ip, ip_loc, created_on) +VALUES (?, ?, ?, ?, ?) +RETURNING *; + +-- name: create_comment_content@comment_manage +-- prepare: stmt +INSERT INTO @comment_content (comment_id, user_id, content, type, sort, created_on) +VALUES (?, ?, ?, ?, ?, ?) +RETURNING *; + +-- name: create_comment_reply@comment_manage +-- prepare: stmt +INSERT INTO @comment_reply (comment_id, user_id, content, at_user_id, ip, ip_loc, created_on) +VALUES (?, ?, ?, ?, ?, ?, ?) +RETURNING *; + +-------------------------------------------------------------------------------- +-- contact_manager sql dml +-------------------------------------------------------------------------------- + +-- name: create_contact@contact_manager +-- prepare: stmt +INSERT INTO @contact (user_id, friend_id, status, created_on) VALUES (?, ?, ?, ?) +RETURNING *; + +-------------------------------------------------------------------------------- +-- message sql dml +-------------------------------------------------------------------------------- + +-- name: create_message@message +-- prepare: named_stmt +INSERT INTO @message (sender_user_id, receiver_user_id, type, brief, content, post_id, comment_id, reply_id, created_on) +VALUES (:sender_user_id, :receiver_user_id, :type, :brief, :content, :post_id, :comment_id, :reply_id, :created_on) +RETURNING id; + +-------------------------------------------------------------------------------- +-- wallet sql dml +-------------------------------------------------------------------------------- + +-- name: create_recharge@wallet +-- prepare: stmt +INSERT INTO @wallet_recharge (user_id, amount, created_on) VALUES (?, ?, ?) +RETURNING *;