mirror of
https://github.com/openimsdk/open-im-server.git
synced 2026-07-07 21:03:20 +08:00
57 lines
2.3 KiB
Go
57 lines
2.3 KiB
Go
package relation
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/openimsdk/open-im-server/v3/pkg/authverify"
|
|
"github.com/openimsdk/open-im-server/v3/pkg/util/conversationutil"
|
|
"github.com/openimsdk/protocol/constant"
|
|
conversationpb "github.com/openimsdk/protocol/conversation"
|
|
"github.com/openimsdk/protocol/relation"
|
|
"github.com/openimsdk/protocol/wrapperspb"
|
|
"github.com/openimsdk/tools/log"
|
|
)
|
|
|
|
// PinFriend pins a friend conversation for ownerUserID
|
|
// (syncs friend.is_pinned = true and conversation.isPinned = true).
|
|
func (s *friendServer) PinFriend(ctx context.Context, req *relation.PinFriendReq) (*relation.PinFriendResp, error) {
|
|
if err := s.setFriendConversationPinned(ctx, req.OwnerUserID, req.FriendUserID, true); err != nil {
|
|
return nil, err
|
|
}
|
|
return &relation.PinFriendResp{}, nil
|
|
}
|
|
|
|
// UnpinFriend unpins a friend conversation for ownerUserID
|
|
// (syncs friend.is_pinned = false and conversation.isPinned = false).
|
|
func (s *friendServer) UnpinFriend(ctx context.Context, req *relation.UnpinFriendReq) (*relation.UnpinFriendResp, error) {
|
|
if err := s.setFriendConversationPinned(ctx, req.OwnerUserID, req.FriendUserID, false); err != nil {
|
|
return nil, err
|
|
}
|
|
return &relation.UnpinFriendResp{}, nil
|
|
}
|
|
|
|
func (s *friendServer) setFriendConversationPinned(ctx context.Context, ownerUserID, friendUserID string, pinned bool) error {
|
|
if err := authverify.CheckAccessV3(ctx, ownerUserID, s.config.Share.IMAdminUserID); err != nil {
|
|
return err
|
|
}
|
|
if _, err := s.db.FindFriendsWithError(ctx, ownerUserID, []string{friendUserID}); err != nil {
|
|
return err
|
|
}
|
|
if err := s.db.UpdateFriends(ctx, ownerUserID, []string{friendUserID}, map[string]any{"is_pinned": pinned}); err != nil {
|
|
return err
|
|
}
|
|
convID := conversationutil.GenConversationIDForSingle(ownerUserID, friendUserID)
|
|
if err := s.conversationClient.SetConversations(ctx, []string{ownerUserID},
|
|
&conversationpb.ConversationReq{
|
|
ConversationID: convID,
|
|
ConversationType: constant.SingleChatType,
|
|
UserID: friendUserID,
|
|
IsPinned: &wrapperspb.BoolValue{Value: pinned},
|
|
}); err != nil {
|
|
log.ZWarn(ctx, "sync conversation isPinned failed", err,
|
|
"ownerUserID", ownerUserID, "friendUserID", friendUserID, "isPinned", pinned)
|
|
}
|
|
s.notificationSender.FriendsInfoUpdateNotification(ctx, ownerUserID, []string{friendUserID})
|
|
return nil
|
|
}
|