user_like.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package dao
  2. import (
  3. "context"
  4. xsql "database/sql"
  5. "encoding/json"
  6. "fmt"
  7. "go-common/app/service/bbq/user/api"
  8. "go-common/app/service/bbq/user/internal/model"
  9. "go-common/library/database/sql"
  10. "go-common/library/log"
  11. "go-common/library/time"
  12. "go-common/library/xstr"
  13. )
  14. //常量
  15. const (
  16. _addUserLike = "insert into %s (`mid`, `opid`) values (?,?) on duplicate key update state=0"
  17. _cancelUserLike = "update %s set state = 1 where mid=? and opid=?"
  18. _selectUserLike = "select opid from user_like_%02d where mid = ? and state = 0 and opid in (%s)"
  19. _spaceUserLike = "select opid, mtime from user_like_%02d where mid=%d and state=0 and mtime %s ? order by mtime %s, opid %s limit %d"
  20. )
  21. //TxAddUserLike .
  22. func (d *Dao) TxAddUserLike(tx *sql.Tx, mid, svid int64) (num int64, err error) {
  23. var res xsql.Result
  24. if res, err = tx.Exec(d.userLikeSQL(mid, _addUserLike), mid, svid); err != nil {
  25. return
  26. }
  27. return res.RowsAffected()
  28. }
  29. //TxCancelUserLike .
  30. func (d *Dao) TxCancelUserLike(tx *sql.Tx, mid, svid int64) (num int64, err error) {
  31. var res xsql.Result
  32. if res, err = tx.Exec(d.userLikeSQL(mid, _cancelUserLike), mid, svid); err != nil {
  33. return
  34. }
  35. return res.RowsAffected()
  36. }
  37. // CheckUserLike 检测用户是否点赞
  38. func (d *Dao) CheckUserLike(c context.Context, mid int64, svids []int64) (res []int64, err error) {
  39. log.V(1).Info("user like mid(%d) svids(%v)", mid, svids)
  40. ls := len(svids)
  41. if ls == 0 || mid == 0 {
  42. return
  43. }
  44. idStr := xstr.JoinInts(svids)
  45. querySQL := fmt.Sprintf(_selectUserLike, d.getTableIndex(mid), idStr)
  46. rows, err := d.db.Query(c, querySQL, mid)
  47. log.V(1).Infov(c, log.KV("log", fmt.Sprintf("user like rows(%v) err(%v)", rows, err)))
  48. if err != nil {
  49. if err == sql.ErrNoRows {
  50. err = nil
  51. }
  52. return
  53. }
  54. for rows.Next() {
  55. opid := int64(0)
  56. rows.Scan(&opid)
  57. res = append(res, opid)
  58. }
  59. log.V(1).Infov(c, log.KV("log", fmt.Sprintf("user like res(%v)", res)))
  60. return
  61. }
  62. // GetUserLikeList 返回用户点赞列表
  63. // 当前cursorID表示opid
  64. func (d *Dao) GetUserLikeList(c context.Context, mid int64, cursorNext bool, cursor model.CursorValue, size int) (
  65. likeSvs []*api.LikeSv, err error) {
  66. compareSymbol := string(">=")
  67. orderDirection := "asc"
  68. if cursorNext {
  69. compareSymbol = "<="
  70. orderDirection = "desc"
  71. }
  72. querySQL := fmt.Sprintf(_spaceUserLike, d.getTableIndex(mid), mid, compareSymbol, orderDirection, orderDirection, size)
  73. log.V(1).Infov(c, log.KV("like_list_sql", querySQL))
  74. rows, err := d.db.Query(c, querySQL, cursor.CursorTime)
  75. if err != nil {
  76. log.Errorv(c, log.KV("event", "mysql_select"), log.KV("table", "user_like"),
  77. log.KV("mid", mid), log.KV("sql", querySQL))
  78. return
  79. }
  80. defer rows.Close()
  81. var svID int64
  82. var curMtime time.Time
  83. conflict := bool(true)
  84. for rows.Next() {
  85. if err = rows.Scan(&svID, &curMtime); err != nil {
  86. log.Errorv(c, log.KV("event", "mysql_scan"), log.KV("table", "user_like"),
  87. log.KV("sql", querySQL))
  88. return
  89. }
  90. // 为了解决同一个mtime的冲突问题
  91. if curMtime == cursor.CursorTime && conflict {
  92. if svID == cursor.CursorID {
  93. conflict = false
  94. }
  95. continue
  96. }
  97. cursorValue := model.CursorValue{CursorID: svID, CursorTime: curMtime}
  98. jsonStr, _ := json.Marshal(cursorValue) // marshal的时候相信库函数,不做err判断
  99. likeSvs = append(likeSvs, &api.LikeSv{Svid: svID, CursorValue: string(jsonStr)})
  100. }
  101. log.Infov(c, log.KV("event", "mysql_select"), log.KV("table", "user_like"),
  102. log.KV("mid", mid), log.KV("id", cursor.CursorID), log.KV("size", len(likeSvs)))
  103. return
  104. }