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 }