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.
76 lines
1.6 KiB
Go
76 lines
1.6 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/repository/withdefault"
|
|
"fmt"
|
|
)
|
|
|
|
type FissionChat struct {
|
|
Cache
|
|
}
|
|
|
|
func NewFissionChat(ctx context.Context) *FissionChat {
|
|
c := new(FissionChat)
|
|
c.init(ctx, &model.FissionChat{})
|
|
|
|
return c
|
|
}
|
|
|
|
// FindByUniq 获取数据
|
|
func (c FissionChat) FindByUniq(campaignId, userId int64) (*model.FissionChat, error) {
|
|
data, err := c.get(c.uniqKey(userId), func() ([]byte, error) {
|
|
m := dao.Q.FissionChat
|
|
data, err := m.WithContext(c.ctx).Where(m.UserID.Eq(userId), m.CancelTime.Eq(0)).Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return jsonm.MarshalCkZero(data)
|
|
}, WithNilSet(func() ([]byte, error) {
|
|
chat := withdefault.FissionChat(&model.FissionChat{
|
|
CampaignID: campaignId,
|
|
UserID: userId,
|
|
CancelTime: 0,
|
|
})
|
|
|
|
err := dao.Q.FissionChat.WithContext(c.ctx).Create(chat)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return jsonm.MarshalCkZero(chat)
|
|
}))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var conf *model.FissionChat
|
|
err = jsonm.Unmarshal(data, &conf)
|
|
|
|
return conf, err
|
|
}
|
|
|
|
func (c FissionChat) uniqKey(userId int64) string {
|
|
return fmt.Sprintf("%s:user_id:%d", c.Prefix(), userId)
|
|
}
|
|
|
|
// Clear 清理缓存
|
|
func (c FissionChat) Clear(vals ...*model.FissionChat) error {
|
|
var key []string
|
|
for _, v := range vals {
|
|
key = append(key, c.uniqKey(v.UserID))
|
|
}
|
|
|
|
if len(key) > 0 {
|
|
return app.Redis.Cache.Del(c.ctx, key...).Err()
|
|
}
|
|
|
|
return nil
|
|
}
|