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.
273 lines
6.5 KiB
273 lines
6.5 KiB
package medal |
|
|
|
import ( |
|
"context" |
|
"strconv" |
|
|
|
"github.com/pkg/errors" |
|
|
|
"go-common/app/service/main/usersuit/model" |
|
gmc "go-common/library/cache/memcache" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_prefixActivatedNid = "usma:" // key of activated medal nid |
|
_prefixOwners = "umos:" // key of owners info |
|
_prefixRedPoint = "usrp:" // key of red point |
|
_prefixPopup = "uspp:" // key of new medal popup |
|
) |
|
|
|
// medalactivated medal nid key. |
|
func activatedNidKey(mid int64) string { |
|
return _prefixActivatedNid + strconv.FormatInt(mid, 10) |
|
} |
|
|
|
// ownersKey medal_owner key. |
|
func ownersKey(mid int64) string { |
|
return _prefixOwners + strconv.FormatInt(mid, 10) |
|
} |
|
|
|
//RedPointKey new medal RedPoint key. |
|
func RedPointKey(mid int64) string { |
|
return _prefixRedPoint + strconv.FormatInt(mid, 10) |
|
} |
|
|
|
// PopupKey new medal popup key. |
|
func PopupKey(mid int64) string { |
|
return _prefixPopup + strconv.FormatInt(mid, 10) |
|
} |
|
|
|
func (d *Dao) pingMC(c context.Context) (err error) { |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
if err = conn.Set(&gmc.Item{Key: "ping", Value: []byte{1}, Expiration: d.mcExpire}); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// MedalOwnersCache get medal_owner cache. |
|
func (d *Dao) MedalOwnersCache(c context.Context, mid int64) (res []*model.MedalOwner, notFound bool, err error) { |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
item, err := conn.Get(ownersKey(mid)) |
|
if err != nil { |
|
if err == gmc.ErrNotFound { |
|
res = nil |
|
err = nil |
|
notFound = true |
|
return |
|
} |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
res = make([]*model.MedalOwner, 0) |
|
if err = conn.Scan(item, &res); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// SetMedalOwnersache set medal_owner cache. |
|
func (d *Dao) SetMedalOwnersache(c context.Context, mid int64, nos []*model.MedalOwner) (err error) { |
|
key := ownersKey(mid) |
|
item := &gmc.Item{Key: key, Object: nos, Expiration: d.mcExpire, Flags: gmc.FlagJSON} |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
if err = conn.Set(item); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// DelMedalOwnersCache delete medal_owner cache. |
|
func (d *Dao) DelMedalOwnersCache(c context.Context, mid int64) (err error) { |
|
key := ownersKey(mid) |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
if err = conn.Delete(key); err != nil { |
|
if err == gmc.ErrNotFound { |
|
err = nil |
|
} else { |
|
err = errors.WithStack(err) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// MedalsActivatedCache multi get user activated medal nid from memcache. |
|
func (d *Dao) medalsActivatedCache(c context.Context, mids []int64) (nids map[int64]int64, missed []int64, err error) { |
|
nids = make(map[int64]int64, len(mids)) |
|
keys := make([]string, len(mids)) |
|
mm := make(map[string]int64, len(mids)) |
|
for i, mid := range mids { |
|
var key = activatedNidKey(mid) |
|
keys[i] = key |
|
mm[key] = mid |
|
} |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
items, err := conn.GetMulti(keys) |
|
if err != nil { |
|
if err == gmc.ErrNotFound { |
|
err = nil |
|
} |
|
return |
|
} |
|
for _, item := range items { |
|
var nid int64 |
|
if err = conn.Scan(item, &nid); err != nil { |
|
log.Error("conn.Scan(%s) error(%v)", item.Value, err) |
|
continue |
|
} |
|
nids[mm[item.Key]] = nid |
|
delete(mm, item.Key) |
|
} |
|
missed = make([]int64, 0, len(mm)) |
|
for _, m := range mm { |
|
missed = append(missed, m) |
|
} |
|
return |
|
} |
|
|
|
// MedalActivatedCache get user activated medal nid. |
|
func (d *Dao) medalActivatedCache(c context.Context, mid int64) (nid int64, notFound bool, err error) { |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
item, err := conn.Get(activatedNidKey(mid)) |
|
if err != nil { |
|
if err == gmc.ErrNotFound { |
|
nid = 0 |
|
err = nil |
|
notFound = true |
|
return |
|
} |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
if err = conn.Scan(item, &nid); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// SetMedalActivatedCache set activated medal cache. |
|
func (d *Dao) SetMedalActivatedCache(c context.Context, mid, nid int64) (err error) { |
|
key := activatedNidKey(mid) |
|
item := &gmc.Item{Key: key, Object: nid, Expiration: d.mcExpire, Flags: gmc.FlagJSON} |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
if err = conn.Set(item); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// DelMedalActivatedCache delete activated medal cache. |
|
func (d *Dao) DelMedalActivatedCache(c context.Context, mid int64) (err error) { |
|
key := activatedNidKey(mid) |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
if err = conn.Delete(key); err != nil { |
|
if err == gmc.ErrNotFound { |
|
err = nil |
|
} else { |
|
err = errors.WithStack(err) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// PopupCache get new medal info popup cache. |
|
func (d *Dao) PopupCache(c context.Context, mid int64) (nid int64, err error) { |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
item, err := conn.Get(PopupKey(mid)) |
|
if err != nil { |
|
if err == gmc.ErrNotFound { |
|
nid = 0 |
|
err = nil |
|
return |
|
} |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
if err = conn.Scan(item, &nid); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// SetPopupCache set popup cache. |
|
func (d *Dao) SetPopupCache(c context.Context, mid, nid int64) (err error) { |
|
key := PopupKey(mid) |
|
item := &gmc.Item{Key: key, Object: nid, Expiration: d.pointExpire, Flags: gmc.FlagJSON} |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
if err = conn.Set(item); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// DelPopupCache delete new medal info popup cache. |
|
func (d *Dao) DelPopupCache(c context.Context, mid int64) (err error) { |
|
key := PopupKey(mid) |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
if err = conn.Delete(key); err != nil { |
|
if err == gmc.ErrNotFound { |
|
err = nil |
|
} else { |
|
err = errors.WithStack(err) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// RedPointCache get new medal info red point cache. |
|
func (d *Dao) RedPointCache(c context.Context, mid int64) (nid int64, err error) { |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
item, err := conn.Get(RedPointKey(mid)) |
|
if err != nil { |
|
if err == gmc.ErrNotFound { |
|
err = nil |
|
return |
|
} |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
if err = conn.Scan(item, &nid); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// SetRedPointCache set red point cache. |
|
func (d *Dao) SetRedPointCache(c context.Context, mid, nid int64) (err error) { |
|
key := RedPointKey(mid) |
|
item := &gmc.Item{Key: key, Object: nid, Expiration: d.pointExpire, Flags: gmc.FlagJSON} |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
if err = conn.Set(item); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// DelRedPointCache delete new medal info red point cache. |
|
func (d *Dao) DelRedPointCache(c context.Context, mid int64) (err error) { |
|
key := RedPointKey(mid) |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
if err = conn.Delete(key); err != nil { |
|
if err == gmc.ErrNotFound { |
|
err = nil |
|
} else { |
|
err = errors.WithStack(err) |
|
} |
|
} |
|
return |
|
}
|
|
|