You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.3 KiB
Go
117 lines
2.3 KiB
Go
package cache
|
|
|
|
import (
|
|
"context"
|
|
"joybuywork/internal/app"
|
|
"joybuywork/internal/plugins/jsonm"
|
|
"joybuywork/internal/repository/dao"
|
|
"joybuywork/internal/repository/dbcheck"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/utils"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type Reward struct {
|
|
Cache
|
|
}
|
|
|
|
func NewReward(ctx context.Context) *Reward {
|
|
c := new(Reward)
|
|
c.init(ctx, &model.Reward{})
|
|
|
|
return c
|
|
}
|
|
|
|
// FindByIds ids 获取数据
|
|
func (c Reward) FindByIds(ids []int64) ([]*model.Reward, error) {
|
|
|
|
var idm = make(map[int64]struct{})
|
|
var keys = make([]string, 0, len(ids))
|
|
for _, id := range ids {
|
|
if _, ok := idm[id]; !ok {
|
|
keys = append(keys, c.idKey(id))
|
|
idm[id] = struct{}{}
|
|
}
|
|
}
|
|
|
|
data, err := c.getKeys(keys, func(idKeys []string) (map[string][]byte, error) {
|
|
var fids = make([]int64, 0, len(idKeys))
|
|
var idMap = make(map[int64]string)
|
|
for _, idKey := range idKeys {
|
|
idStr, _ := strings.CutPrefix(idKey, c.Prefix()+":")
|
|
id := utils.StrToInt64(idStr)
|
|
fids = append(fids, id)
|
|
idMap[id] = idKey
|
|
}
|
|
|
|
m := dao.Q.Reward
|
|
list, err := m.WithContext(c.ctx).Where(m.ID.In(fids...)).Find()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var dataM = make(map[string][]byte, len(list))
|
|
for _, v := range list {
|
|
b, _ := jsonm.MarshalCkZero(v)
|
|
dataM[c.idKey(v.ID)] = b
|
|
}
|
|
|
|
return dataM, nil
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var list []*model.Reward
|
|
for _, v := range data {
|
|
var one *model.Reward
|
|
err = jsonm.Unmarshal(v, &one)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
list = append(list, one)
|
|
}
|
|
|
|
return list, nil
|
|
}
|
|
|
|
// FindById id 获取数据
|
|
func (c Reward) FindById(id int64) (*model.Reward, error) {
|
|
data, err := c.get(c.idKey(id), func() ([]byte, error) {
|
|
m := dao.Q.Reward
|
|
data, err := m.WithContext(c.ctx).Where(m.ID.Eq(id)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return jsonm.MarshalCkZero(data)
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var info *model.Reward
|
|
err = jsonm.Unmarshal(data, &info)
|
|
|
|
return info, err
|
|
}
|
|
|
|
func (c Reward) idKey(id int64) string {
|
|
return fmt.Sprintf("%s:%d", c.Prefix(), id)
|
|
}
|
|
|
|
// Clear 清理缓存
|
|
func (c Reward) Clear(rewards ...*model.Reward) error {
|
|
var key []string
|
|
for _, v := range rewards {
|
|
key = append(key, c.idKey(v.ID))
|
|
}
|
|
|
|
if len(key) > 0 {
|
|
return app.Redis.Cache.Del(c.ctx, key...).Err()
|
|
}
|
|
|
|
return nil
|
|
}
|