123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- package dao
- import (
- "context"
- "database/sql"
- "fmt"
- "strconv"
- "strings"
- "time"
- "go-common/app/service/bbq/notice-service/api/v1"
- push "go-common/app/service/bbq/push/api/grpc/v1"
- "go-common/library/cache/redis"
- "go-common/library/log"
- )
- const (
- _queryUserPushDev = "select `reg_id`, `sdk`, `platform` from `user_push_device` where `mid` = ? and `state` = 0 order by `last_login_time` desc limit 1;"
- _queryUserName = "select `uname` from `user_base` where mid in %s;"
- )
- // PushNotice .
- func (d *Dao) PushNotice(c context.Context, req *push.NotificationRequest) (result []*push.PushResult, err error) {
- resp, err := d.pushClient.AsyncNotification(c, req)
- if err != nil {
- log.Errorv(c, log.KV("log", "push notification error"), log.KV("error", err))
- return
- }
- result = resp.Result
- for _, item := range result {
- if item.Error != nil {
- log.Errorv(c, log.KV("log", "push device notifiaction error"), log.KV("error", item.Error))
- }
- }
- return
- }
- // PushMessage .
- func (d *Dao) PushMessage(c context.Context, req *push.MessageRequest) (result []*push.PushResult, err error) {
- resp, err := d.pushClient.AsyncMessage(c, req)
- if err != nil {
- log.Errorv(c, log.KV("log", "push message error"), log.KV("error", err))
- return
- }
- result = resp.Result
- for _, item := range result {
- if item.Error != nil {
- log.Errorv(c, log.KV("log", "push device message error"), log.KV("error", item.Error))
- }
- }
- return nil, err
- }
- // FetchPushDev .
- func (d *Dao) FetchPushDev(c context.Context, mid int64) (result *push.Device, err error) {
- result = &push.Device{}
- err = d.db.QueryRow(c, _queryUserPushDev, mid).Scan(&result.RegisterID, &result.SDK, &result.Platform)
- if err == sql.ErrNoRows {
- err = nil
- log.Warnw(c, "log", "no row in push", "sql", _queryUserPushDev, "mid", mid)
- }
- return
- }
- // IncrDailyPushCount .
- func (d *Dao) IncrDailyPushCount(c context.Context, mid int64) (count int, err error) {
- dt := time.Now().Format("20060102")
- key := fmt.Sprintf("bbq:push:u:%d:%s:count", mid, dt)
- conn := d.redis.Get(c)
- defer conn.Close()
- count, err = redis.Int(conn.Do("INCR", key, 1))
- if err != nil {
- return
- }
- _, err = conn.Do("EXPIRE", 86400)
- return
- }
- // IncrHourPushAction .
- func (d *Dao) IncrHourPushAction(c context.Context, mid int64, noticeType int32, t int) (count int, err error) {
- dt := time.Now().Format("2006010215")
- key := fmt.Sprintf("bbq:push:u:%d:%s:action:%d", mid, dt, noticeType)
- conn := d.redis.Get(c)
- defer conn.Close()
- count, err = redis.Int(conn.Do("INCR", key))
- if err != nil {
- return
- }
- _, err = conn.Do("EXPIRE", t)
- return
- }
- // ClearHourPushAction .
- func (d *Dao) ClearHourPushAction(c context.Context, mid int64, noticeType int32) error {
- dt := time.Now().Format("2006010215")
- key := fmt.Sprintf("bbq:push:u:%d:%s:action:%d", mid, dt, noticeType)
- conn := d.redis.Get(c)
- defer conn.Close()
- _, err := conn.Do("DEL", key)
- return err
- }
- // SetPushActionMid .
- func (d *Dao) SetPushActionMid(c context.Context, mid int64, actionMid int64, noticeType int32) error {
- dt := time.Now().Format("2006010215")
- key := fmt.Sprintf("bbq:v1:push:u:%d:%s:action:%d", mid, dt, noticeType)
- conn := d.redis.Get(c)
- defer conn.Close()
- values, _ := redis.Values(conn.Do("HGETALL", key))
- if len(values) >= 4 {
- return nil
- }
- _, err := conn.Do("HMSET", key, actionMid, actionMid)
- return err
- }
- // GetPushActionMid .
- func (d *Dao) GetPushActionMid(c context.Context, mid int64, noticeType int32) ([]int64, error) {
- dt := time.Now().Format("2006010215")
- key := fmt.Sprintf("bbq:v1:push:u:%d:%s:action:%d", mid, dt, noticeType)
- conn := d.redis.Get(c)
- defer conn.Close()
- m, err := redis.Int64Map(conn.Do("HGETALL", key))
- if err != nil {
- return nil, err
- }
- result := make([]int64, 0)
- for _, v := range m {
- result = append(result, v)
- }
- return result, nil
- }
- // ClearPushActionMid .
- func (d *Dao) ClearPushActionMid(c context.Context, mid int64, noticeType int32) error {
- conn := d.redis.Get(c)
- defer conn.Close()
- dt := time.Now().Format("2006010215")
- key := fmt.Sprintf("bbq:v1:push:u:%d:%s:action:%d", mid, dt, noticeType)
- _, err := conn.Do("DEL", key)
- return err
- }
- // GetUserName .
- func (d *Dao) GetUserName(c context.Context, midList []int64, count int) (names []string, err error) {
- mids := []string{}
- list := midList
- if len(midList) > count {
- list = midList[:count]
- }
- for _, v := range list {
- mids = append(mids, strconv.Itoa(int(v)))
- }
- where := "(" + strings.Join(mids, ",") + ")"
- row, err := d.db.Query(c, fmt.Sprintf(_queryUserName, where))
- if err != nil {
- return
- }
- for row.Next() {
- n := ""
- err = row.Scan(&n)
- if err != nil {
- return
- }
- names = append(names, n)
- }
- return
- }
- // FetchUserPushDev .
- func (d *Dao) FetchUserPushDev(c context.Context, mid int64, buvid string) (result *v1.UserPushDev, err error) {
- querySQL := "select `id` from `user_push_device` where `mid` = ? and `buvid` = ?"
- row := d.db.QueryRow(c, querySQL, mid, buvid)
- result = &v1.UserPushDev{}
- row.Scan(&result.Id)
- return
- }
- // InsertUserPushDev .
- func (d *Dao) InsertUserPushDev(c context.Context, req *v1.UserPushDev) (int64, error) {
- _insertUserPushDev := "insert into `user_push_device` (`mid`, `reg_id`, `buvid`, `sdk`, `platform`) values (?, ?, ?, ?, ?);"
- result, err := d.db.Exec(c, _insertUserPushDev, req.Mid, req.RegisterId, req.Buvid, req.Sdk, req.Platform)
- if err != nil {
- return 0, err
- }
- return result.LastInsertId()
- }
- // UpdateUserPushDev .
- func (d *Dao) UpdateUserPushDev(c context.Context, req *v1.UserPushDev) (int64, error) {
- _updateUserPushDev := "update `user_push_device` set `reg_id`=?,`sdk`=?,`platform`=?,`state`=?,`last_login_time`=now() where `mid`=? and `buvid`=?"
- result, err := d.db.Exec(c, _updateUserPushDev, req.RegisterId, req.Sdk, req.Platform, req.State, req.Mid, req.Buvid)
- if err != nil {
- return 0, err
- }
- return result.RowsAffected()
- }
- // DeleteUserPushDev .
- func (d *Dao) DeleteUserPushDev(c context.Context, req *v1.UserPushDev) (int64, error) {
- _updateUserPushDev := "update `user_push_device` set `state`=1 where `mid`=? and `buvid`=?"
- result, err := d.db.Exec(c, _updateUserPushDev, req.Mid, req.Buvid)
- if err != nil {
- return 0, err
- }
- return result.RowsAffected()
- }
|