Files
open-im-server/pkg/common/db/cache/notification.go
T

516 lines
21 KiB
Go
Raw Normal View History

2023-01-16 20:14:26 +08:00
package cache
2022-06-06 18:15:32 +08:00
import (
"context"
"errors"
"fmt"
2023-03-23 19:02:20 +08:00
"strconv"
"time"
2023-05-04 16:00:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
2023-03-24 11:29:39 +08:00
"github.com/gogo/protobuf/jsonpb"
"google.golang.org/protobuf/proto"
2022-08-18 11:14:38 +08:00
2023-01-29 11:37:11 +08:00
"github.com/go-redis/redis/v8"
2022-06-06 18:15:32 +08:00
)
2022-07-20 10:18:43 +08:00
2022-06-23 10:18:44 +08:00
const (
2023-05-04 15:46:22 +08:00
NotificationUserIncrSeq = "NOTIFICATION_REDIS_USER_INCR_SEQ:" // user incr seq
NotificationUserMinSeq = "NOTIFICATION_REDIS_USER_MIN_SEQ:"
NotificationGetuiToken = "NOTIFICATION_GETUI_TOKEN"
NotificationGetuiTaskID = "NOTIFICATION_GETUI_TASK_ID"
NotificationMessageCache = "NOTIFICATION_MESSAGE_CACHE:"
NotificationSignalCache = "NOTIFICATION_SIGNAL_CACHE:"
NotificationSignalListCache = "NOTIFICATION_SIGNAL_LIST_CACHE:"
NotificationFcmToken = "NOTIFICATION_FCM_TOKEN:"
NotificationGroupUserMinSeq = "NOTIFICATION_GROUP_USER_MIN_SEQ:"
NotificationGroupMaxSeq = "NOTIFICATION_GROUP_MAX_SEQ:"
NotificationGroupMinSeq = "NOTIFICATION_GROUP_MIN_SEQ:"
NotificationSendMsgFailedFlag = "NOTIFICATION_SEND_MSG_FAILED_FLAG:"
NotificationUserBadgeUnreadCountSum = "NOTIFICATION_USER_BADGE_UNREAD_COUNT_SUM:"
NotificationExTypeKeyLocker = "NOTIFICATION_EX_LOCK:"
NotificationUidPidToken = "NOTIFICATION_UID_PID_TOKEN_STATUS:"
2022-06-23 10:18:44 +08:00
)
2023-05-04 12:11:29 +08:00
type NotificationModel interface {
2023-02-16 15:20:59 +08:00
IncrUserSeq(ctx context.Context, userID string) (int64, error)
GetUserMaxSeq(ctx context.Context, userID string) (int64, error)
SetUserMaxSeq(ctx context.Context, userID string, maxSeq int64) error
SetUserMinSeq(ctx context.Context, userID string, minSeq int64) (err error)
GetUserMinSeq(ctx context.Context, userID string) (int64, error)
SetGroupUserMinSeq(ctx context.Context, groupID, userID string, minSeq int64) (err error)
GetGroupUserMinSeq(ctx context.Context, groupID, userID string) (int64, error)
GetGroupMaxSeq(ctx context.Context, groupID string) (int64, error)
2023-02-24 11:01:33 +08:00
GetGroupMinSeq(ctx context.Context, groupID string) (int64, error)
2023-02-16 15:20:59 +08:00
IncrGroupMaxSeq(ctx context.Context, groupID string) (int64, error)
SetGroupMaxSeq(ctx context.Context, groupID string, maxSeq int64) error
SetGroupMinSeq(ctx context.Context, groupID string, minSeq int64) error
2023-02-15 15:52:32 +08:00
AddTokenFlag(ctx context.Context, userID string, platformID int, token string, flag int) error
2023-02-20 17:13:15 +08:00
GetTokensWithoutError(ctx context.Context, userID, platformID string) (map[string]int, error)
2023-03-01 15:32:26 +08:00
SetTokenMapByUidPid(ctx context.Context, userID string, platform string, m map[string]int) error
DeleteTokenByUidPid(ctx context.Context, userID string, platform string, fields []string) error
2023-02-23 19:20:58 +08:00
GetMessagesBySeq(ctx context.Context, userID string, seqList []int64) (seqMsg []*sdkws.MsgData, failedSeqList []int64, err error)
2023-04-28 18:39:21 +08:00
SetMessageToCache(ctx context.Context, userID string, msgList []*sdkws.MsgData) (int, error)
DeleteMessageFromCache(ctx context.Context, userID string, msgList []*sdkws.MsgData) error
2023-02-15 17:00:43 +08:00
CleanUpOneUserAllMsg(ctx context.Context, userID string) error
2023-03-02 12:00:31 +08:00
HandleSignalInvite(ctx context.Context, msg *sdkws.MsgData, pushToUserID string) (isSend bool, err error)
2023-03-01 15:32:26 +08:00
GetSignalInvitationInfoByClientMsgID(ctx context.Context, clientMsgID string) (invitationInfo *sdkws.SignalInviteReq, err error)
GetAvailableSignalInvitationInfo(ctx context.Context, userID string) (invitationInfo *sdkws.SignalInviteReq, err error)
2023-02-15 15:52:32 +08:00
DelUserSignalList(ctx context.Context, userID string) error
2023-02-16 15:20:59 +08:00
DelMsgFromCache(ctx context.Context, userID string, seqList []int64) error
2023-02-15 15:52:32 +08:00
SetGetuiToken(ctx context.Context, token string, expireTime int64) error
GetGetuiToken(ctx context.Context) (string, error)
SetGetuiTaskID(ctx context.Context, taskID string, expireTime int64) error
GetGetuiTaskID(ctx context.Context) (string, error)
2023-02-24 11:01:33 +08:00
SetSendMsgStatus(ctx context.Context, id string, status int32) error
GetSendMsgStatus(ctx context.Context, id string) (int32, error)
2023-02-15 15:52:32 +08:00
SetFcmToken(ctx context.Context, account string, platformID int, fcmToken string, expireTime int64) (err error)
GetFcmToken(ctx context.Context, account string, platformID int) (string, error)
DelFcmToken(ctx context.Context, account string, platformID int) error
IncrUserBadgeUnreadCountSum(ctx context.Context, userID string) (int, error)
SetUserBadgeUnreadCountSum(ctx context.Context, userID string, value int) error
GetUserBadgeUnreadCountSum(ctx context.Context, userID string) (int, error)
2023-03-03 17:42:26 +08:00
JudgeMessageReactionExist(ctx context.Context, clientMsgID string, sessionType int32) (bool, error)
2023-02-15 15:52:32 +08:00
GetOneMessageAllReactionList(ctx context.Context, clientMsgID string, sessionType int32) (map[string]string, error)
DeleteOneMessageKey(ctx context.Context, clientMsgID string, sessionType int32, subKey string) error
SetMessageReactionExpire(ctx context.Context, clientMsgID string, sessionType int32, expiration time.Duration) (bool, error)
GetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey string) (string, error)
SetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey, value string) error
LockMessageTypeKey(ctx context.Context, clientMsgID string, TypeKey string) error
UnLockMessageTypeKey(ctx context.Context, clientMsgID string, TypeKey string) error
2023-02-09 14:40:49 +08:00
}
2023-05-04 12:11:29 +08:00
func NewNotificationCacheModel(client redis.UniversalClient) NotificationModel {
return &notificationCache{rdb: client}
2023-01-16 20:14:26 +08:00
}
2023-05-04 12:11:29 +08:00
type notificationCache struct {
2023-02-14 16:33:18 +08:00
rdb redis.UniversalClient
2023-01-16 20:14:26 +08:00
}
2023-03-13 17:57:52 +08:00
// 兼容老版本调用
2023-05-04 12:11:29 +08:00
func (c *notificationCache) DelKeys() {
2023-03-13 17:57:52 +08:00
for _, key := range []string{"GROUP_CACHE:", "FRIEND_RELATION_CACHE:", "BLACK_LIST_CACHE:", "USER_INFO_CACHE:", "GROUP_INFO_CACHE:", "JOINED_GROUP_LIST_CACHE:",
"GROUP_MEMBER_INFO_CACHE:", "GROUP_ALL_MEMBER_INFO_CACHE:", "ALL_FRIEND_INFO_CACHE:"} {
fName := utils.GetSelfFuncName()
var cursor uint64
var n int
for {
var keys []string
var err error
keys, cursor, err = c.rdb.Scan(context.Background(), cursor, key+"*", scanCount).Result()
if err != nil {
panic(err.Error())
}
n += len(keys)
// for each for redis cluster
for _, key := range keys {
if err = c.rdb.Del(context.Background(), key).Err(); err != nil {
log.NewError("", fName, key, err.Error())
err = c.rdb.Del(context.Background(), key).Err()
if err != nil {
panic(err.Error())
}
}
}
if cursor == 0 {
break
}
}
}
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) IncrUserSeq(ctx context.Context, userID string) (int64, error) {
return utils.Wrap2(c.rdb.Get(ctx, NotificationUserIncrSeq+userID).Int64())
2023-01-17 16:36:34 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetUserMaxSeq(ctx context.Context, userID string) (int64, error) {
return utils.Wrap2(c.rdb.Get(ctx, NotificationUserIncrSeq+userID).Int64())
2023-02-20 10:49:39 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetUserMaxSeq(ctx context.Context, userID string, maxSeq int64) error {
return errs.Wrap(c.rdb.Set(ctx, NotificationUserIncrSeq+userID, maxSeq, 0).Err())
2022-06-15 16:33:30 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetUserMinSeq(ctx context.Context, userID string, minSeq int64) (err error) {
return errs.Wrap(c.rdb.Set(ctx, NotificationUserMinSeq+userID, minSeq, 0).Err())
2022-06-15 16:33:30 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetUserMinSeq(ctx context.Context, userID string) (int64, error) {
return utils.Wrap2(c.rdb.Get(ctx, NotificationUserMinSeq+userID).Int64())
2022-06-15 16:33:30 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetGroupUserMinSeq(ctx context.Context, groupID, userID string, minSeq int64) (err error) {
key := NotificationGroupUserMinSeq + "g:" + groupID + "u:" + userID
2023-04-28 18:39:21 +08:00
return errs.Wrap(c.rdb.Set(ctx, key, minSeq, 0).Err())
2022-06-15 16:33:30 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetGroupUserMinSeq(ctx context.Context, groupID, userID string) (int64, error) {
key := NotificationGroupUserMinSeq + "g:" + groupID + "u:" + userID
2023-03-01 15:32:26 +08:00
return utils.Wrap2(c.rdb.Get(ctx, key).Int64())
2022-06-15 16:33:30 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetGroupMaxSeq(ctx context.Context, groupID string) (int64, error) {
return utils.Wrap2(c.rdb.Get(ctx, NotificationGroupMaxSeq+groupID).Int64())
2022-07-20 10:18:43 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetGroupMinSeq(ctx context.Context, groupID string) (int64, error) {
return utils.Wrap2(c.rdb.Get(ctx, NotificationGroupMinSeq+groupID).Int64())
2022-07-22 16:55:29 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) IncrGroupMaxSeq(ctx context.Context, groupID string) (int64, error) {
key := NotificationGroupMaxSeq + groupID
2023-03-01 15:32:26 +08:00
seq, err := c.rdb.Incr(ctx, key).Uint64()
2023-04-28 18:39:21 +08:00
return int64(seq), errs.Wrap(err)
2022-07-22 16:55:29 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetGroupMaxSeq(ctx context.Context, groupID string, maxSeq int64) error {
key := NotificationGroupMaxSeq + groupID
2023-04-28 18:39:21 +08:00
return errs.Wrap(c.rdb.Set(ctx, key, maxSeq, 0).Err())
2022-07-22 16:55:29 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetGroupMinSeq(ctx context.Context, groupID string, minSeq int64) error {
key := NotificationGroupMinSeq + groupID
2023-04-28 18:39:21 +08:00
return errs.Wrap(c.rdb.Set(ctx, key, minSeq, 0).Err())
2022-08-04 17:20:33 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) AddTokenFlag(ctx context.Context, userID string, platformID int, token string, flag int) error {
key := NotificationUidPidToken + userID + ":" + constant.PlatformIDToName(platformID)
2023-04-28 18:39:21 +08:00
return errs.Wrap(c.rdb.HSet(ctx, key, token, flag).Err())
2022-06-15 16:33:30 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetTokensWithoutError(ctx context.Context, userID, platformID string) (map[string]int, error) {
key := NotificationUidPidToken + userID + ":" + platformID
2023-03-01 15:32:26 +08:00
m, err := c.rdb.HGetAll(ctx, key).Result()
2023-02-24 11:01:33 +08:00
if err != nil {
2023-04-28 18:39:21 +08:00
return nil, errs.Wrap(err)
2023-02-20 17:13:15 +08:00
}
mm := make(map[string]int)
for k, v := range m {
mm[k] = utils.StringToInt(v)
}
2023-02-24 11:01:33 +08:00
return mm, nil
2023-02-20 17:13:15 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetTokenMapByUidPid(ctx context.Context, userID string, platform string, m map[string]int) error {
key := NotificationUidPidToken + userID + ":" + platform
2022-06-21 21:27:00 +08:00
mm := make(map[string]interface{})
for k, v := range m {
mm[k] = v
}
2023-04-28 18:39:21 +08:00
return errs.Wrap(c.rdb.HSet(ctx, key, mm).Err())
2022-06-15 16:33:30 +08:00
}
2023-02-09 14:40:49 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) DeleteTokenByUidPid(ctx context.Context, userID string, platform string, fields []string) error {
key := NotificationUidPidToken + userID + ":" + platform
2023-04-28 18:39:21 +08:00
return errs.Wrap(c.rdb.HDel(ctx, key, fields...).Err())
2022-06-15 16:33:30 +08:00
}
2023-05-04 16:00:06 +08:00
func (c *notificationCache) getMessageCacheKey(conversationID string, seq int64) string {
return NotificationMessageCache + conversationID + "_" + strconv.Itoa(int(seq))
2023-04-26 18:57:41 +08:00
}
2023-05-04 16:00:06 +08:00
func (c *notificationCache) allMessageCacheKey(conversationID string) string {
return NotificationMessageCache + conversationID + "_*"
2023-04-26 18:57:41 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetMessagesBySeq(ctx context.Context, userID string, seqs []int64) (seqMsgs []*sdkws.MsgData, failedSeqs []int64, err error) {
2023-03-24 11:29:39 +08:00
pipe := c.rdb.Pipeline()
for _, v := range seqs {
2022-06-06 18:15:32 +08:00
//MESSAGE_CACHE:169.254.225.224_reliability1653387820_0_1
2023-04-26 18:57:41 +08:00
key := c.getMessageCacheKey(userID, v)
2023-03-24 11:29:39 +08:00
if err := pipe.Get(ctx, key).Err(); err != nil && err != redis.Nil {
return nil, nil, err
}
}
result, err := pipe.Exec(ctx)
for i, v := range result {
if v.Err() != nil {
failedSeqs = append(failedSeqs, seqs[i])
2022-06-15 23:30:33 +08:00
} else {
2023-02-15 15:52:32 +08:00
msg := sdkws.MsgData{}
2023-03-24 11:29:39 +08:00
err = jsonpb.UnmarshalString(v.String(), &msg)
2022-06-06 18:15:32 +08:00
if err != nil {
2023-03-24 11:29:39 +08:00
failedSeqs = append(failedSeqs, seqs[i])
2022-06-06 18:15:32 +08:00
} else {
2023-03-24 11:29:39 +08:00
seqMsgs = append(seqMsgs, &msg)
2022-06-06 18:15:32 +08:00
}
}
}
2023-03-24 11:29:39 +08:00
return seqMsgs, failedSeqs, err
2022-06-06 18:15:32 +08:00
}
2022-08-05 15:16:43 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetMessageToCache(ctx context.Context, userID string, msgList []*sdkws.MsgData) (int, error) {
2023-03-01 15:32:26 +08:00
pipe := c.rdb.Pipeline()
2023-04-28 18:39:21 +08:00
var failedMsgs []sdkws.MsgData
2023-02-24 11:01:33 +08:00
for _, msg := range msgList {
2023-04-28 18:39:21 +08:00
key := c.getMessageCacheKey(userID, msg.Seq)
s, err := utils.Pb2String(msg)
2022-06-06 18:15:32 +08:00
if err != nil {
2023-04-28 18:39:21 +08:00
return 0, errs.Wrap(err)
2022-06-06 18:15:32 +08:00
}
2022-06-15 19:17:49 +08:00
err = pipe.Set(ctx, key, s, time.Duration(config.Config.MsgCacheTimeout)*time.Second).Err()
2022-06-06 18:15:32 +08:00
if err != nil {
2023-04-28 18:39:21 +08:00
return 0, errs.Wrap(err)
2022-06-06 18:15:32 +08:00
}
}
2023-03-03 17:42:26 +08:00
if len(failedMsgs) != 0 {
2023-05-04 12:11:29 +08:00
return len(failedMsgs), fmt.Errorf("set msg to notificationCache failed, failed lists: %v, %s", failedMsgs, userID)
2022-06-06 18:15:32 +08:00
}
2022-06-15 19:17:49 +08:00
_, err := pipe.Exec(ctx)
2023-02-15 15:52:32 +08:00
return 0, err
2022-06-06 18:15:32 +08:00
}
2023-02-24 11:01:33 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) DeleteMessageFromCache(ctx context.Context, userID string, msgList []*sdkws.MsgData) error {
2023-03-24 11:29:39 +08:00
pipe := c.rdb.Pipeline()
2023-03-02 12:00:31 +08:00
for _, v := range msgList {
2023-04-28 18:39:21 +08:00
if err := pipe.Del(ctx, c.getMessageCacheKey(userID, v.Seq)).Err(); err != nil {
return errs.Wrap(err)
2022-08-18 11:14:38 +08:00
}
2022-07-27 12:15:32 +08:00
}
2023-03-24 11:29:39 +08:00
_, err := pipe.Exec(ctx)
2023-04-28 18:39:21 +08:00
return errs.Wrap(err)
2022-07-27 12:15:32 +08:00
}
2022-06-06 18:15:32 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) CleanUpOneUserAllMsg(ctx context.Context, userID string) error {
2023-04-26 18:57:41 +08:00
vals, err := c.rdb.Keys(ctx, c.allMessageCacheKey(userID)).Result()
2023-01-29 11:37:11 +08:00
if err == redis.Nil {
2022-06-06 18:15:32 +08:00
return nil
}
if err != nil {
2023-04-28 18:39:21 +08:00
return errs.Wrap(err)
2022-06-06 18:15:32 +08:00
}
2023-03-24 11:29:39 +08:00
pipe := c.rdb.Pipeline()
2022-08-11 20:25:33 +08:00
for _, v := range vals {
2023-03-24 11:29:39 +08:00
if err := pipe.Del(ctx, v).Err(); err != nil {
2023-04-28 18:39:21 +08:00
return errs.Wrap(err)
2023-02-24 11:01:33 +08:00
}
2022-06-06 18:15:32 +08:00
}
2023-03-24 11:29:39 +08:00
_, err = pipe.Exec(ctx)
2023-04-28 18:39:21 +08:00
return errs.Wrap(err)
2022-06-06 18:15:32 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) HandleSignalInvite(ctx context.Context, msg *sdkws.MsgData, pushToUserID string) (isSend bool, err error) {
2023-03-02 12:00:31 +08:00
req := &sdkws.SignalReq{}
2022-06-06 18:52:17 +08:00
if err := proto.Unmarshal(msg.Content, req); err != nil {
2023-04-28 18:39:21 +08:00
return false, errs.Wrap(err)
2022-06-06 18:15:32 +08:00
}
2023-03-02 12:00:31 +08:00
var inviteeUserIDs []string
2022-06-10 17:31:30 +08:00
var isInviteSignal bool
switch signalInfo := req.Payload.(type) {
2023-03-02 12:00:31 +08:00
case *sdkws.SignalReq_Invite:
inviteeUserIDs = signalInfo.Invite.Invitation.InviteeUserIDList
2022-06-10 17:31:30 +08:00
isInviteSignal = true
2023-03-02 12:00:31 +08:00
case *sdkws.SignalReq_InviteInGroup:
inviteeUserIDs = signalInfo.InviteInGroup.Invitation.InviteeUserIDList
2022-06-10 17:31:30 +08:00
isInviteSignal = true
2023-03-02 12:00:31 +08:00
if !utils.Contain(pushToUserID, inviteeUserIDs...) {
2022-09-02 17:22:27 +08:00
return false, nil
}
2023-03-02 12:00:31 +08:00
case *sdkws.SignalReq_HungUp, *sdkws.SignalReq_Cancel, *sdkws.SignalReq_Reject, *sdkws.SignalReq_Accept:
2023-04-28 18:39:21 +08:00
return false, errs.Wrap(errors.New("signalInfo do not need offlinePush"))
2022-06-06 21:04:11 +08:00
default:
2022-09-02 17:22:27 +08:00
return false, nil
2022-06-06 21:04:11 +08:00
}
2022-06-10 17:31:30 +08:00
if isInviteSignal {
2023-03-24 11:29:39 +08:00
pipe := c.rdb.Pipeline()
2023-03-02 12:00:31 +08:00
for _, userID := range inviteeUserIDs {
2022-06-10 17:31:30 +08:00
timeout, err := strconv.Atoi(config.Config.Rtc.SignalTimeout)
if err != nil {
2023-04-28 18:39:21 +08:00
return false, errs.Wrap(err)
2022-06-10 17:31:30 +08:00
}
2023-05-04 12:11:29 +08:00
keys := NotificationSignalListCache + userID
2023-03-24 11:29:39 +08:00
err = pipe.LPush(ctx, keys, msg.ClientMsgID).Err()
2022-06-10 17:31:30 +08:00
if err != nil {
2023-04-28 18:39:21 +08:00
return false, errs.Wrap(err)
2022-06-10 17:31:30 +08:00
}
2023-03-24 11:29:39 +08:00
err = pipe.Expire(ctx, keys, time.Duration(timeout)*time.Second).Err()
2022-06-10 17:31:30 +08:00
if err != nil {
2023-04-28 18:39:21 +08:00
return false, errs.Wrap(err)
2022-06-10 17:31:30 +08:00
}
2023-05-04 12:11:29 +08:00
key := NotificationSignalCache + msg.ClientMsgID
2023-03-24 11:29:39 +08:00
err = pipe.Set(ctx, key, msg.Content, time.Duration(timeout)*time.Second).Err()
2022-06-10 17:31:30 +08:00
if err != nil {
2023-04-28 18:39:21 +08:00
return false, errs.Wrap(err)
2022-06-10 17:31:30 +08:00
}
2022-06-06 18:52:17 +08:00
}
2023-03-24 11:29:39 +08:00
_, err := pipe.Exec(ctx)
if err != nil {
2023-04-28 18:39:21 +08:00
return false, errs.Wrap(err)
2023-03-24 11:29:39 +08:00
}
2022-06-06 18:15:32 +08:00
}
2022-09-02 17:22:27 +08:00
return true, nil
2022-06-06 18:15:32 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetSignalInvitationInfoByClientMsgID(ctx context.Context, clientMsgID string) (signalInviteReq *sdkws.SignalInviteReq, err error) {
bytes, err := c.rdb.Get(ctx, NotificationSignalCache+clientMsgID).Bytes()
2022-06-06 18:15:32 +08:00
if err != nil {
2023-04-28 18:39:21 +08:00
return nil, errs.Wrap(err)
2022-06-06 18:15:32 +08:00
}
2023-03-02 12:00:31 +08:00
signalReq := &sdkws.SignalReq{}
if err = proto.Unmarshal(bytes, signalReq); err != nil {
2023-04-28 18:39:21 +08:00
return nil, errs.Wrap(err)
2022-06-06 18:15:32 +08:00
}
2023-03-02 12:00:31 +08:00
signalInviteReq = &sdkws.SignalInviteReq{}
switch req := signalReq.Payload.(type) {
case *sdkws.SignalReq_Invite:
signalInviteReq.Invitation = req.Invite.Invitation
signalInviteReq.OpUserID = req.Invite.OpUserID
case *sdkws.SignalReq_InviteInGroup:
signalInviteReq.Invitation = req.InviteInGroup.Invitation
signalInviteReq.OpUserID = req.InviteInGroup.OpUserID
2022-06-06 19:36:25 +08:00
}
2023-03-02 12:00:31 +08:00
return signalInviteReq, nil
2022-06-06 18:15:32 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetAvailableSignalInvitationInfo(ctx context.Context, userID string) (invitationInfo *sdkws.SignalInviteReq, err error) {
key, err := c.rdb.LPop(ctx, NotificationSignalListCache+userID).Result()
2022-06-06 19:20:12 +08:00
if err != nil {
2023-04-28 18:39:21 +08:00
return nil, errs.Wrap(err)
2022-06-06 19:20:12 +08:00
}
2023-03-01 15:32:26 +08:00
invitationInfo, err = c.GetSignalInvitationInfoByClientMsgID(ctx, key)
2022-06-06 23:27:16 +08:00
if err != nil {
2023-02-24 11:01:33 +08:00
return nil, err
2022-06-06 23:27:16 +08:00
}
2023-04-28 18:39:21 +08:00
return invitationInfo, errs.Wrap(c.DelUserSignalList(ctx, userID))
2022-06-06 23:27:16 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) DelUserSignalList(ctx context.Context, userID string) error {
return errs.Wrap(c.rdb.Del(ctx, NotificationSignalListCache+userID).Err())
2022-06-06 18:15:32 +08:00
}
2022-06-15 14:57:21 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) DelMsgFromCache(ctx context.Context, userID string, seqs []int64) error {
2023-03-24 11:29:39 +08:00
for _, seq := range seqs {
2023-04-26 18:57:41 +08:00
key := c.getMessageCacheKey(userID, seq)
2023-03-01 15:32:26 +08:00
result, err := c.rdb.Get(ctx, key).Result()
2022-08-09 19:44:27 +08:00
if err != nil {
2023-01-29 11:37:11 +08:00
if err == redis.Nil {
2023-02-24 11:01:33 +08:00
continue
2022-08-09 19:44:27 +08:00
}
2023-04-28 18:39:21 +08:00
return errs.Wrap(err)
2022-08-09 19:44:27 +08:00
}
2023-02-15 15:52:32 +08:00
var msg sdkws.MsgData
2023-02-24 11:01:33 +08:00
if err := jsonpb.UnmarshalString(result, &msg); err != nil {
return err
2022-06-15 14:57:21 +08:00
}
msg.Status = constant.MsgDeleted
s, err := utils.Pb2String(&msg)
if err != nil {
2023-04-28 18:39:21 +08:00
return errs.Wrap(err)
2022-06-15 14:57:21 +08:00
}
2023-03-01 15:32:26 +08:00
if err := c.rdb.Set(ctx, key, s, time.Duration(config.Config.MsgCacheTimeout)*time.Second).Err(); err != nil {
2023-04-28 18:39:21 +08:00
return errs.Wrap(err)
2022-06-15 14:57:21 +08:00
}
}
2023-02-24 11:01:33 +08:00
return nil
2022-06-15 14:57:21 +08:00
}
2022-06-15 16:16:35 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetGetuiToken(ctx context.Context, token string, expireTime int64) error {
return errs.Wrap(c.rdb.Set(ctx, NotificationGetuiToken, token, time.Duration(expireTime)*time.Second).Err())
2022-06-15 16:16:35 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetGetuiToken(ctx context.Context) (string, error) {
return utils.Wrap2(c.rdb.Get(ctx, NotificationGetuiToken).Result())
2022-06-15 16:16:35 +08:00
}
2022-07-26 15:16:46 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetGetuiTaskID(ctx context.Context, taskID string, expireTime int64) error {
return errs.Wrap(c.rdb.Set(ctx, NotificationGetuiTaskID, taskID, time.Duration(expireTime)*time.Second).Err())
2022-12-21 16:46:16 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetGetuiTaskID(ctx context.Context) (string, error) {
return utils.Wrap2(c.rdb.Get(ctx, NotificationGetuiTaskID).Result())
2022-12-21 16:46:16 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetSendMsgStatus(ctx context.Context, id string, status int32) error {
return errs.Wrap(c.rdb.Set(ctx, NotificationSendMsgFailedFlag+id, status, time.Hour*24).Err())
2022-07-26 15:16:46 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetSendMsgStatus(ctx context.Context, id string) (int32, error) {
result, err := c.rdb.Get(ctx, NotificationSendMsgFailedFlag+id).Int()
2023-04-28 18:39:21 +08:00
return int32(result), errs.Wrap(err)
2022-07-26 15:16:46 +08:00
}
2022-07-26 15:20:48 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetFcmToken(ctx context.Context, account string, platformID int, fcmToken string, expireTime int64) (err error) {
return errs.Wrap(c.rdb.Set(ctx, NotificationFcmToken+account+":"+strconv.Itoa(platformID), fcmToken, time.Duration(expireTime)*time.Second).Err())
2022-07-25 17:57:58 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetFcmToken(ctx context.Context, account string, platformID int) (string, error) {
return utils.Wrap2(c.rdb.Get(ctx, NotificationFcmToken+account+":"+strconv.Itoa(platformID)).Result())
2022-12-09 20:53:13 +08:00
}
2022-12-12 19:15:31 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) DelFcmToken(ctx context.Context, account string, platformID int) error {
return errs.Wrap(c.rdb.Del(ctx, NotificationFcmToken+account+":"+strconv.Itoa(platformID)).Err())
2022-12-12 20:41:40 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) IncrUserBadgeUnreadCountSum(ctx context.Context, userID string) (int, error) {
seq, err := c.rdb.Incr(ctx, NotificationUserBadgeUnreadCountSum+userID).Result()
2023-04-28 18:39:21 +08:00
return int(seq), errs.Wrap(err)
2022-12-12 12:12:53 +08:00
}
2023-02-09 14:40:49 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetUserBadgeUnreadCountSum(ctx context.Context, userID string, value int) error {
return errs.Wrap(c.rdb.Set(ctx, NotificationUserBadgeUnreadCountSum+userID, value, 0).Err())
2022-12-09 20:53:13 +08:00
}
2023-02-09 14:40:49 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetUserBadgeUnreadCountSum(ctx context.Context, userID string) (int, error) {
return utils.Wrap2(c.rdb.Get(ctx, NotificationUserBadgeUnreadCountSum+userID).Int())
2022-12-09 20:53:13 +08:00
}
2023-02-09 14:40:49 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) LockMessageTypeKey(ctx context.Context, clientMsgID string, TypeKey string) error {
key := NotificationExTypeKeyLocker + clientMsgID + "_" + TypeKey
2023-04-28 18:39:21 +08:00
return errs.Wrap(c.rdb.SetNX(ctx, key, 1, time.Minute).Err())
2022-12-09 20:53:13 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) UnLockMessageTypeKey(ctx context.Context, clientMsgID string, TypeKey string) error {
key := NotificationExTypeKeyLocker + clientMsgID + "_" + TypeKey
2023-04-28 18:39:21 +08:00
return errs.Wrap(c.rdb.Del(ctx, key).Err())
2022-12-09 20:53:13 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) getMessageReactionExPrefix(clientMsgID string, sessionType int32) string {
2022-12-09 20:53:13 +08:00
switch sessionType {
case constant.SingleChatType:
return "EX_SINGLE_" + clientMsgID
case constant.GroupChatType:
return "EX_GROUP_" + clientMsgID
case constant.SuperGroupChatType:
return "EX_SUPER_GROUP_" + clientMsgID
case constant.NotificationChatType:
return "EX_NOTIFICATION" + clientMsgID
}
return ""
}
2023-02-24 11:01:33 +08:00
2023-05-04 12:11:29 +08:00
func (c *notificationCache) JudgeMessageReactionExist(ctx context.Context, clientMsgID string, sessionType int32) (bool, error) {
2023-03-01 15:32:26 +08:00
n, err := c.rdb.Exists(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType)).Result()
2023-02-24 11:01:33 +08:00
if err != nil {
return false, utils.Wrap(err, "")
}
return n > 0, nil
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey, value string) error {
2023-04-28 18:39:21 +08:00
return errs.Wrap(c.rdb.HSet(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType), typeKey, value).Err())
2023-02-24 11:01:33 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) SetMessageReactionExpire(ctx context.Context, clientMsgID string, sessionType int32, expiration time.Duration) (bool, error) {
2023-03-01 15:32:26 +08:00
return utils.Wrap2(c.rdb.Expire(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType), expiration).Result())
2023-02-24 11:01:33 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey string) (string, error) {
2023-03-01 15:32:26 +08:00
return utils.Wrap2(c.rdb.HGet(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType), typeKey).Result())
2023-02-24 11:01:33 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) GetOneMessageAllReactionList(ctx context.Context, clientMsgID string, sessionType int32) (map[string]string, error) {
2023-03-01 15:32:26 +08:00
return utils.Wrap2(c.rdb.HGetAll(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType)).Result())
2023-02-24 11:01:33 +08:00
}
2023-05-04 12:11:29 +08:00
func (c *notificationCache) DeleteOneMessageKey(ctx context.Context, clientMsgID string, sessionType int32, subKey string) error {
2023-04-28 18:39:21 +08:00
return errs.Wrap(c.rdb.HDel(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType), subKey).Err())
2023-02-24 11:01:33 +08:00
}