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.

147 lines
3.4 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"
"errors"
"fmt"
)
type FissionUser struct {
Cache
campaignId int64
}
func NewFissionUser(ctx context.Context, campaignId int64) *FissionUser {
c := new(FissionUser)
c.init(ctx, &model.FissionUser{})
c.campaignId = campaignId
return c
}
// FindByDeviceId 通过活动的设备id找数据
func (c FissionUser) FindByDeviceId(deviceId string) (*model.FissionUser, error) {
if deviceId == "" {
return nil, errors.New("params not empty")
}
key := c.IdxKey("campaign_id", c.campaignId, "device_id", deviceId)
id, err := c.getIdxInt64(key, func() ([]byte, error) {
m := dao.Q.FissionUser.SubTable(c.campaignId)
data, err := m.WithContext(c.ctx).Select(m.ID).Where(m.CampaignID.Eq(c.campaignId), m.DeviceID.Eq(deviceId)).Take()
if err = dbcheck.DbError(err); err != nil {
return nil, err
}
if data == nil {
return nil, nil
}
return jsonm.MarshalCkZero(data.ID)
})
if err != nil || id == 0 {
return nil, err
}
return c.FindById(id)
}
// FindBySubUserId 通过活动的关注用户id找数据
func (c FissionUser) FindBySubUserId(subUserId string) (*model.FissionUser, error) {
if subUserId == "" {
return nil, errors.New("params not empty")
}
key := c.IdxKey("campaign_id", c.campaignId, "sub_user_id", subUserId)
id, err := c.getIdxInt64(key, func() ([]byte, error) {
m := dao.Q.FissionUser.SubTable(c.campaignId)
data, err := m.WithContext(c.ctx).Select(m.ID).Where(m.CampaignID.Eq(c.campaignId), m.SubUserID.Eq(subUserId)).Take()
if err = dbcheck.DbError(err); err != nil {
return nil, err
}
if data == nil {
return nil, nil
}
return jsonm.MarshalCkZero(data.ID)
})
if err != nil || id == 0 {
return nil, err
}
return c.FindById(id)
}
// FindById pk 获取数据
func (c FissionUser) FindById(id int64) (*model.FissionUser, error) {
data, err := c.get(c.pkKey(id), func() ([]byte, error) {
m := dao.Q.FissionUser.SubTable(c.campaignId)
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 user *model.FissionUser
err = jsonm.Unmarshal(data, &user)
return user, err
}
// FindByHashId hash_id 获取数据
func (c FissionUser) FindByHashId(hashId string) (*model.FissionUser, error) {
data, err := c.get(c.hashKey(hashId), func() ([]byte, error) {
m := dao.Q.FissionUser.SubTable(c.campaignId)
data, err := m.WithContext(c.ctx).Where(m.HashID.Eq(hashId)).Take()
if err = dbcheck.DbError(err); err != nil {
return nil, err
}
return jsonm.MarshalCkZero(data)
})
if err != nil {
return nil, err
}
var user *model.FissionUser
err = jsonm.Unmarshal(data, &user)
return user, err
}
func (c FissionUser) pkKey(id int64) string {
return fmt.Sprintf("%s:%d", c.Prefix(), id)
}
func (c FissionUser) hashKey(hashId string) string {
return fmt.Sprintf("%s:hash_id_%s", c.Prefix(), hashId)
}
// Clear 清理缓存
func (c FissionUser) Clear(vals ...*model.FissionUser) error {
var key []string
for _, v := range vals {
key = append(key, c.pkKey(v.ID), c.hashKey(v.HashID))
}
if len(key) > 0 {
return app.Redis.Cache.Del(c.ctx, key...).Err()
}
return nil
}