You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
3.9 KiB
172 lines
3.9 KiB
package dao |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"fmt" |
|
"strconv" |
|
"time" |
|
|
|
model "go-common/app/interface/main/credit/model" |
|
"go-common/library/cache/redis" |
|
"go-common/library/log" |
|
|
|
"github.com/pkg/errors" |
|
) |
|
|
|
const ( |
|
_caseObtainMIDIdx = "c_o_v2_%d" |
|
_caseVoteCIDMIDIdx = "c_v_c_m_v2_%d_%s" |
|
_grantCaseKey = "gr_ca_li_v2" |
|
) |
|
|
|
func caseObtainMIDKey(mid int64) string { |
|
return fmt.Sprintf(_caseObtainMIDIdx, mid) |
|
} |
|
|
|
func caseVoteCIDMIDKey(mid int64) string { |
|
return fmt.Sprintf(_caseVoteCIDMIDIdx, mid, time.Now().Format("2006_01_02")) |
|
} |
|
|
|
// CaseObtainMID get voted cids by MID. |
|
func (d *Dao) CaseObtainMID(c context.Context, mid int64, isToday bool) (cases map[int64]*model.SimCase, err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
var _setKey string |
|
if isToday { |
|
_setKey = caseVoteCIDMIDKey(mid) |
|
} else { |
|
_setKey = caseObtainMIDKey(mid) |
|
} |
|
var ms []string |
|
if ms, err = redis.Strings(conn.Do("SMEMBERS", _setKey)); err != nil { |
|
if err != redis.ErrNil { |
|
return |
|
} |
|
err = nil |
|
} |
|
cases = make(map[int64]*model.SimCase) |
|
for _, s := range ms { |
|
if s == "" { |
|
continue |
|
} |
|
sc := &model.SimCase{} |
|
if err = json.Unmarshal([]byte(s), sc); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
cases[sc.ID] = sc |
|
} |
|
return |
|
} |
|
|
|
// IsExpiredObtainMID voted cids by MID of key is expired. |
|
func (d *Dao) IsExpiredObtainMID(c context.Context, mid int64, isToday bool) (ok bool, err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
var _setKey string |
|
if isToday { |
|
_setKey = caseVoteCIDMIDKey(mid) |
|
} else { |
|
_setKey = caseObtainMIDKey(mid) |
|
} |
|
ok, err = redis.Bool(conn.Do("EXPIRE", _setKey, d.redisExpire)) |
|
return |
|
} |
|
|
|
// GrantCases get granting case cids. |
|
func (d *Dao) GrantCases(c context.Context) (mcases map[int64]*model.SimCase, err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
var ms map[string]string |
|
if ms, err = redis.StringMap(conn.Do("HGETALL", _grantCaseKey)); err != nil { |
|
if err != redis.ErrNil { |
|
return |
|
} |
|
err = nil |
|
} |
|
mcases = make(map[int64]*model.SimCase) |
|
for m, s := range ms { |
|
if s == "" { |
|
continue |
|
} |
|
cid, err := strconv.ParseInt(m, 10, 64) |
|
if err != nil { |
|
log.Error("strconv.ParseInt(%s) error(%v)", m, err) |
|
err = nil |
|
continue |
|
} |
|
cc := &model.SimCase{} |
|
if err = json.Unmarshal([]byte(s), cc); err != nil { |
|
log.Error("json.Unmarshal(%s) error(%v)", s, err) |
|
err = nil |
|
continue |
|
} |
|
mcases[cid] = cc |
|
} |
|
return |
|
} |
|
|
|
// LoadVoteCaseMID load mid vote cases. |
|
func (d *Dao) LoadVoteCaseMID(c context.Context, mid int64, mcases map[int64]*model.SimCase, isToday bool) (err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
var _setKey string |
|
if isToday { |
|
_setKey = caseVoteCIDMIDKey(mid) |
|
} else { |
|
_setKey = caseObtainMIDKey(mid) |
|
} |
|
args := redis.Args{}.Add(_setKey) |
|
for _, mcase := range mcases { |
|
var mcStr []byte |
|
if mcStr, err = json.Marshal(mcase); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
args = args.Add(string(mcStr)) |
|
} |
|
if err = conn.Send("SADD", args...); err != nil { |
|
return |
|
} |
|
if err = conn.Send("EXPIRE", _setKey, d.redisExpire); err != nil { |
|
return |
|
} |
|
if err = conn.Flush(); err != nil { |
|
return |
|
} |
|
for i := 0; i < 2; i++ { |
|
_, err = conn.Receive() |
|
} |
|
return |
|
} |
|
|
|
// SetVoteCaseMID set vote case by mid on today. |
|
func (d *Dao) SetVoteCaseMID(c context.Context, mid int64, sc *model.SimCase) (err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
var scStr []byte |
|
if scStr, err = json.Marshal(sc); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
if err = conn.Send("SADD", caseObtainMIDKey(mid), string(scStr)); err != nil { |
|
return |
|
} |
|
if err = conn.Send("SADD", caseVoteCIDMIDKey(mid), string(scStr)); err != nil { |
|
return |
|
} |
|
if err = conn.Send("EXPIRE", caseObtainMIDKey(mid), d.redisExpire); err != nil { |
|
return |
|
} |
|
if err = conn.Send("EXPIRE", caseVoteCIDMIDKey(mid), d.redisExpire); err != nil { |
|
return |
|
} |
|
if err = conn.Flush(); err != nil { |
|
return |
|
} |
|
for i := 0; i < 4; i++ { |
|
_, err = conn.Receive() |
|
} |
|
return |
|
}
|
|
|