user_follow.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package dao
  2. import (
  3. "context"
  4. xsql "database/sql"
  5. "go-common/library/database/sql"
  6. "go-common/library/log"
  7. "go-common/library/time"
  8. "go-common/app/service/bbq/user/internal/model"
  9. )
  10. const (
  11. _addUserFollow = "insert into %s (`mid`,`followed_mid`)values(?,?) on duplicate key update state=0"
  12. _cancelUserFollow = "update %s set state=1 where mid=? and followed_mid=?"
  13. _getUserFollows = "select followed_mid from %s where mid = ? and state=0"
  14. _getUserPartFollows = "select followed_mid, mtime from user_follow_%02d where mid=? and state=0 and mtime<=? order by mtime desc, followed_mid desc limit %d"
  15. _isFollow = "select followed_mid from user_follow_%02d where mid=? and state=0 and followed_mid in (%s)"
  16. )
  17. //TxAddUserFollow .
  18. func (d *Dao) TxAddUserFollow(c context.Context, tx *sql.Tx, mid, upMid int64) (num int64, err error) {
  19. var res xsql.Result
  20. if res, err = tx.Exec(d.userFollowSQL(mid, _addUserFollow), mid, upMid); err != nil {
  21. log.Errorv(c, log.KV("event", "user_follow"), log.KV("err", err), log.KV("mid", mid), log.KV("up_mid", upMid))
  22. return
  23. }
  24. return res.RowsAffected()
  25. }
  26. //TxCancelUserFollow .
  27. func (d *Dao) TxCancelUserFollow(c context.Context, tx *sql.Tx, mid, upMid int64) (num int64, err error) {
  28. var res xsql.Result
  29. if res, err = tx.Exec(d.userFollowSQL(mid, _cancelUserFollow), mid, upMid); err != nil {
  30. log.Errorv(c, log.KV("event", "cancel_user_follow"), log.KV("err", err), log.KV("mid", mid), log.KV("up_mid", upMid))
  31. return
  32. }
  33. return res.RowsAffected()
  34. }
  35. // FetchFollowList 获取mid的所有关注up主
  36. func (d *Dao) FetchFollowList(c context.Context, mid int64) (upMid []int64, err error) {
  37. querySQL := d.userFollowSQL(mid, _getUserFollows)
  38. rows, err := d.db.Query(c, querySQL, mid)
  39. if err != nil {
  40. log.Errorv(c, log.KV("event", "mysql_select"), log.KV("table", "user_follow"))
  41. return
  42. }
  43. defer rows.Close()
  44. for rows.Next() {
  45. var m int64
  46. if err = rows.Scan(&m); err != nil {
  47. log.Errorv(c, log.KV("event", "mysql_scan"), log.KV("table", "user_follow"))
  48. return
  49. }
  50. upMid = append(upMid, m)
  51. }
  52. log.Infov(c, log.KV("event", "mysql_select"), log.KV("table", "user_follow"),
  53. log.KV("mid", mid), log.KV("follow_num", len(upMid)))
  54. return
  55. }
  56. // FetchPartFollowList 获取mid的关注up主
  57. // cursor_id代表相应的up_mid,cursor_time表示mtime
  58. func (d *Dao) FetchPartFollowList(c context.Context, mid int64, cursor model.CursorValue, size int) (
  59. MID2IDMap map[int64]time.Time, followedMIDs []int64, err error) {
  60. MID2IDMap, followedMIDs, err = d.fetchPartRelationUserList(c, mid, cursor, _getUserPartFollows)
  61. return
  62. }
  63. // IsFollow 获取mid的关注up主
  64. func (d *Dao) IsFollow(c context.Context, mid int64, candidateMIDs []int64) (MIDMap map[int64]bool) {
  65. if len(candidateMIDs) == 0 {
  66. return
  67. }
  68. MIDMap = d.isMidIn(c, mid, candidateMIDs, _isFollow)
  69. return
  70. }