mirror of
https://github.com/openimsdk/open-im-server.git
synced 2026-05-13 21:45:58 +08:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2271043bf1 |
@@ -28,46 +28,42 @@ jobs:
|
|||||||
|
|
||||||
- name: Start Docker Compose
|
- name: Start Docker Compose
|
||||||
run: |
|
run: |
|
||||||
sudo docker compose stop
|
docker-compose stop
|
||||||
sudo sleep 30
|
docker-compose up -d
|
||||||
sudo docker compose up -d
|
sleep 60
|
||||||
sudo sleep 60
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Stop all services
|
- name: Stop all services
|
||||||
run: |
|
run: |
|
||||||
sudo chmod +x ./scripts/stop_all.sh
|
chmod +x ./scripts/stop_all.sh
|
||||||
sudo ./scripts/stop_all.sh
|
./scripts/stop_all.sh
|
||||||
sudo cat logs/openIM.log 2>/dev/null
|
|
||||||
shell: bash
|
shell: bash
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Build all services
|
- name: Build all services
|
||||||
run: |
|
run: |
|
||||||
sudo chmod +x ./scripts/build_all_service.sh
|
chmod +x ./scripts/build_all_service.sh
|
||||||
sudo ./scripts/build_all_service.sh
|
./scripts/build_all_service.sh
|
||||||
sudo cat logs/openIM.log 2>/dev/null
|
cat logs/openIM.log
|
||||||
shell: bash
|
shell: bash
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Start all services
|
- name: Start all services
|
||||||
run: |
|
run: |
|
||||||
sudo chmod +x ./scripts/start_all.sh
|
chmod +x ./scripts/start_all.sh
|
||||||
sudo ./scripts/start_all.sh
|
./scripts/start_all.sh
|
||||||
sudo cat logs/openIM.log 2>/dev/null
|
cat logs/openIM.log
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Check all services
|
- name: Check all services
|
||||||
run: |
|
run: |
|
||||||
sudo chmod +x ./scripts/check_all.sh
|
chmod +x ./scripts/check_all.sh
|
||||||
sudo ./scripts/check_all.sh
|
./scripts/check_all.sh
|
||||||
sudo cat logs/openIM.log 2>/dev/null
|
cat logs/openIM.log
|
||||||
shell: bash
|
shell: bash
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Print openIM.log
|
- name: Print openIM.log
|
||||||
run: |
|
run: |
|
||||||
sudo cat logs/* 2>/dev/null
|
cat logs/openIM.log
|
||||||
sudo cat logs/* 2>/dev/null >> "$GITHUB_OUTPUT"
|
cat logs/openIM.log >> "$GITHUB_OUTPUT"
|
||||||
shell: bash
|
shell: bash
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|||||||
+1
-1
@@ -33,4 +33,4 @@ COPY --from=builder /Open-IM-Server/_output/bin/platforms/linux/amd64 /Open-IM-S
|
|||||||
|
|
||||||
WORKDIR /Open-IM-Server/scripts
|
WORKDIR /Open-IM-Server/scripts
|
||||||
|
|
||||||
CMD ["docker_start_all.sh"]
|
CMD ["./docker_start_all.sh"]
|
||||||
|
|||||||
@@ -18,12 +18,12 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"net/http"
|
||||||
_ "net/http/pprof"
|
_ "net/http/pprof"
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/internal/api"
|
"github.com/OpenIMSDK/Open-IM-Server/internal/api"
|
||||||
|
|||||||
+2
-2
@@ -100,7 +100,7 @@ services:
|
|||||||
|
|
||||||
|
|
||||||
openim_server:
|
openim_server:
|
||||||
image: ghcr.io/openimsdk/openim-server:v3.0
|
image: ghcr.io/openimsdk/openim-server:v3.0.0-alpha.1
|
||||||
container_name: openim-server
|
container_name: openim-server
|
||||||
volumes:
|
volumes:
|
||||||
- ./logs:/Open-IM-Server/logs
|
- ./logs:/Open-IM-Server/logs
|
||||||
@@ -123,7 +123,7 @@ services:
|
|||||||
max-file: "2"
|
max-file: "2"
|
||||||
|
|
||||||
openim_chat:
|
openim_chat:
|
||||||
image: ghcr.io/openimsdk/openim-chat:v1.0.0
|
image: openim/openim_chat:v1.1.0
|
||||||
container_name: openim_chat
|
container_name: openim_chat
|
||||||
restart: always
|
restart: always
|
||||||
depends_on:
|
depends_on:
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ go 1.18
|
|||||||
require (
|
require (
|
||||||
firebase.google.com/go v3.13.0+incompatible
|
firebase.google.com/go v3.13.0+incompatible
|
||||||
github.com/OpenIMSDK/open_utils v1.0.8
|
github.com/OpenIMSDK/open_utils v1.0.8
|
||||||
github.com/Shopify/sarama v1.29.0
|
github.com/Shopify/sarama v1.32.0
|
||||||
github.com/bwmarrin/snowflake v0.3.0
|
github.com/bwmarrin/snowflake v0.3.0
|
||||||
github.com/dtm-labs/rockscache v0.1.1
|
github.com/dtm-labs/rockscache v0.1.1
|
||||||
github.com/gin-gonic/gin v1.9.1
|
github.com/gin-gonic/gin v1.9.1
|
||||||
@@ -141,3 +141,5 @@ require (
|
|||||||
google.golang.org/genproto v0.0.0-20230525234025-438c736192d0 // indirect
|
google.golang.org/genproto v0.0.0-20230525234025-438c736192d0 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
replace github.com/Shopify/sarama => github.com/Shopify/sarama v1.29.0
|
||||||
|
|||||||
Executable → Regular
+1
-6
@@ -21,12 +21,7 @@ if ! command -v docker >/dev/null 2>&1; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Start Docker services using docker-compose
|
# Start Docker services using docker-compose
|
||||||
if command -v docker-compose &> /dev/null
|
docker-compose up -d
|
||||||
then
|
|
||||||
docker-compose up -d
|
|
||||||
else
|
|
||||||
docker compose up -d
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Move back to the 'scripts' folder
|
# Move back to the 'scripts' folder
|
||||||
cd scripts
|
cd scripts
|
||||||
|
|||||||
Executable → Regular
Executable → Regular
Executable → Regular
@@ -18,14 +18,15 @@ import (
|
|||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/auth"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/auth"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AuthApi rpcclient.Auth
|
type AuthApi rpcclient.Auth
|
||||||
|
|
||||||
func NewAuthApi(client rpcclient.Auth) AuthApi {
|
func NewAuthApi(discov discoveryregistry.SvcDiscoveryRegistry) AuthApi {
|
||||||
return AuthApi(client)
|
return AuthApi(*rpcclient.NewAuth(discov))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *AuthApi) UserToken(c *gin.Context) {
|
func (o *AuthApi) UserToken(c *gin.Context) {
|
||||||
|
|||||||
@@ -18,14 +18,15 @@ import (
|
|||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ConversationApi rpcclient.Conversation
|
type ConversationApi rpcclient.Conversation
|
||||||
|
|
||||||
func NewConversationApi(client rpcclient.Conversation) ConversationApi {
|
func NewConversationApi(discov discoveryregistry.SvcDiscoveryRegistry) ConversationApi {
|
||||||
return ConversationApi(client)
|
return ConversationApi(*rpcclient.NewConversation(discov))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *ConversationApi) GetAllConversations(c *gin.Context) {
|
func (o *ConversationApi) GetAllConversations(c *gin.Context) {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/friend"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/friend"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
|
|
||||||
@@ -24,8 +25,8 @@ import (
|
|||||||
|
|
||||||
type FriendApi rpcclient.Friend
|
type FriendApi rpcclient.Friend
|
||||||
|
|
||||||
func NewFriendApi(client rpcclient.Friend) FriendApi {
|
func NewFriendApi(discov discoveryregistry.SvcDiscoveryRegistry) FriendApi {
|
||||||
return FriendApi(client)
|
return FriendApi(*rpcclient.NewFriend(discov))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *FriendApi) ApplyToAddFriend(c *gin.Context) {
|
func (o *FriendApi) ApplyToAddFriend(c *gin.Context) {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
|
|
||||||
@@ -24,8 +25,8 @@ import (
|
|||||||
|
|
||||||
type GroupApi rpcclient.Group
|
type GroupApi rpcclient.Group
|
||||||
|
|
||||||
func NewGroupApi(client rpcclient.Group) GroupApi {
|
func NewGroupApi(discov discoveryregistry.SvcDiscoveryRegistry) GroupApi {
|
||||||
return GroupApi(client)
|
return GroupApi(*rpcclient.NewGroup(discov))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *GroupApi) CreateGroup(c *gin.Context) {
|
func (o *GroupApi) CreateGroup(c *gin.Context) {
|
||||||
@@ -131,7 +132,6 @@ func (o *GroupApi) GetSuperGroupsInfo(c *gin.Context) {
|
|||||||
func (o *GroupApi) GroupCreateCount(c *gin.Context) {
|
func (o *GroupApi) GroupCreateCount(c *gin.Context) {
|
||||||
a2r.Call(group.GroupClient.GroupCreateCount, o.Client, c)
|
a2r.Call(group.GroupClient.GroupCreateCount, o.Client, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *GroupApi) GetGroups(c *gin.Context) {
|
func (o *GroupApi) GetGroups(c *gin.Context) {
|
||||||
a2r.Call(group.GroupClient.GetGroups, o.Client, c)
|
a2r.Call(group.GroupClient.GetGroups, o.Client, c)
|
||||||
}
|
}
|
||||||
|
|||||||
+111
-77
@@ -26,6 +26,7 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
"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/common/log"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||||
@@ -34,13 +35,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type MessageApi struct {
|
type MessageApi struct {
|
||||||
*rpcclient.Message
|
rpcclient.Message
|
||||||
validate *validator.Validate
|
validate *validator.Validate
|
||||||
userRpcClient *rpcclient.UserRpcClient
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMessageApi(msgRpcClient *rpcclient.Message, userRpcClient *rpcclient.User) MessageApi {
|
func NewMessageApi(discov discoveryregistry.SvcDiscoveryRegistry) MessageApi {
|
||||||
return MessageApi{Message: msgRpcClient, validate: validator.New(), userRpcClient: rpcclient.NewUserRpcClientByUser(userRpcClient)}
|
return MessageApi{Message: *rpcclient.NewMessage(discov), validate: validator.New()}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (MessageApi) SetOptions(options map[string]bool, value bool) {
|
func (MessageApi) SetOptions(options map[string]bool, value bool) {
|
||||||
@@ -50,10 +50,9 @@ func (MessageApi) SetOptions(options map[string]bool, value bool) {
|
|||||||
utils.SetSwitchFromOptions(options, constant.IsConversationUpdate, value)
|
utils.SetSwitchFromOptions(options, constant.IsConversationUpdate, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m MessageApi) newUserSendMsgReq(c *gin.Context, params *apistruct.SendMsg) *msg.SendMsgReq {
|
func (m MessageApi) newUserSendMsgReq(c *gin.Context, params *apistruct.ManagementSendMsgReq) *msg.SendMsgReq {
|
||||||
var newContent string
|
var newContent string
|
||||||
var err error
|
var err error
|
||||||
options := make(map[string]bool, 5)
|
|
||||||
switch params.ContentType {
|
switch params.ContentType {
|
||||||
case constant.Text:
|
case constant.Text:
|
||||||
newContent = params.Content["text"].(string)
|
newContent = params.Content["text"].(string)
|
||||||
@@ -71,9 +70,11 @@ func (m MessageApi) newUserSendMsgReq(c *gin.Context, params *apistruct.SendMsg)
|
|||||||
fallthrough
|
fallthrough
|
||||||
case constant.CustomOnlineOnly:
|
case constant.CustomOnlineOnly:
|
||||||
fallthrough
|
fallthrough
|
||||||
|
case constant.Revoke:
|
||||||
|
newContent = params.Content["revokeMsgClientID"].(string)
|
||||||
default:
|
default:
|
||||||
newContent = utils.StructToJsonString(params.Content)
|
|
||||||
}
|
}
|
||||||
|
options := make(map[string]bool, 5)
|
||||||
if params.IsOnlineOnly {
|
if params.IsOnlineOnly {
|
||||||
m.SetOptions(options, false)
|
m.SetOptions(options, false)
|
||||||
}
|
}
|
||||||
@@ -97,6 +98,7 @@ func (m MessageApi) newUserSendMsgReq(c *gin.Context, params *apistruct.SendMsg)
|
|||||||
MsgFrom: constant.SysMsgType,
|
MsgFrom: constant.SysMsgType,
|
||||||
ContentType: params.ContentType,
|
ContentType: params.ContentType,
|
||||||
Content: []byte(newContent),
|
Content: []byte(newContent),
|
||||||
|
RecvID: params.RecvID,
|
||||||
CreateTime: utils.GetCurrentTimestampByMill(),
|
CreateTime: utils.GetCurrentTimestampByMill(),
|
||||||
Options: options,
|
Options: options,
|
||||||
OfflinePushInfo: params.OfflinePushInfo,
|
OfflinePushInfo: params.OfflinePushInfo,
|
||||||
@@ -161,9 +163,19 @@ func (m *MessageApi) DeleteMsgPhysical(c *gin.Context) {
|
|||||||
a2r.Call(msg.MsgClient.DeleteMsgPhysical, m.Client, c)
|
a2r.Call(msg.MsgClient.DeleteMsgPhysical, m.Client, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MessageApi) getSendMsgReq(c *gin.Context, req apistruct.SendMsg) (sendMsgReq *msg.SendMsgReq, err error) {
|
func (m *MessageApi) SendMessage(c *gin.Context) {
|
||||||
|
params := apistruct.ManagementSendMsgReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !tokenverify.IsAppManagerUid(c) {
|
||||||
|
apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
var data interface{}
|
var data interface{}
|
||||||
switch req.ContentType {
|
switch params.ContentType {
|
||||||
case constant.Text:
|
case constant.Text:
|
||||||
data = apistruct.TextElem{}
|
data = apistruct.TextElem{}
|
||||||
case constant.Picture:
|
case constant.Picture:
|
||||||
@@ -180,45 +192,25 @@ func (m *MessageApi) getSendMsgReq(c *gin.Context, req apistruct.SendMsg) (sendM
|
|||||||
data = apistruct.RevokeElem{}
|
data = apistruct.RevokeElem{}
|
||||||
case constant.OANotification:
|
case constant.OANotification:
|
||||||
data = apistruct.OANotificationElem{}
|
data = apistruct.OANotificationElem{}
|
||||||
req.SessionType = constant.NotificationChatType
|
params.SessionType = constant.NotificationChatType
|
||||||
case constant.CustomNotTriggerConversation:
|
case constant.CustomNotTriggerConversation:
|
||||||
data = apistruct.CustomElem{}
|
data = apistruct.CustomElem{}
|
||||||
case constant.CustomOnlineOnly:
|
case constant.CustomOnlineOnly:
|
||||||
data = apistruct.CustomElem{}
|
data = apistruct.CustomElem{}
|
||||||
default:
|
default:
|
||||||
return nil, errs.ErrArgs.WithDetail("not support err contentType")
|
apiresp.GinError(c, errs.ErrArgs.WithDetail("not support err contentType").Wrap())
|
||||||
}
|
|
||||||
if err := mapstructure.WeakDecode(req.Content, &data); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
log.ZDebug(c, "getSendMsgReq", "data", data)
|
|
||||||
if err := m.validate.Struct(data); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return m.newUserSendMsgReq(c, &req), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MessageApi) SendMessage(c *gin.Context) {
|
|
||||||
req := apistruct.SendMsgReq{}
|
|
||||||
if err := c.BindJSON(&req); err != nil {
|
|
||||||
apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap())
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.ZInfo(c, "SendMessage", "req", req)
|
if err := mapstructure.WeakDecode(params.Content, &data); err != nil {
|
||||||
if !tokenverify.IsAppManagerUid(c) {
|
apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
|
||||||
apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message"))
|
return
|
||||||
|
} else if err := m.validate.Struct(params); err != nil {
|
||||||
|
apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
pbReq := m.newUserSendMsgReq(c, ¶ms)
|
||||||
sendMsgReq, err := m.getSendMsgReq(c, req.SendMsg)
|
|
||||||
if err != nil {
|
|
||||||
log.ZError(c, "decodeData failed", err)
|
|
||||||
apiresp.GinError(c, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
sendMsgReq.MsgData.RecvID = req.RecvID
|
|
||||||
var status int
|
var status int
|
||||||
respPb, err := m.Client.SendMsg(c, sendMsgReq)
|
respPb, err := m.Client.SendMsg(c, pbReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
status = constant.MsgSendFailed
|
status = constant.MsgSendFailed
|
||||||
apiresp.GinError(c, err)
|
apiresp.GinError(c, err)
|
||||||
@@ -234,65 +226,107 @@ func (m *MessageApi) SendMessage(c *gin.Context) {
|
|||||||
apiresp.GinSuccess(c, respPb)
|
apiresp.GinSuccess(c, respPb)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MessageApi) BatchSendMsg(c *gin.Context) {
|
func (m *MessageApi) ManagementBatchSendMsg(c *gin.Context) {
|
||||||
var (
|
params := apistruct.ManagementBatchSendMsgReq{}
|
||||||
req apistruct.BatchSendMsgReq
|
resp := apistruct.ManagementBatchSendMsgResp{}
|
||||||
resp apistruct.BatchSendMsgResp
|
var msgSendFailedFlag bool
|
||||||
)
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
if err := c.BindJSON(&req); err != nil {
|
|
||||||
log.ZError(c, "BatchSendMsg BindJSON failed", err)
|
|
||||||
apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap())
|
apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.ZInfo(c, "BatchSendMsg", "req", req)
|
if !tokenverify.IsAppManagerUid(c) {
|
||||||
if err := tokenverify.CheckAdmin(c); err != nil {
|
|
||||||
apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message"))
|
apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var data interface{}
|
||||||
|
switch params.ContentType {
|
||||||
|
case constant.Text:
|
||||||
|
data = apistruct.TextElem{}
|
||||||
|
case constant.Picture:
|
||||||
|
data = apistruct.PictureElem{}
|
||||||
|
case constant.Voice:
|
||||||
|
data = apistruct.SoundElem{}
|
||||||
|
case constant.Video:
|
||||||
|
data = apistruct.VideoElem{}
|
||||||
|
case constant.File:
|
||||||
|
data = apistruct.FileElem{}
|
||||||
|
case constant.Custom:
|
||||||
|
data = apistruct.CustomElem{}
|
||||||
|
case constant.Revoke:
|
||||||
|
data = apistruct.RevokeElem{}
|
||||||
|
case constant.OANotification:
|
||||||
|
data = apistruct.OANotificationElem{}
|
||||||
|
params.SessionType = constant.NotificationChatType
|
||||||
|
case constant.CustomNotTriggerConversation:
|
||||||
|
data = apistruct.CustomElem{}
|
||||||
|
case constant.CustomOnlineOnly:
|
||||||
|
data = apistruct.CustomElem{}
|
||||||
|
default:
|
||||||
|
apiresp.GinError(c, errs.ErrArgs.WithDetail("not support err contentType").Wrap())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := mapstructure.WeakDecode(params.Content, &data); err != nil {
|
||||||
|
apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
|
||||||
|
return
|
||||||
|
} else if err := m.validate.Struct(params); err != nil {
|
||||||
|
apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
var recvIDs []string
|
t := &apistruct.ManagementSendMsgReq{
|
||||||
var err error
|
SendID: params.SendID,
|
||||||
if req.IsSendAll {
|
GroupID: params.GroupID,
|
||||||
pageNumber := 1
|
SenderNickname: params.SenderNickname,
|
||||||
showNumber := 500
|
SenderFaceURL: params.SenderFaceURL,
|
||||||
for {
|
SenderPlatformID: params.SenderPlatformID,
|
||||||
recvIDsPart, err := m.userRpcClient.GetAllUserIDs(c, int32(pageNumber), int32(showNumber))
|
Content: params.Content,
|
||||||
if err != nil {
|
ContentType: params.ContentType,
|
||||||
log.ZError(c, "GetAllUserIDs failed", err)
|
SessionType: params.SessionType,
|
||||||
apiresp.GinError(c, err)
|
IsOnlineOnly: params.IsOnlineOnly,
|
||||||
return
|
NotOfflinePush: params.NotOfflinePush,
|
||||||
}
|
OfflinePushInfo: params.OfflinePushInfo,
|
||||||
if len(recvIDsPart) < showNumber {
|
|
||||||
recvIDs = append(recvIDs, recvIDsPart...)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
pageNumber++
|
|
||||||
}
|
}
|
||||||
|
pbReq := m.newUserSendMsgReq(c, t)
|
||||||
|
var recvList []string
|
||||||
|
if params.IsSendAll {
|
||||||
|
// req2 := &user.GetAllUserIDReq{}
|
||||||
|
// resp2, err := m.Message.GetAllUserID(c, req2)
|
||||||
|
// if err != nil {
|
||||||
|
// apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// recvList = resp2.UserIDs
|
||||||
} else {
|
} else {
|
||||||
recvIDs = req.RecvIDs
|
recvList = params.RecvIDList
|
||||||
}
|
}
|
||||||
log.ZDebug(c, "BatchSendMsg nums", "nums ", len(recvIDs))
|
|
||||||
sendMsgReq, err := m.getSendMsgReq(c, req.SendMsg)
|
for _, recvID := range recvList {
|
||||||
|
pbReq.MsgData.RecvID = recvID
|
||||||
|
rpcResp, err := m.Client.SendMsg(c, pbReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.ZError(c, "decodeData failed", err)
|
resp.Data.FailedIDList = append(resp.Data.FailedIDList, recvID)
|
||||||
apiresp.GinError(c, err)
|
msgSendFailedFlag = true
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, recvID := range recvIDs {
|
|
||||||
sendMsgReq.MsgData.RecvID = recvID
|
|
||||||
rpcResp, err := m.Client.SendMsg(c, sendMsgReq)
|
|
||||||
if err != nil {
|
|
||||||
resp.FailedIDs = append(resp.FailedIDs, recvID)
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
resp.Results = append(resp.Results, &apistruct.SingleReturnResult{
|
resp.Data.ResultList = append(resp.Data.ResultList, &apistruct.SingleReturnResult{
|
||||||
ServerMsgID: rpcResp.ServerMsgID,
|
ServerMsgID: rpcResp.ServerMsgID,
|
||||||
ClientMsgID: rpcResp.ClientMsgID,
|
ClientMsgID: rpcResp.ClientMsgID,
|
||||||
SendTime: rpcResp.SendTime,
|
SendTime: rpcResp.SendTime,
|
||||||
RecvID: recvID,
|
RecvID: recvID,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
var status int32
|
||||||
|
if msgSendFailedFlag {
|
||||||
|
status = constant.MsgSendFailed
|
||||||
|
} else {
|
||||||
|
status = constant.MsgSendSuccessed
|
||||||
|
}
|
||||||
|
_, err := m.Client.SetSendMsgStatus(c, &msg.SetSendMsgStatusReq{Status: status})
|
||||||
|
if err != nil {
|
||||||
|
apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
apiresp.GinSuccess(c, resp)
|
apiresp.GinSuccess(c, resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+13
-23
@@ -29,7 +29,6 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.UniversalClient) *gin.Engine {
|
func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.UniversalClient) *gin.Engine {
|
||||||
@@ -41,17 +40,8 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
|
|||||||
}
|
}
|
||||||
log.ZInfo(context.Background(), "load config", "config", config.Config)
|
log.ZInfo(context.Background(), "load config", "config", config.Config)
|
||||||
r.Use(gin.Recovery(), mw.CorsHandler(), mw.GinParseOperationID())
|
r.Use(gin.Recovery(), mw.CorsHandler(), mw.GinParseOperationID())
|
||||||
// init rpc client here
|
u := NewUserApi(discov)
|
||||||
userRpc := rpcclient.NewUser(discov)
|
m := NewMessageApi(discov)
|
||||||
groupRpc := rpcclient.NewGroup(discov)
|
|
||||||
friendRpc := rpcclient.NewFriend(discov)
|
|
||||||
messageRpc := rpcclient.NewMessage(discov)
|
|
||||||
conversationRpc := rpcclient.NewConversation(discov)
|
|
||||||
authRpc := rpcclient.NewAuth(discov)
|
|
||||||
thirdRpc := rpcclient.NewThird(discov)
|
|
||||||
|
|
||||||
u := NewUserApi(*userRpc)
|
|
||||||
m := NewMessageApi(messageRpc, userRpc)
|
|
||||||
if config.Config.Prometheus.Enable {
|
if config.Config.Prometheus.Enable {
|
||||||
prome.NewApiRequestCounter()
|
prome.NewApiRequestCounter()
|
||||||
prome.NewApiRequestFailedCounter()
|
prome.NewApiRequestFailedCounter()
|
||||||
@@ -72,10 +62,10 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
|
|||||||
userRouterGroup.POST("/get_users_online_status", ParseToken, u.GetUsersOnlineStatus)
|
userRouterGroup.POST("/get_users_online_status", ParseToken, u.GetUsersOnlineStatus)
|
||||||
userRouterGroup.POST("/get_users_online_token_detail", ParseToken, u.GetUsersOnlineTokenDetail)
|
userRouterGroup.POST("/get_users_online_token_detail", ParseToken, u.GetUsersOnlineTokenDetail)
|
||||||
}
|
}
|
||||||
// friend routing group
|
//friend routing group
|
||||||
friendRouterGroup := r.Group("/friend", ParseToken)
|
friendRouterGroup := r.Group("/friend", ParseToken)
|
||||||
{
|
{
|
||||||
f := NewFriendApi(*friendRpc)
|
f := NewFriendApi(discov)
|
||||||
friendRouterGroup.POST("/delete_friend", f.DeleteFriend)
|
friendRouterGroup.POST("/delete_friend", f.DeleteFriend)
|
||||||
friendRouterGroup.POST("/get_friend_apply_list", f.GetFriendApplyList)
|
friendRouterGroup.POST("/get_friend_apply_list", f.GetFriendApplyList)
|
||||||
friendRouterGroup.POST("/get_self_friend_apply_list", f.GetSelfApplyList)
|
friendRouterGroup.POST("/get_self_friend_apply_list", f.GetSelfApplyList)
|
||||||
@@ -89,7 +79,7 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
|
|||||||
friendRouterGroup.POST("/import_friend", f.ImportFriends)
|
friendRouterGroup.POST("/import_friend", f.ImportFriends)
|
||||||
friendRouterGroup.POST("/is_friend", f.IsFriend)
|
friendRouterGroup.POST("/is_friend", f.IsFriend)
|
||||||
}
|
}
|
||||||
g := NewGroupApi(*groupRpc)
|
g := NewGroupApi(discov)
|
||||||
groupRouterGroup := r.Group("/group", ParseToken)
|
groupRouterGroup := r.Group("/group", ParseToken)
|
||||||
{
|
{
|
||||||
groupRouterGroup.POST("/create_group", g.CreateGroup)
|
groupRouterGroup.POST("/create_group", g.CreateGroup)
|
||||||
@@ -120,18 +110,18 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
|
|||||||
superGroupRouterGroup.POST("/get_joined_group_list", g.GetJoinedSuperGroupList)
|
superGroupRouterGroup.POST("/get_joined_group_list", g.GetJoinedSuperGroupList)
|
||||||
superGroupRouterGroup.POST("/get_groups_info", g.GetSuperGroupsInfo)
|
superGroupRouterGroup.POST("/get_groups_info", g.GetSuperGroupsInfo)
|
||||||
}
|
}
|
||||||
// certificate
|
//certificate
|
||||||
authRouterGroup := r.Group("/auth")
|
authRouterGroup := r.Group("/auth")
|
||||||
{
|
{
|
||||||
a := NewAuthApi(*authRpc)
|
a := NewAuthApi(discov)
|
||||||
authRouterGroup.POST("/user_token", a.UserToken)
|
authRouterGroup.POST("/user_token", a.UserToken)
|
||||||
authRouterGroup.POST("/parse_token", a.ParseToken)
|
authRouterGroup.POST("/parse_token", a.ParseToken)
|
||||||
authRouterGroup.POST("/force_logout", ParseToken, a.ForceLogout)
|
authRouterGroup.POST("/force_logout", ParseToken, a.ForceLogout)
|
||||||
}
|
}
|
||||||
// Third service
|
//Third service
|
||||||
thirdGroup := r.Group("/third", ParseToken)
|
thirdGroup := r.Group("/third", ParseToken)
|
||||||
{
|
{
|
||||||
t := NewThirdApi(*thirdRpc)
|
t := NewThirdApi(discov)
|
||||||
thirdGroup.POST("/fcm_update_token", t.FcmUpdateToken)
|
thirdGroup.POST("/fcm_update_token", t.FcmUpdateToken)
|
||||||
thirdGroup.POST("/set_app_badge", t.SetAppBadge)
|
thirdGroup.POST("/set_app_badge", t.SetAppBadge)
|
||||||
|
|
||||||
@@ -145,7 +135,7 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
|
|||||||
objectGroup.POST("/access_url", t.AccessURL)
|
objectGroup.POST("/access_url", t.AccessURL)
|
||||||
objectGroup.GET("/*name", t.ObjectRedirect)
|
objectGroup.GET("/*name", t.ObjectRedirect)
|
||||||
}
|
}
|
||||||
// Message
|
//Message
|
||||||
msgGroup := r.Group("/msg", ParseToken)
|
msgGroup := r.Group("/msg", ParseToken)
|
||||||
{
|
{
|
||||||
msgGroup.POST("/newest_seq", m.GetSeq)
|
msgGroup.POST("/newest_seq", m.GetSeq)
|
||||||
@@ -164,13 +154,13 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
|
|||||||
msgGroup.POST("/delete_msg_phsical_by_seq", m.DeleteMsgPhysicalBySeq)
|
msgGroup.POST("/delete_msg_phsical_by_seq", m.DeleteMsgPhysicalBySeq)
|
||||||
msgGroup.POST("/delete_msg_physical", m.DeleteMsgPhysical)
|
msgGroup.POST("/delete_msg_physical", m.DeleteMsgPhysical)
|
||||||
|
|
||||||
msgGroup.POST("/batch_send_msg", m.BatchSendMsg)
|
msgGroup.POST("/batch_send_msg", m.ManagementBatchSendMsg)
|
||||||
msgGroup.POST("/check_msg_is_send_success", m.CheckMsgIsSendSuccess)
|
msgGroup.POST("/check_msg_is_send_success", m.CheckMsgIsSendSuccess)
|
||||||
}
|
}
|
||||||
// Conversation
|
//Conversation
|
||||||
conversationGroup := r.Group("/conversation", ParseToken)
|
conversationGroup := r.Group("/conversation", ParseToken)
|
||||||
{
|
{
|
||||||
c := NewConversationApi(*conversationRpc)
|
c := NewConversationApi(discov)
|
||||||
conversationGroup.POST("/get_all_conversations", c.GetAllConversations)
|
conversationGroup.POST("/get_all_conversations", c.GetAllConversations)
|
||||||
conversationGroup.POST("/get_conversation", c.GetConversation)
|
conversationGroup.POST("/get_conversation", c.GetConversation)
|
||||||
conversationGroup.POST("/get_conversations", c.GetConversations)
|
conversationGroup.POST("/get_conversations", c.GetConversations)
|
||||||
|
|||||||
@@ -18,14 +18,15 @@ import (
|
|||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
type StatisticsApi rpcclient.User
|
type StatisticsApi rpcclient.User
|
||||||
|
|
||||||
func NewStatisticsApi(client rpcclient.User) StatisticsApi {
|
func NewStatisticsApi(discov discoveryregistry.SvcDiscoveryRegistry) StatisticsApi {
|
||||||
return StatisticsApi(client)
|
return StatisticsApi(*rpcclient.NewUser(discov))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StatisticsApi) UserRegister(c *gin.Context) {
|
func (s *StatisticsApi) UserRegister(c *gin.Context) {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import (
|
|||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
@@ -30,8 +31,8 @@ import (
|
|||||||
|
|
||||||
type ThirdApi rpcclient.Third
|
type ThirdApi rpcclient.Third
|
||||||
|
|
||||||
func NewThirdApi(client rpcclient.Third) ThirdApi {
|
func NewThirdApi(discov discoveryregistry.SvcDiscoveryRegistry) ThirdApi {
|
||||||
return ThirdApi(client)
|
return ThirdApi(*rpcclient.NewThird(discov))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *ThirdApi) FcmUpdateToken(c *gin.Context) {
|
func (o *ThirdApi) FcmUpdateToken(c *gin.Context) {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
"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/constant"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msggateway"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msggateway"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user"
|
||||||
@@ -30,8 +31,8 @@ import (
|
|||||||
|
|
||||||
type UserApi rpcclient.User
|
type UserApi rpcclient.User
|
||||||
|
|
||||||
func NewUserApi(client rpcclient.User) UserApi {
|
func NewUserApi(discov discoveryregistry.SvcDiscoveryRegistry) UserApi {
|
||||||
return UserApi(client)
|
return UserApi(*rpcclient.NewUser(discov))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *UserApi) UserRegister(c *gin.Context) {
|
func (u *UserApi) UserRegister(c *gin.Context) {
|
||||||
@@ -78,7 +79,7 @@ func (u *UserApi) GetUsersOnlineStatus(c *gin.Context) {
|
|||||||
var respResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult
|
var respResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult
|
||||||
flag := false
|
flag := false
|
||||||
|
|
||||||
// Online push message
|
//Online push message
|
||||||
for _, v := range conns {
|
for _, v := range conns {
|
||||||
msgClient := msggateway.NewMsgGatewayClient(v)
|
msgClient := msggateway.NewMsgGatewayClient(v)
|
||||||
reply, err := msgClient.GetUsersOnlineStatus(c, &req)
|
reply, err := msgClient.GetUsersOnlineStatus(c, &req)
|
||||||
@@ -131,7 +132,7 @@ func (u *UserApi) GetUsersOnlineTokenDetail(c *gin.Context) {
|
|||||||
apiresp.GinError(c, err)
|
apiresp.GinError(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Online push message
|
//Online push message
|
||||||
for _, v := range conns {
|
for _, v := range conns {
|
||||||
msgClient := msggateway.NewMsgGatewayClient(v)
|
msgClient := msggateway.NewMsgGatewayClient(v)
|
||||||
reply, err := msgClient.GetUsersOnlineStatus(c, &req)
|
reply, err := msgClient.GetUsersOnlineStatus(c, &req)
|
||||||
@@ -160,6 +161,7 @@ func (u *UserApi) GetUsersOnlineTokenDetail(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
for p, tokens := range m {
|
for p, tokens := range m {
|
||||||
t := new(msggateway.SinglePlatformToken)
|
t := new(msggateway.SinglePlatformToken)
|
||||||
@@ -175,4 +177,5 @@ func (u *UserApi) GetUsersOnlineTokenDetail(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
apiresp.GinSuccess(c, respResult)
|
apiresp.GinSuccess(c, respResult)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,12 +31,10 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var ErrConnClosed = errors.New("conn has closed")
|
||||||
ErrConnClosed = errors.New("conn has closed")
|
var ErrNotSupportMessageProtocol = errors.New("not support message protocol")
|
||||||
ErrNotSupportMessageProtocol = errors.New("not support message protocol")
|
var ErrClientClosed = errors.New("client actively close the connection")
|
||||||
ErrClientClosed = errors.New("client actively close the connection")
|
var ErrPanic = errors.New("panic error")
|
||||||
ErrPanic = errors.New("panic error")
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// MessageText is for UTF-8 encoded text messages like JSON.
|
// MessageText is for UTF-8 encoded text messages like JSON.
|
||||||
@@ -104,12 +102,10 @@ func (c *Client) ResetClient(
|
|||||||
c.closedErr = nil
|
c.closedErr = nil
|
||||||
c.token = token
|
c.token = token
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) pongHandler(_ string) error {
|
func (c *Client) pongHandler(_ string) error {
|
||||||
c.conn.SetReadDeadline(pongWait)
|
c.conn.SetReadDeadline(pongWait)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) readMessage() {
|
func (c *Client) readMessage() {
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
@@ -128,7 +124,7 @@ func (c *Client) readMessage() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.ZDebug(c.ctx, "readMessage", "messageType", messageType)
|
log.ZDebug(c.ctx, "readMessage", "messageType", messageType)
|
||||||
if c.closed == true { // 连接刚置位已经关闭,但是协程还没退出的场景
|
if c.closed == true { //连接刚置位已经关闭,但是协程还没退出的场景
|
||||||
c.closedErr = ErrConnClosed
|
c.closedErr = ErrConnClosed
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -152,8 +148,8 @@ func (c *Client) readMessage() {
|
|||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
func (c *Client) handleMessage(message []byte) error {
|
func (c *Client) handleMessage(message []byte) error {
|
||||||
if c.IsCompress {
|
if c.IsCompress {
|
||||||
var decompressErr error
|
var decompressErr error
|
||||||
@@ -202,26 +198,26 @@ func (c *Client) handleMessage(message []byte) error {
|
|||||||
}
|
}
|
||||||
c.replyMessage(ctx, &binaryReq, messageErr, resp)
|
c.replyMessage(ctx, &binaryReq, messageErr, resp)
|
||||||
return nil
|
return nil
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
func (c *Client) setAppBackgroundStatus(ctx context.Context, req Req) ([]byte, error) {
|
func (c *Client) setAppBackgroundStatus(ctx context.Context, req Req) ([]byte, error) {
|
||||||
resp, isBackground, messageErr := c.longConnServer.SetUserDeviceBackground(ctx, req)
|
resp, isBackground, messageErr := c.longConnServer.SetUserDeviceBackground(ctx, req)
|
||||||
if messageErr != nil {
|
if messageErr != nil {
|
||||||
return nil, messageErr
|
return nil, messageErr
|
||||||
}
|
}
|
||||||
c.IsBackground = isBackground
|
c.IsBackground = isBackground
|
||||||
// todo callback
|
//todo callback
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
func (c *Client) close() {
|
func (c *Client) close() {
|
||||||
c.w.Lock()
|
c.w.Lock()
|
||||||
defer c.w.Unlock()
|
defer c.w.Unlock()
|
||||||
c.closed = true
|
c.closed = true
|
||||||
c.conn.Close()
|
c.conn.Close()
|
||||||
c.longConnServer.UnRegister(c)
|
c.longConnServer.UnRegister(c)
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
func (c *Client) replyMessage(ctx context.Context, binaryReq *Req, err error, resp []byte) {
|
func (c *Client) replyMessage(ctx context.Context, binaryReq *Req, err error, resp []byte) {
|
||||||
errResp := apiresp.ParseError(err)
|
errResp := apiresp.ParseError(err)
|
||||||
mReply := Resp{
|
mReply := Resp{
|
||||||
@@ -238,7 +234,6 @@ func (c *Client) replyMessage(ctx context.Context, binaryReq *Req, err error, re
|
|||||||
log.ZWarn(ctx, "wireBinaryMsg replyMessage", err, "resp", mReply.String())
|
log.ZWarn(ctx, "wireBinaryMsg replyMessage", err, "resp", mReply.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) PushMessage(ctx context.Context, msgData *sdkws.MsgData) error {
|
func (c *Client) PushMessage(ctx context.Context, msgData *sdkws.MsgData) error {
|
||||||
var msg sdkws.PushMessages
|
var msg sdkws.PushMessages
|
||||||
conversationID := utils.GetConversationIDByMsg(msgData)
|
conversationID := utils.GetConversationIDByMsg(msgData)
|
||||||
@@ -301,4 +296,5 @@ func (c *Client) writePongMsg() error {
|
|||||||
}
|
}
|
||||||
_ = c.conn.SetWriteDeadline(writeWait)
|
_ = c.conn.SetWriteDeadline(writeWait)
|
||||||
return c.conn.WriteMessage(PongMessage, nil)
|
return c.conn.WriteMessage(PongMessage, nil)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ type GzipCompressor struct {
|
|||||||
func NewGzipCompressor() *GzipCompressor {
|
func NewGzipCompressor() *GzipCompressor {
|
||||||
return &GzipCompressor{compressProtocol: "gzip"}
|
return &GzipCompressor{compressProtocol: "gzip"}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GzipCompressor) Compress(rawData []byte) ([]byte, error) {
|
func (g *GzipCompressor) Compress(rawData []byte) ([]byte, error) {
|
||||||
gzipBuffer := bytes.Buffer{}
|
gzipBuffer := bytes.Buffer{}
|
||||||
gz := gzip.NewWriter(&gzipBuffer)
|
gz := gzip.NewWriter(&gzipBuffer)
|
||||||
|
|||||||
@@ -27,13 +27,11 @@ const (
|
|||||||
GzipCompressionProtocol = "gzip"
|
GzipCompressionProtocol = "gzip"
|
||||||
BackgroundStatus = "isBackground"
|
BackgroundStatus = "isBackground"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
WebSocket = iota + 1
|
WebSocket = iota + 1
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// Websocket Protocol.
|
//Websocket Protocol
|
||||||
WSGetNewestSeq = 1001
|
WSGetNewestSeq = 1001
|
||||||
WSPullMsgBySeqList = 1002
|
WSPullMsgBySeqList = 1002
|
||||||
WSSendMsg = 1003
|
WSSendMsg = 1003
|
||||||
|
|||||||
@@ -71,11 +71,9 @@ func newContext(respWriter http.ResponseWriter, req *http.Request) *UserConnCont
|
|||||||
ConnID: utils.Md5(req.RemoteAddr + "_" + strconv.Itoa(int(utils.GetCurrentTimestampByMill()))),
|
ConnID: utils.Md5(req.RemoteAddr + "_" + strconv.Itoa(int(utils.GetCurrentTimestampByMill()))),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) GetRemoteAddr() string {
|
func (c *UserConnContext) GetRemoteAddr() string {
|
||||||
return c.RemoteAddr
|
return c.RemoteAddr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) Query(key string) (string, bool) {
|
func (c *UserConnContext) Query(key string) (string, bool) {
|
||||||
var value string
|
var value string
|
||||||
if value = c.Req.URL.Query().Get(key); value == "" {
|
if value = c.Req.URL.Query().Get(key); value == "" {
|
||||||
@@ -83,7 +81,6 @@ func (c *UserConnContext) Query(key string) (string, bool) {
|
|||||||
}
|
}
|
||||||
return value, true
|
return value, true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) GetHeader(key string) (string, bool) {
|
func (c *UserConnContext) GetHeader(key string) (string, bool) {
|
||||||
var value string
|
var value string
|
||||||
if value = c.Req.Header.Get(key); value == "" {
|
if value = c.Req.Header.Get(key); value == "" {
|
||||||
@@ -91,35 +88,27 @@ func (c *UserConnContext) GetHeader(key string) (string, bool) {
|
|||||||
}
|
}
|
||||||
return value, true
|
return value, true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) SetHeader(key, value string) {
|
func (c *UserConnContext) SetHeader(key, value string) {
|
||||||
c.RespWriter.Header().Set(key, value)
|
c.RespWriter.Header().Set(key, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) ErrReturn(error string, code int) {
|
func (c *UserConnContext) ErrReturn(error string, code int) {
|
||||||
http.Error(c.RespWriter, error, code)
|
http.Error(c.RespWriter, error, code)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) GetConnID() string {
|
func (c *UserConnContext) GetConnID() string {
|
||||||
return c.ConnID
|
return c.ConnID
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) GetUserID() string {
|
func (c *UserConnContext) GetUserID() string {
|
||||||
return c.Req.URL.Query().Get(WsUserID)
|
return c.Req.URL.Query().Get(WsUserID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) GetPlatformID() string {
|
func (c *UserConnContext) GetPlatformID() string {
|
||||||
return c.Req.URL.Query().Get(PlatformID)
|
return c.Req.URL.Query().Get(PlatformID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) GetOperationID() string {
|
func (c *UserConnContext) GetOperationID() string {
|
||||||
return c.Req.URL.Query().Get(OperationID)
|
return c.Req.URL.Query().Get(OperationID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) GetToken() string {
|
func (c *UserConnContext) GetToken() string {
|
||||||
return c.Req.URL.Query().Get(Token)
|
return c.Req.URL.Query().Get(Token)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UserConnContext) GetBackground() bool {
|
func (c *UserConnContext) GetBackground() bool {
|
||||||
b, err := strconv.ParseBool(c.Req.URL.Query().Get(BackgroundStatus))
|
b, err := strconv.ParseBool(c.Req.URL.Query().Get(BackgroundStatus))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -26,12 +26,12 @@ type Encoder interface {
|
|||||||
Decode(encodeData []byte, decodeData interface{}) error
|
Decode(encodeData []byte, decodeData interface{}) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type GobEncoder struct{}
|
type GobEncoder struct {
|
||||||
|
}
|
||||||
|
|
||||||
func NewGobEncoder() *GobEncoder {
|
func NewGobEncoder() *GobEncoder {
|
||||||
return &GobEncoder{}
|
return &GobEncoder{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GobEncoder) Encode(data interface{}) ([]byte, error) {
|
func (g *GobEncoder) Encode(data interface{}) ([]byte, error) {
|
||||||
buff := bytes.Buffer{}
|
buff := bytes.Buffer{}
|
||||||
enc := gob.NewEncoder(&buff)
|
enc := gob.NewEncoder(&buff)
|
||||||
@@ -41,7 +41,6 @@ func (g *GobEncoder) Encode(data interface{}) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
return buff.Bytes(), nil
|
return buff.Bytes(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GobEncoder) Decode(encodeData []byte, decodeData interface{}) error {
|
func (g *GobEncoder) Decode(encodeData []byte, decodeData interface{}) error {
|
||||||
buff := bytes.NewBuffer(encodeData)
|
buff := bytes.NewBuffer(encodeData)
|
||||||
dec := gob.NewDecoder(buff)
|
dec := gob.NewDecoder(buff)
|
||||||
|
|||||||
@@ -25,7 +25,9 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
"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/common/log"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msggateway"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msggateway"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/startrpc"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/startrpc"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
@@ -82,6 +84,9 @@ func (s *Server) GetUsersOnlineStatus(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *msggateway.GetUsersOnlineStatusReq,
|
req *msggateway.GetUsersOnlineStatusReq,
|
||||||
) (*msggateway.GetUsersOnlineStatusResp, error) {
|
) (*msggateway.GetUsersOnlineStatusResp, error) {
|
||||||
|
if !tokenverify.IsAppManagerUid(ctx) {
|
||||||
|
return nil, errs.ErrNoPermission.Wrap("only app manager")
|
||||||
|
}
|
||||||
var resp msggateway.GetUsersOnlineStatusResp
|
var resp msggateway.GetUsersOnlineStatusResp
|
||||||
for _, userID := range req.UserIDs {
|
for _, userID := range req.UserIDs {
|
||||||
clients, ok := s.LongConnServer.GetUserAllCons(userID)
|
clients, ok := s.LongConnServer.GetUserAllCons(userID)
|
||||||
@@ -176,12 +181,13 @@ func (s *Server) KickUserOffline(
|
|||||||
if clients, _, ok := s.LongConnServer.GetUserPlatformCons(v, int(req.PlatformID)); ok {
|
if clients, _, ok := s.LongConnServer.GetUserPlatformCons(v, int(req.PlatformID)); ok {
|
||||||
for _, client := range clients {
|
for _, client := range clients {
|
||||||
log.ZDebug(ctx, "kick user offline", "userID", v, "platformID", req.PlatformID, "client", client)
|
log.ZDebug(ctx, "kick user offline", "userID", v, "platformID", req.PlatformID, "client", client)
|
||||||
if err := client.longConnServer.KickUserConn(client); err != nil {
|
err := client.KickOnlineMessage()
|
||||||
log.ZWarn(ctx, "kick user offline failed", err, "userID", v, "platformID", req.PlatformID)
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.ZInfo(ctx, "conn not exist", "userID", v, "platformID", req.PlatformID)
|
log.ZWarn(ctx, "conn not exist", nil, "userID", v, "platformID", req.PlatformID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return &msggateway.KickUserOfflineResp{}, nil
|
return &msggateway.KickUserOfflineResp{}, nil
|
||||||
@@ -191,6 +197,6 @@ func (s *Server) MultiTerminalLoginCheck(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *msggateway.MultiTerminalLoginCheckReq,
|
req *msggateway.MultiTerminalLoginCheckReq,
|
||||||
) (*msggateway.MultiTerminalLoginCheckResp, error) {
|
) (*msggateway.MultiTerminalLoginCheckResp, error) {
|
||||||
// TODO implement me
|
//TODO implement me
|
||||||
panic("implement me")
|
panic("implement me")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,14 +22,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type LongConn interface {
|
type LongConn interface {
|
||||||
// Close this connection
|
//Close this connection
|
||||||
Close() error
|
Close() error
|
||||||
// WriteMessage Write message to connection,messageType means data type,can be set binary(2) and text(1).
|
// WriteMessage Write message to connection,messageType means data type,can be set binary(2) and text(1).
|
||||||
WriteMessage(messageType int, message []byte) error
|
WriteMessage(messageType int, message []byte) error
|
||||||
// ReadMessage Read message from connection.
|
// ReadMessage Read message from connection.
|
||||||
ReadMessage() (int, []byte, error)
|
ReadMessage() (int, []byte, error)
|
||||||
// SetReadDeadline sets the read deadline on the underlying network connection,
|
// SetReadDeadline sets the read deadline on the underlying network connection,
|
||||||
// after a read has timed out, will return an error.
|
//after a read has timed out, will return an error.
|
||||||
SetReadDeadline(timeout time.Duration) error
|
SetReadDeadline(timeout time.Duration) error
|
||||||
// SetWriteDeadline sets to write deadline when send message,when read has timed out,will return error.
|
// SetWriteDeadline sets to write deadline when send message,when read has timed out,will return error.
|
||||||
SetWriteDeadline(timeout time.Duration) error
|
SetWriteDeadline(timeout time.Duration) error
|
||||||
@@ -58,7 +58,6 @@ func newGWebSocket(protocolType int, handshakeTimeout time.Duration) *GWebSocket
|
|||||||
func (d *GWebSocket) Close() error {
|
func (d *GWebSocket) Close() error {
|
||||||
return d.conn.Close()
|
return d.conn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *GWebSocket) GenerateLongConn(w http.ResponseWriter, r *http.Request) error {
|
func (d *GWebSocket) GenerateLongConn(w http.ResponseWriter, r *http.Request) error {
|
||||||
upgrader := &websocket.Upgrader{
|
upgrader := &websocket.Upgrader{
|
||||||
HandshakeTimeout: d.handshakeTimeout,
|
HandshakeTimeout: d.handshakeTimeout,
|
||||||
@@ -70,10 +69,10 @@ func (d *GWebSocket) GenerateLongConn(w http.ResponseWriter, r *http.Request) er
|
|||||||
}
|
}
|
||||||
d.conn = conn
|
d.conn = conn
|
||||||
return nil
|
return nil
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
func (d *GWebSocket) WriteMessage(messageType int, message []byte) error {
|
func (d *GWebSocket) WriteMessage(messageType int, message []byte) error {
|
||||||
// d.setSendConn(d.conn)
|
//d.setSendConn(d.conn)
|
||||||
return d.conn.WriteMessage(messageType, message)
|
return d.conn.WriteMessage(messageType, message)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +83,6 @@ func (d *GWebSocket) WriteMessage(messageType int, message []byte) error {
|
|||||||
func (d *GWebSocket) ReadMessage() (int, []byte, error) {
|
func (d *GWebSocket) ReadMessage() (int, []byte, error) {
|
||||||
return d.conn.ReadMessage()
|
return d.conn.ReadMessage()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *GWebSocket) SetReadDeadline(timeout time.Duration) error {
|
func (d *GWebSocket) SetReadDeadline(timeout time.Duration) error {
|
||||||
return d.conn.SetReadDeadline(time.Now().Add(timeout))
|
return d.conn.SetReadDeadline(time.Now().Add(timeout))
|
||||||
}
|
}
|
||||||
@@ -99,6 +97,7 @@ func (d *GWebSocket) Dial(urlStr string, requestHeader http.Header) (*http.Respo
|
|||||||
d.conn = conn
|
d.conn = conn
|
||||||
}
|
}
|
||||||
return httpResp, err
|
return httpResp, err
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *GWebSocket) IsNil() bool {
|
func (d *GWebSocket) IsNil() bool {
|
||||||
@@ -111,11 +110,9 @@ func (d *GWebSocket) IsNil() bool {
|
|||||||
func (d *GWebSocket) SetConnNil() {
|
func (d *GWebSocket) SetConnNil() {
|
||||||
d.conn = nil
|
d.conn = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *GWebSocket) SetReadLimit(limit int64) {
|
func (d *GWebSocket) SetReadLimit(limit int64) {
|
||||||
d.conn.SetReadLimit(limit)
|
d.conn.SetReadLimit(limit)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *GWebSocket) SetPongHandler(handler PongHandler) {
|
func (d *GWebSocket) SetPongHandler(handler PongHandler) {
|
||||||
d.conn.SetPongHandler(handler)
|
d.conn.SetPongHandler(handler)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,10 +75,8 @@ type GrpcHandler struct {
|
|||||||
func NewGrpcHandler(validate *validator.Validate, client discoveryregistry.SvcDiscoveryRegistry) *GrpcHandler {
|
func NewGrpcHandler(validate *validator.Validate, client discoveryregistry.SvcDiscoveryRegistry) *GrpcHandler {
|
||||||
msgRpcClient := rpcclient.NewMessageRpcClient(client)
|
msgRpcClient := rpcclient.NewMessageRpcClient(client)
|
||||||
pushRpcClient := rpcclient.NewPushRpcClient(client)
|
pushRpcClient := rpcclient.NewPushRpcClient(client)
|
||||||
return &GrpcHandler{
|
return &GrpcHandler{msgRpcClient: &msgRpcClient,
|
||||||
msgRpcClient: &msgRpcClient,
|
pushClient: &pushRpcClient, validate: validate}
|
||||||
pushClient: &pushRpcClient, validate: validate,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g GrpcHandler) GetSeq(context context.Context, data Req) ([]byte, error) {
|
func (g GrpcHandler) GetSeq(context context.Context, data Req) ([]byte, error) {
|
||||||
@@ -166,7 +164,6 @@ func (g GrpcHandler) UserLogout(context context.Context, data Req) ([]byte, erro
|
|||||||
}
|
}
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g GrpcHandler) SetUserDeviceBackground(_ context.Context, data Req) ([]byte, bool, error) {
|
func (g GrpcHandler) SetUserDeviceBackground(_ context.Context, data Req) ([]byte, bool, error) {
|
||||||
req := sdkws.SetAppBackgroundStatusReq{}
|
req := sdkws.SetAppBackgroundStatusReq{}
|
||||||
if err := proto.Unmarshal(data.Data, &req); err != nil {
|
if err := proto.Unmarshal(data.Data, &req); err != nil {
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ type LongConnServer interface {
|
|||||||
Validate(s interface{}) error
|
Validate(s interface{}) error
|
||||||
SetCacheHandler(cache cache.MsgModel)
|
SetCacheHandler(cache cache.MsgModel)
|
||||||
SetDiscoveryRegistry(client discoveryregistry.SvcDiscoveryRegistry)
|
SetDiscoveryRegistry(client discoveryregistry.SvcDiscoveryRegistry)
|
||||||
KickUserConn(client *Client) error
|
|
||||||
UnRegister(c *Client)
|
UnRegister(c *Client)
|
||||||
Compressor
|
Compressor
|
||||||
Encoder
|
Encoder
|
||||||
@@ -87,7 +86,6 @@ type kickHandler struct {
|
|||||||
func (ws *WsServer) SetDiscoveryRegistry(client discoveryregistry.SvcDiscoveryRegistry) {
|
func (ws *WsServer) SetDiscoveryRegistry(client discoveryregistry.SvcDiscoveryRegistry) {
|
||||||
ws.MessageHandler = NewGrpcHandler(ws.validate, client)
|
ws.MessageHandler = NewGrpcHandler(ws.validate, client)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *WsServer) SetCacheHandler(cache cache.MsgModel) {
|
func (ws *WsServer) SetCacheHandler(cache cache.MsgModel) {
|
||||||
ws.cache = cache
|
ws.cache = cache
|
||||||
}
|
}
|
||||||
@@ -115,6 +113,7 @@ func NewWsServer(opts ...Option) (*WsServer, error) {
|
|||||||
}
|
}
|
||||||
if config.port < 1024 {
|
if config.port < 1024 {
|
||||||
return nil, errors.New("port not allow to listen")
|
return nil, errors.New("port not allow to listen")
|
||||||
|
|
||||||
}
|
}
|
||||||
v := validator.New()
|
v := validator.New()
|
||||||
return &WsServer{
|
return &WsServer{
|
||||||
@@ -135,7 +134,6 @@ func NewWsServer(opts ...Option) (*WsServer, error) {
|
|||||||
Encoder: NewGobEncoder(),
|
Encoder: NewGobEncoder(),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *WsServer) Run() error {
|
func (ws *WsServer) Run() error {
|
||||||
var client *Client
|
var client *Client
|
||||||
go func() {
|
go func() {
|
||||||
@@ -146,13 +144,13 @@ func (ws *WsServer) Run() error {
|
|||||||
case client = <-ws.unregisterChan:
|
case client = <-ws.unregisterChan:
|
||||||
ws.unregisterClient(client)
|
ws.unregisterClient(client)
|
||||||
case onlineInfo := <-ws.kickHandlerChan:
|
case onlineInfo := <-ws.kickHandlerChan:
|
||||||
ws.multiTerminalLoginChecker(onlineInfo.clientOK, onlineInfo.oldClients, onlineInfo.newClient)
|
ws.multiTerminalLoginChecker(onlineInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
http.HandleFunc("/", ws.wsHandler)
|
http.HandleFunc("/", ws.wsHandler)
|
||||||
// http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {})
|
// http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {})
|
||||||
return http.ListenAndServe(":"+utils.IntToString(ws.port), nil) // Start listening
|
return http.ListenAndServe(":"+utils.IntToString(ws.port), nil) //Start listening
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *WsServer) registerClient(client *Client) {
|
func (ws *WsServer) registerClient(client *Client) {
|
||||||
@@ -167,6 +165,7 @@ func (ws *WsServer) registerClient(client *Client) {
|
|||||||
log.ZDebug(client.ctx, "user not exist", "userID", client.UserID, "platformID", client.PlatformID)
|
log.ZDebug(client.ctx, "user not exist", "userID", client.UserID, "platformID", client.PlatformID)
|
||||||
atomic.AddInt64(&ws.onlineUserNum, 1)
|
atomic.AddInt64(&ws.onlineUserNum, 1)
|
||||||
atomic.AddInt64(&ws.onlineUserConnNum, 1)
|
atomic.AddInt64(&ws.onlineUserConnNum, 1)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
i := &kickHandler{
|
i := &kickHandler{
|
||||||
clientOK: clientOK,
|
clientOK: clientOK,
|
||||||
@@ -177,7 +176,7 @@ func (ws *WsServer) registerClient(client *Client) {
|
|||||||
log.ZDebug(client.ctx, "user exist", "userID", client.UserID, "platformID", client.PlatformID)
|
log.ZDebug(client.ctx, "user exist", "userID", client.UserID, "platformID", client.PlatformID)
|
||||||
if clientOK {
|
if clientOK {
|
||||||
ws.clients.Set(client.UserID, client)
|
ws.clients.Set(client.UserID, client)
|
||||||
// 已经有同平台的连接存在
|
//已经有同平台的连接存在
|
||||||
log.ZInfo(client.ctx, "repeat login", "userID", client.UserID, "platformID", client.PlatformID, "old remote addr", getRemoteAdders(oldClients))
|
log.ZInfo(client.ctx, "repeat login", "userID", client.UserID, "platformID", client.PlatformID, "old remote addr", getRemoteAdders(oldClients))
|
||||||
atomic.AddInt64(&ws.onlineUserConnNum, 1)
|
atomic.AddInt64(&ws.onlineUserConnNum, 1)
|
||||||
} else {
|
} else {
|
||||||
@@ -195,7 +194,6 @@ func (ws *WsServer) registerClient(client *Client) {
|
|||||||
ws.onlineUserConnNum,
|
ws.onlineUserConnNum,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getRemoteAdders(client []*Client) string {
|
func getRemoteAdders(client []*Client) string {
|
||||||
var ret string
|
var ret string
|
||||||
for i, c := range client {
|
for i, c := range client {
|
||||||
@@ -208,83 +206,86 @@ func getRemoteAdders(client []*Client) string {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *WsServer) KickUserConn(client *Client) error {
|
func (ws *WsServer) multiTerminalLoginChecker(info *kickHandler) {
|
||||||
ws.clients.deleteClients(client.UserID, []*Client{client})
|
|
||||||
return client.KickOnlineMessage()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WsServer) multiTerminalLoginChecker(clientOK bool, oldClients []*Client, newClient *Client) {
|
|
||||||
switch config.Config.MultiLoginPolicy {
|
switch config.Config.MultiLoginPolicy {
|
||||||
case constant.DefalutNotKick:
|
case constant.DefalutNotKick:
|
||||||
case constant.PCAndOther:
|
case constant.PCAndOther:
|
||||||
if constant.PlatformIDToClass(newClient.PlatformID) == constant.TerminalPC {
|
if constant.PlatformIDToClass(info.newClient.PlatformID) == constant.TerminalPC {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fallthrough
|
fallthrough
|
||||||
case constant.AllLoginButSameTermKick:
|
case constant.AllLoginButSameTermKick:
|
||||||
if clientOK {
|
if info.clientOK {
|
||||||
ws.clients.deleteClients(newClient.UserID, oldClients)
|
ws.clients.deleteClients(info.newClient.UserID, info.oldClients)
|
||||||
for _, c := range oldClients {
|
for _, c := range info.oldClients {
|
||||||
err := c.KickOnlineMessage()
|
err := c.KickOnlineMessage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.ZWarn(c.ctx, "KickOnlineMessage", err)
|
log.ZWarn(c.ctx, "KickOnlineMessage", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m, err := ws.cache.GetTokensWithoutError(
|
m, err := ws.cache.GetTokensWithoutError(
|
||||||
newClient.ctx,
|
info.newClient.ctx,
|
||||||
newClient.UserID,
|
info.newClient.UserID,
|
||||||
newClient.PlatformID,
|
info.newClient.PlatformID,
|
||||||
)
|
)
|
||||||
if err != nil && err != redis.Nil {
|
if err != nil && err != redis.Nil {
|
||||||
log.ZWarn(
|
log.ZWarn(
|
||||||
newClient.ctx,
|
info.newClient.ctx,
|
||||||
"get token from redis err",
|
"get token from redis err",
|
||||||
err,
|
err,
|
||||||
"userID",
|
"userID",
|
||||||
newClient.UserID,
|
info.newClient.UserID,
|
||||||
"platformID",
|
"platformID",
|
||||||
newClient.PlatformID,
|
info.newClient.PlatformID,
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if m == nil {
|
if m == nil {
|
||||||
log.ZWarn(
|
log.ZWarn(
|
||||||
newClient.ctx,
|
info.newClient.ctx,
|
||||||
"m is nil",
|
"m is nil",
|
||||||
errors.New("m is nil"),
|
errors.New("m is nil"),
|
||||||
"userID",
|
"userID",
|
||||||
newClient.UserID,
|
info.newClient.UserID,
|
||||||
"platformID",
|
"platformID",
|
||||||
newClient.PlatformID,
|
info.newClient.PlatformID,
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.ZDebug(
|
log.ZDebug(
|
||||||
newClient.ctx,
|
info.newClient.ctx,
|
||||||
"get token from redis",
|
"get token from redis",
|
||||||
"userID",
|
"userID",
|
||||||
newClient.UserID,
|
info.newClient.UserID,
|
||||||
"platformID",
|
"platformID",
|
||||||
newClient.PlatformID,
|
info.newClient.PlatformID,
|
||||||
"tokenMap",
|
"tokenMap",
|
||||||
m,
|
m,
|
||||||
)
|
)
|
||||||
|
|
||||||
for k := range m {
|
for k := range m {
|
||||||
if k != newClient.ctx.GetToken() {
|
if k != info.newClient.ctx.GetToken() {
|
||||||
m[k] = constant.KickedToken
|
m[k] = constant.KickedToken
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.ZDebug(newClient.ctx, "set token map is ", "token map", m, "userID", newClient.UserID)
|
log.ZDebug(info.newClient.ctx, "set token map is ", "token map", m, "userID", info.newClient.UserID)
|
||||||
err = ws.cache.SetTokenMapByUidPid(newClient.ctx, newClient.UserID, newClient.PlatformID, m)
|
err = ws.cache.SetTokenMapByUidPid(info.newClient.ctx, info.newClient.UserID, info.newClient.PlatformID, m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.ZWarn(newClient.ctx, "SetTokenMapByUidPid err", err, "userID", newClient.UserID, "platformID", newClient.PlatformID)
|
log.ZWarn(
|
||||||
|
info.newClient.ctx,
|
||||||
|
"SetTokenMapByUidPid err",
|
||||||
|
err,
|
||||||
|
"userID",
|
||||||
|
info.newClient.UserID,
|
||||||
|
"platformID",
|
||||||
|
info.newClient.PlatformID,
|
||||||
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
func (ws *WsServer) unregisterClient(client *Client) {
|
func (ws *WsServer) unregisterClient(client *Client) {
|
||||||
defer ws.clientPool.Put(client)
|
defer ws.clientPool.Put(client)
|
||||||
isDeleteUser := ws.clients.delete(client.UserID, client.ctx.GetRemoteAddr())
|
isDeleteUser := ws.clients.delete(client.UserID, client.ctx.GetRemoteAddr())
|
||||||
|
|||||||
@@ -16,38 +16,33 @@ package msggateway
|
|||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
type (
|
type Option func(opt *configs)
|
||||||
Option func(opt *configs)
|
type configs struct {
|
||||||
configs struct {
|
//长连接监听端口
|
||||||
// 长连接监听端口
|
|
||||||
port int
|
port int
|
||||||
// 长连接允许最大链接数
|
//长连接允许最大链接数
|
||||||
maxConnNum int64
|
maxConnNum int64
|
||||||
// 连接握手超时时间
|
//连接握手超时时间
|
||||||
handshakeTimeout time.Duration
|
handshakeTimeout time.Duration
|
||||||
// 允许消息最大长度
|
//允许消息最大长度
|
||||||
messageMaxMsgLength int
|
messageMaxMsgLength int
|
||||||
}
|
}
|
||||||
)
|
|
||||||
|
|
||||||
func WithPort(port int) Option {
|
func WithPort(port int) Option {
|
||||||
return func(opt *configs) {
|
return func(opt *configs) {
|
||||||
opt.port = port
|
opt.port = port
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithMaxConnNum(num int64) Option {
|
func WithMaxConnNum(num int64) Option {
|
||||||
return func(opt *configs) {
|
return func(opt *configs) {
|
||||||
opt.maxConnNum = num
|
opt.maxConnNum = num
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithHandshakeTimeout(t time.Duration) Option {
|
func WithHandshakeTimeout(t time.Duration) Option {
|
||||||
return func(opt *configs) {
|
return func(opt *configs) {
|
||||||
opt.handshakeTimeout = t
|
opt.handshakeTimeout = t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithMessageMaxMsgLength(length int) Option {
|
func WithMessageMaxMsgLength(length int) Option {
|
||||||
return func(opt *configs) {
|
return func(opt *configs) {
|
||||||
opt.messageMaxMsgLength = length
|
opt.messageMaxMsgLength = length
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ type UserMap struct {
|
|||||||
func newUserMap() *UserMap {
|
func newUserMap() *UserMap {
|
||||||
return &UserMap{}
|
return &UserMap{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *UserMap) GetAll(key string) ([]*Client, bool) {
|
func (u *UserMap) GetAll(key string) ([]*Client, bool) {
|
||||||
allClients, ok := u.m.Load(key)
|
allClients, ok := u.m.Load(key)
|
||||||
if ok {
|
if ok {
|
||||||
@@ -37,7 +36,6 @@ func (u *UserMap) GetAll(key string) ([]*Client, bool) {
|
|||||||
}
|
}
|
||||||
return nil, ok
|
return nil, ok
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *UserMap) Get(key string, platformID int) ([]*Client, bool, bool) {
|
func (u *UserMap) Get(key string, platformID int) ([]*Client, bool, bool) {
|
||||||
allClients, userExisted := u.m.Load(key)
|
allClients, userExisted := u.m.Load(key)
|
||||||
if userExisted {
|
if userExisted {
|
||||||
@@ -49,12 +47,12 @@ func (u *UserMap) Get(key string, platformID int) ([]*Client, bool, bool) {
|
|||||||
}
|
}
|
||||||
if len(clients) > 0 {
|
if len(clients) > 0 {
|
||||||
return clients, userExisted, true
|
return clients, userExisted, true
|
||||||
|
|
||||||
}
|
}
|
||||||
return clients, userExisted, false
|
return clients, userExisted, false
|
||||||
}
|
}
|
||||||
return nil, userExisted, false
|
return nil, userExisted, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *UserMap) Set(key string, v *Client) {
|
func (u *UserMap) Set(key string, v *Client) {
|
||||||
allClients, existed := u.m.Load(key)
|
allClients, existed := u.m.Load(key)
|
||||||
if existed {
|
if existed {
|
||||||
@@ -69,7 +67,6 @@ func (u *UserMap) Set(key string, v *Client) {
|
|||||||
u.m.Store(key, clients)
|
u.m.Store(key, clients)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *UserMap) delete(key string, connRemoteAddr string) (isDeleteUser bool) {
|
func (u *UserMap) delete(key string, connRemoteAddr string) (isDeleteUser bool) {
|
||||||
allClients, existed := u.m.Load(key)
|
allClients, existed := u.m.Load(key)
|
||||||
if existed {
|
if existed {
|
||||||
@@ -90,7 +87,6 @@ func (u *UserMap) delete(key string, connRemoteAddr string) (isDeleteUser bool)
|
|||||||
}
|
}
|
||||||
return existed
|
return existed
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *UserMap) deleteClients(key string, clients []*Client) (isDeleteUser bool) {
|
func (u *UserMap) deleteClients(key string, clients []*Client) (isDeleteUser bool) {
|
||||||
m := utils.SliceToMapAny(clients, func(c *Client) (string, struct{}) {
|
m := utils.SliceToMapAny(clients, func(c *Client) (string, struct{}) {
|
||||||
return c.ctx.GetRemoteAddr(), struct{}{}
|
return c.ctx.GetRemoteAddr(), struct{}{}
|
||||||
@@ -114,7 +110,6 @@ func (u *UserMap) deleteClients(key string, clients []*Client) (isDeleteUser boo
|
|||||||
}
|
}
|
||||||
return existed
|
return existed
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *UserMap) DeleteAll(key string) {
|
func (u *UserMap) DeleteAll(key string) {
|
||||||
u.m.Delete(key)
|
u.m.Delete(key)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,9 +19,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
"google.golang.org/grpc/credentials/insecure"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
||||||
@@ -33,6 +30,8 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
||||||
openKeeper "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry/zookeeper"
|
openKeeper "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry/zookeeper"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MsgTransfer struct {
|
type MsgTransfer struct {
|
||||||
@@ -75,7 +74,7 @@ func StartTransfer(prometheusPort int) error {
|
|||||||
msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase())
|
msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase())
|
||||||
msgMysModel := relation.NewChatLogGorm(db)
|
msgMysModel := relation.NewChatLogGorm(db)
|
||||||
chatLogDatabase := controller.NewChatLogDatabase(msgMysModel)
|
chatLogDatabase := controller.NewChatLogDatabase(msgMysModel)
|
||||||
msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, msgModel)
|
msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, msgModel, msgMysModel)
|
||||||
conversationRpcClient := rpcclient.NewConversationRpcClient(client)
|
conversationRpcClient := rpcclient.NewConversationRpcClient(client)
|
||||||
groupRpcClient := rpcclient.NewGroupRpcClient(client)
|
groupRpcClient := rpcclient.NewGroupRpcClient(client)
|
||||||
msgTransfer := NewMsgTransfer(chatLogDatabase, msgDatabase, &conversationRpcClient, &groupRpcClient)
|
msgTransfer := NewMsgTransfer(chatLogDatabase, msgDatabase, &conversationRpcClient, &groupRpcClient)
|
||||||
@@ -85,12 +84,9 @@ func StartTransfer(prometheusPort int) error {
|
|||||||
|
|
||||||
func NewMsgTransfer(chatLogDatabase controller.ChatLogDatabase,
|
func NewMsgTransfer(chatLogDatabase controller.ChatLogDatabase,
|
||||||
msgDatabase controller.CommonMsgDatabase,
|
msgDatabase controller.CommonMsgDatabase,
|
||||||
conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient,
|
conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient) *MsgTransfer {
|
||||||
) *MsgTransfer {
|
return &MsgTransfer{persistentCH: NewPersistentConsumerHandler(chatLogDatabase), historyCH: NewOnlineHistoryRedisConsumerHandler(msgDatabase, conversationRpcClient, groupRpcClient),
|
||||||
return &MsgTransfer{
|
historyMongoCH: NewOnlineHistoryMongoConsumerHandler(msgDatabase)}
|
||||||
persistentCH: NewPersistentConsumerHandler(chatLogDatabase), historyCH: NewOnlineHistoryRedisConsumerHandler(msgDatabase, conversationRpcClient, groupRpcClient),
|
|
||||||
historyMongoCH: NewOnlineHistoryMongoConsumerHandler(msgDatabase),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MsgTransfer) initPrometheus() {
|
func (m *MsgTransfer) initPrometheus() {
|
||||||
|
|||||||
@@ -38,12 +38,10 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const ConsumerMsgs = 3
|
||||||
ConsumerMsgs = 3
|
const SourceMessages = 4
|
||||||
SourceMessages = 4
|
const MongoMessages = 5
|
||||||
MongoMessages = 5
|
const ChannelNum = 100
|
||||||
ChannelNum = 100
|
|
||||||
)
|
|
||||||
|
|
||||||
type MsgChannelValue struct {
|
type MsgChannelValue struct {
|
||||||
uniqueKey string
|
uniqueKey string
|
||||||
@@ -87,7 +85,7 @@ func NewOnlineHistoryRedisConsumerHandler(
|
|||||||
) *OnlineHistoryRedisConsumerHandler {
|
) *OnlineHistoryRedisConsumerHandler {
|
||||||
var och OnlineHistoryRedisConsumerHandler
|
var och OnlineHistoryRedisConsumerHandler
|
||||||
och.msgDatabase = database
|
och.msgDatabase = database
|
||||||
och.msgDistributionCh = make(chan Cmd2Value) // no buffer channel
|
och.msgDistributionCh = make(chan Cmd2Value) //no buffer channel
|
||||||
go och.MessagesDistributionHandle()
|
go och.MessagesDistributionHandle()
|
||||||
for i := 0; i < ChannelNum; i++ {
|
for i := 0; i < ChannelNum; i++ {
|
||||||
och.chArrays[i] = make(chan Cmd2Value, 50)
|
och.chArrays[i] = make(chan Cmd2Value, 50)
|
||||||
@@ -95,10 +93,8 @@ func NewOnlineHistoryRedisConsumerHandler(
|
|||||||
}
|
}
|
||||||
och.conversationRpcClient = conversationRpcClient
|
och.conversationRpcClient = conversationRpcClient
|
||||||
och.groupRpcClient = groupRpcClient
|
och.groupRpcClient = groupRpcClient
|
||||||
och.historyConsumerGroup = kafka.NewMConsumerGroup(&kafka.MConsumerGroupConfig{
|
och.historyConsumerGroup = kafka.NewMConsumerGroup(&kafka.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0,
|
||||||
KafkaVersion: sarama.V2_0_0_0,
|
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.LatestMsgToRedis.Topic},
|
||||||
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false,
|
|
||||||
}, []string{config.Config.Kafka.LatestMsgToRedis.Topic},
|
|
||||||
config.Config.Kafka.Addr, config.Config.Kafka.ConsumerGroupID.MsgToRedis)
|
config.Config.Kafka.Addr, config.Config.Kafka.ConsumerGroupID.MsgToRedis)
|
||||||
// statistics.NewStatistics(&och.singleMsgSuccessCount, config.Config.ModuleName.MsgTransferName, fmt.Sprintf("%d
|
// statistics.NewStatistics(&och.singleMsgSuccessCount, config.Config.ModuleName.MsgTransferName, fmt.Sprintf("%d
|
||||||
// second singleMsgCount insert to mongo", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval)
|
// second singleMsgCount insert to mongo", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval)
|
||||||
@@ -167,7 +163,7 @@ func (och *OnlineHistoryRedisConsumerHandler) Run(channelID int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取消息/通知 存储的消息列表, 不存储并且推送的消息列表,.
|
// 获取消息/通知 存储的消息列表, 不存储并且推送的消息列表,
|
||||||
func (och *OnlineHistoryRedisConsumerHandler) getPushStorageMsgList(
|
func (och *OnlineHistoryRedisConsumerHandler) getPushStorageMsgList(
|
||||||
totalMsgs []*ContextMsg,
|
totalMsgs []*ContextMsg,
|
||||||
) (storageMsgList, notStorageMsgList, storageNotificatoinList, notStorageNotificationList, modifyMsgList []*sdkws.MsgData) {
|
) (storageMsgList, notStorageMsgList, storageNotificatoinList, notStorageNotificationList, modifyMsgList []*sdkws.MsgData) {
|
||||||
@@ -316,7 +312,7 @@ func (och *OnlineHistoryRedisConsumerHandler) MessagesDistributionHandle() {
|
|||||||
triggerChannelValue := cmd.Value.(TriggerChannelValue)
|
triggerChannelValue := cmd.Value.(TriggerChannelValue)
|
||||||
ctx := triggerChannelValue.ctx
|
ctx := triggerChannelValue.ctx
|
||||||
consumerMessages := triggerChannelValue.cMsgList
|
consumerMessages := triggerChannelValue.cMsgList
|
||||||
// Aggregation map[userid]message list
|
//Aggregation map[userid]message list
|
||||||
log.ZDebug(ctx, "batch messages come to distribution center", "length", len(consumerMessages))
|
log.ZDebug(ctx, "batch messages come to distribution center", "length", len(consumerMessages))
|
||||||
for i := 0; i < len(consumerMessages); i++ {
|
for i := 0; i < len(consumerMessages); i++ {
|
||||||
ctxMsg := &ContextMsg{}
|
ctxMsg := &ContextMsg{}
|
||||||
@@ -382,13 +378,13 @@ func (och *OnlineHistoryRedisConsumerHandler) MessagesDistributionHandle() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func withAggregationCtx(ctx context.Context, values []*ContextMsg) context.Context {
|
func withAggregationCtx(ctx context.Context, values []*ContextMsg) context.Context {
|
||||||
var allMessageOperationID string
|
var allMessageOperationID string
|
||||||
for i, v := range values {
|
for i, v := range values {
|
||||||
if opid := mcontext.GetOperationID(v.ctx); opid != "" {
|
if opid := mcontext.GetOperationID(v.ctx); opid != "" {
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
allMessageOperationID += opid
|
allMessageOperationID += opid
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
allMessageOperationID += "$" + opid
|
allMessageOperationID += "$" + opid
|
||||||
}
|
}
|
||||||
@@ -435,15 +431,13 @@ func (och *OnlineHistoryRedisConsumerHandler) ConsumeClaim(
|
|||||||
ctx := mcontext.WithTriggerIDContext(context.Background(), utils.OperationIDGenerator())
|
ctx := mcontext.WithTriggerIDContext(context.Background(), utils.OperationIDGenerator())
|
||||||
log.ZDebug(ctx, "timer trigger msg consumer start", "length", len(ccMsg))
|
log.ZDebug(ctx, "timer trigger msg consumer start", "length", len(ccMsg))
|
||||||
for i := 0; i < len(ccMsg)/split; i++ {
|
for i := 0; i < len(ccMsg)/split; i++ {
|
||||||
// log.Debug()
|
//log.Debug()
|
||||||
och.msgDistributionCh <- Cmd2Value{Cmd: ConsumerMsgs, Value: TriggerChannelValue{
|
och.msgDistributionCh <- Cmd2Value{Cmd: ConsumerMsgs, Value: TriggerChannelValue{
|
||||||
ctx: ctx, cMsgList: ccMsg[i*split : (i+1)*split],
|
ctx: ctx, cMsgList: ccMsg[i*split : (i+1)*split]}}
|
||||||
}}
|
|
||||||
}
|
}
|
||||||
if (len(ccMsg) % split) > 0 {
|
if (len(ccMsg) % split) > 0 {
|
||||||
och.msgDistributionCh <- Cmd2Value{Cmd: ConsumerMsgs, Value: TriggerChannelValue{
|
och.msgDistributionCh <- Cmd2Value{Cmd: ConsumerMsgs, Value: TriggerChannelValue{
|
||||||
ctx: ctx, cMsgList: ccMsg[split*(len(ccMsg)/split):],
|
ctx: ctx, cMsgList: ccMsg[split*(len(ccMsg)/split):]}}
|
||||||
}}
|
|
||||||
}
|
}
|
||||||
log.ZDebug(ctx, "timer trigger msg consumer end", "length", len(ccMsg))
|
log.ZDebug(ctx, "timer trigger msg consumer end", "length", len(ccMsg))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,10 +34,8 @@ type OnlineHistoryMongoConsumerHandler struct {
|
|||||||
|
|
||||||
func NewOnlineHistoryMongoConsumerHandler(database controller.CommonMsgDatabase) *OnlineHistoryMongoConsumerHandler {
|
func NewOnlineHistoryMongoConsumerHandler(database controller.CommonMsgDatabase) *OnlineHistoryMongoConsumerHandler {
|
||||||
mc := &OnlineHistoryMongoConsumerHandler{
|
mc := &OnlineHistoryMongoConsumerHandler{
|
||||||
historyConsumerGroup: kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{
|
historyConsumerGroup: kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0,
|
||||||
KafkaVersion: sarama.V2_0_0_0,
|
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.MsgToMongo.Topic},
|
||||||
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false,
|
|
||||||
}, []string{config.Config.Kafka.MsgToMongo.Topic},
|
|
||||||
config.Config.Kafka.Addr, config.Config.Kafka.ConsumerGroupID.MsgToMongo),
|
config.Config.Kafka.Addr, config.Config.Kafka.ConsumerGroupID.MsgToMongo),
|
||||||
msgDatabase: database,
|
msgDatabase: database,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,10 +36,8 @@ type PersistentConsumerHandler struct {
|
|||||||
|
|
||||||
func NewPersistentConsumerHandler(database controller.ChatLogDatabase) *PersistentConsumerHandler {
|
func NewPersistentConsumerHandler(database controller.ChatLogDatabase) *PersistentConsumerHandler {
|
||||||
return &PersistentConsumerHandler{
|
return &PersistentConsumerHandler{
|
||||||
persistentConsumerGroup: kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{
|
persistentConsumerGroup: kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0,
|
||||||
KafkaVersion: sarama.V2_0_0_0,
|
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.LatestMsgToRedis.Topic},
|
||||||
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false,
|
|
||||||
}, []string{config.Config.Kafka.LatestMsgToRedis.Topic},
|
|
||||||
config.Config.Kafka.Addr, config.Config.Kafka.ConsumerGroupID.MsgToMySql),
|
config.Config.Kafka.Addr, config.Config.Kafka.ConsumerGroupID.MsgToMySql),
|
||||||
chatLogDatabase: database,
|
chatLogDatabase: database,
|
||||||
}
|
}
|
||||||
@@ -61,9 +59,9 @@ func (pc *PersistentConsumerHandler) handleChatWs2Mysql(
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
log.ZDebug(ctx, "handleChatWs2Mysql", "msg", msgFromMQ.MsgData)
|
log.ZDebug(ctx, "handleChatWs2Mysql", "msg", msgFromMQ.MsgData)
|
||||||
// Control whether to store history messages (mysql)
|
//Control whether to store history messages (mysql)
|
||||||
isPersist := utils.GetSwitchFromOptions(msgFromMQ.MsgData.Options, constant.IsPersistent)
|
isPersist := utils.GetSwitchFromOptions(msgFromMQ.MsgData.Options, constant.IsPersistent)
|
||||||
// Only process receiver data
|
//Only process receiver data
|
||||||
if isPersist {
|
if isPersist {
|
||||||
switch msgFromMQ.MsgData.SessionType {
|
switch msgFromMQ.MsgData.SessionType {
|
||||||
case constant.SingleChatType, constant.NotificationChatType:
|
case constant.SingleChatType, constant.NotificationChatType:
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ func (f *Fcm) Push(ctx context.Context, userIDs []string, title, content string,
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
apns.Payload.Aps.Badge = &unreadCountSum
|
apns.Payload.Aps.Badge = &unreadCountSum
|
||||||
} else {
|
} else {
|
||||||
// log.Error(operationID, "IncrUserBadgeUnreadCountSum redis err", err.Error(), uid)
|
//log.Error(operationID, "IncrUserBadgeUnreadCountSum redis err", err.Error(), uid)
|
||||||
Fail++
|
Fail++
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -107,7 +107,7 @@ func (f *Fcm) Push(ctx context.Context, userIDs []string, title, content string,
|
|||||||
zero := 1
|
zero := 1
|
||||||
apns.Payload.Aps.Badge = &zero
|
apns.Payload.Aps.Badge = &zero
|
||||||
} else {
|
} else {
|
||||||
// log.Error(operationID, "GetUserBadgeUnreadCountSum redis err", err.Error(), uid)
|
//log.Error(operationID, "GetUserBadgeUnreadCountSum redis err", err.Error(), uid)
|
||||||
Fail++
|
Fail++
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -127,7 +127,7 @@ func (f *Fcm) Push(ctx context.Context, userIDs []string, title, content string,
|
|||||||
response, err := f.fcmMsgCli.SendAll(ctx, messages)
|
response, err := f.fcmMsgCli.SendAll(ctx, messages)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Fail = Fail + messageCount
|
Fail = Fail + messageCount
|
||||||
// log.Info(operationID, "some token push err", err.Error(), messageCount)
|
//log.Info(operationID, "some token push err", err.Error(), messageCount)
|
||||||
} else {
|
} else {
|
||||||
Success = Success + response.SuccessCount
|
Success = Success + response.SuccessCount
|
||||||
Fail = Fail + response.FailureCount
|
Fail = Fail + response.FailureCount
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ func newPushReq(title, content string) PushReq {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func newBatchPushReq(userIDs []string, taskID string) PushReq {
|
func newBatchPushReq(userIDs []string, taskID string) PushReq {
|
||||||
IsAsync := true
|
var IsAsync = true
|
||||||
return PushReq{Audience: &Audience{Alias: userIDs}, IsAsync: &IsAsync, TaskID: &taskID}
|
return PushReq{Audience: &Audience{Alias: userIDs}, IsAsync: &IsAsync, TaskID: &taskID}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,16 +15,17 @@
|
|||||||
package getui
|
package getui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/go-redis/redis"
|
||||||
|
|
||||||
"context"
|
"context"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-redis/redis"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/internal/push/offlinepush"
|
"github.com/OpenIMSDK/Open-IM-Server/internal/push/offlinepush"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||||
@@ -48,7 +49,7 @@ const (
|
|||||||
taskURL = "/push/list/message"
|
taskURL = "/push/list/message"
|
||||||
batchPushURL = "/push/list/alias"
|
batchPushURL = "/push/list/alias"
|
||||||
|
|
||||||
// codes.
|
// codes
|
||||||
tokenExpireCode = 10001
|
tokenExpireCode = 10001
|
||||||
tokenExpireTime = 60 * 60 * 23
|
tokenExpireTime = 60 * 60 * 23
|
||||||
taskIDTTL = 1000 * 60 * 60 * 24
|
taskIDTTL = 1000 * 60 * 60 * 24
|
||||||
@@ -141,7 +142,7 @@ func (g *Client) GetTaskID(ctx context.Context, token string, pushReq PushReq) (
|
|||||||
return respTask.TaskID, nil
|
return respTask.TaskID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// max num is 999.
|
// max num is 999
|
||||||
func (g *Client) batchPush(ctx context.Context, token string, userIDs []string, pushReq PushReq) error {
|
func (g *Client) batchPush(ctx context.Context, token string, userIDs []string, pushReq PushReq) error {
|
||||||
taskID, err := g.GetTaskID(ctx, token, pushReq)
|
taskID, err := g.GetTaskID(ctx, token, pushReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -66,7 +66,6 @@ func (p *Platform) Set(os string) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Platform) SetPlatform(platform string) error {
|
func (p *Platform) SetPlatform(platform string) error {
|
||||||
switch platform {
|
switch platform {
|
||||||
case constant.AndroidPlatformStr:
|
case constant.AndroidPlatformStr:
|
||||||
@@ -76,8 +75,8 @@ func (p *Platform) SetPlatform(platform string) error {
|
|||||||
default:
|
default:
|
||||||
return errors.New("platform err")
|
return errors.New("platform err")
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
func (p *Platform) SetIOS() error {
|
func (p *Platform) SetIOS() error {
|
||||||
return p.Set(IOS)
|
return p.Set(IOS)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ func (p *PushObj) SetNotification(no *Notification) {
|
|||||||
func (p *PushObj) SetMessage(m *Message) {
|
func (p *PushObj) SetMessage(m *Message) {
|
||||||
p.Message = m
|
p.Message = m
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PushObj) SetOptions(o *Options) {
|
func (p *PushObj) SetOptions(o *Options) {
|
||||||
p.Options = o
|
p.Options = o
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,12 +18,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
)
|
)
|
||||||
|
|
||||||
// OfflinePusher Offline Pusher
|
|
||||||
type OfflinePusher interface {
|
type OfflinePusher interface {
|
||||||
Push(ctx context.Context, userIDs []string, title, content string, opts *Opts) error
|
Push(ctx context.Context, userIDs []string, title, content string, opts *Opts) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opts opts
|
|
||||||
type Opts struct {
|
type Opts struct {
|
||||||
Signal *Signal
|
Signal *Signal
|
||||||
IOSPushSound string
|
IOSPushSound string
|
||||||
@@ -31,7 +29,6 @@ type Opts struct {
|
|||||||
Ex string
|
Ex string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Signal message id
|
|
||||||
type Signal struct {
|
type Signal struct {
|
||||||
ClientMsgID string
|
ClientMsgID string
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,10 +37,8 @@ type ConsumerHandler struct {
|
|||||||
func NewConsumerHandler(pusher *Pusher) *ConsumerHandler {
|
func NewConsumerHandler(pusher *Pusher) *ConsumerHandler {
|
||||||
var consumerHandler ConsumerHandler
|
var consumerHandler ConsumerHandler
|
||||||
consumerHandler.pusher = pusher
|
consumerHandler.pusher = pusher
|
||||||
consumerHandler.pushConsumerGroup = kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{
|
consumerHandler.pushConsumerGroup = kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0,
|
||||||
KafkaVersion: sarama.V2_0_0_0,
|
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.MsgToPush.Topic}, config.Config.Kafka.Addr,
|
||||||
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false,
|
|
||||||
}, []string{config.Config.Kafka.MsgToPush.Topic}, config.Config.Kafka.Addr,
|
|
||||||
config.Config.Kafka.ConsumerGroupID.MsgToPush)
|
config.Config.Kafka.ConsumerGroupID.MsgToPush)
|
||||||
return &consumerHandler
|
return &consumerHandler
|
||||||
}
|
}
|
||||||
@@ -78,8 +76,7 @@ func (c *ConsumerHandler) handleMs2PsChat(ctx context.Context, msg []byte) {
|
|||||||
func (ConsumerHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil }
|
func (ConsumerHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil }
|
||||||
func (ConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil }
|
func (ConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil }
|
||||||
func (c *ConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession,
|
func (c *ConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession,
|
||||||
claim sarama.ConsumerGroupClaim,
|
claim sarama.ConsumerGroupClaim) error {
|
||||||
) error {
|
|
||||||
for msg := range claim.Messages() {
|
for msg := range claim.Messages() {
|
||||||
ctx := c.pushConsumerGroup.GetContextFromMsg(msg)
|
ctx := c.pushConsumerGroup.GetContextFromMsg(msg)
|
||||||
c.handleMs2PsChat(ctx, msg.Value)
|
c.handleMs2PsChat(ctx, msg.Value)
|
||||||
|
|||||||
@@ -54,8 +54,7 @@ var errNoOfflinePusher = errors.New("no offlinePusher is configured")
|
|||||||
|
|
||||||
func NewPusher(discov discoveryregistry.SvcDiscoveryRegistry, offlinePusher offlinepush.OfflinePusher, database controller.PushDatabase,
|
func NewPusher(discov discoveryregistry.SvcDiscoveryRegistry, offlinePusher offlinepush.OfflinePusher, database controller.PushDatabase,
|
||||||
groupLocalCache *localcache.GroupLocalCache, conversationLocalCache *localcache.ConversationLocalCache,
|
groupLocalCache *localcache.GroupLocalCache, conversationLocalCache *localcache.ConversationLocalCache,
|
||||||
conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient, msgRpcClient *rpcclient.MessageRpcClient,
|
conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient, msgRpcClient *rpcclient.MessageRpcClient) *Pusher {
|
||||||
) *Pusher {
|
|
||||||
return &Pusher{
|
return &Pusher{
|
||||||
discov: discov,
|
discov: discov,
|
||||||
database: database,
|
database: database,
|
||||||
@@ -224,7 +223,7 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws
|
|||||||
}
|
}
|
||||||
needOfflinePushUserIDs = utils.DifferenceString(notNotificationUserIDs, needOfflinePushUserIDs)
|
needOfflinePushUserIDs = utils.DifferenceString(notNotificationUserIDs, needOfflinePushUserIDs)
|
||||||
}
|
}
|
||||||
// Use offline push messaging
|
//Use offline push messaging
|
||||||
if len(needOfflinePushUserIDs) > 0 {
|
if len(needOfflinePushUserIDs) > 0 {
|
||||||
var offlinePushUserIDs []string
|
var offlinePushUserIDs []string
|
||||||
err = callbackOfflinePush(ctx, needOfflinePushUserIDs, msg, &offlinePushUserIDs)
|
err = callbackOfflinePush(ctx, needOfflinePushUserIDs, msg, &offlinePushUserIDs)
|
||||||
@@ -255,7 +254,7 @@ func (p *Pusher) GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// Online push message
|
//Online push message
|
||||||
for _, v := range conns {
|
for _, v := range conns {
|
||||||
msgClient := msggateway.NewMsgGatewayClient(v)
|
msgClient := msggateway.NewMsgGatewayClient(v)
|
||||||
reply, err := msgClient.SuperGroupOnlineBatchPushOneMsg(ctx, &msggateway.OnlineBatchPushOneMsgReq{MsgData: msg, PushToUserIDs: pushToUserIDs})
|
reply, err := msgClient.SuperGroupOnlineBatchPushOneMsg(ctx, &msggateway.OnlineBatchPushOneMsgReq{MsgData: msg, PushToUserIDs: pushToUserIDs})
|
||||||
@@ -266,6 +265,7 @@ func (p *Pusher) GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData,
|
|||||||
if reply != nil && reply.SinglePushResult != nil {
|
if reply != nil && reply.SinglePushResult != nil {
|
||||||
wsResults = append(wsResults, reply.SinglePushResult...)
|
wsResults = append(wsResults, reply.SinglePushResult...)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return wsResults, nil
|
return wsResults, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
@@ -130,16 +129,11 @@ func (s *authServer) forceKickOff(ctx context.Context, userID string, platformID
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, v := range conns {
|
|
||||||
log.ZDebug(ctx, "forceKickOff", "conn", v.(*grpc.ClientConn).Target())
|
|
||||||
}
|
|
||||||
for _, v := range conns {
|
for _, v := range conns {
|
||||||
client := msggateway.NewMsgGatewayClient(v)
|
client := msggateway.NewMsgGatewayClient(v)
|
||||||
kickReq := &msggateway.KickUserOfflineReq{KickUserIDList: []string{userID}, PlatformID: platformID}
|
kickReq := &msggateway.KickUserOfflineReq{KickUserIDList: []string{userID}, PlatformID: platformID}
|
||||||
_, err := client.KickUserOffline(ctx, kickReq)
|
_, err := client.KickUserOffline(ctx, kickReq)
|
||||||
if err != nil {
|
return utils.Wrap(err, "")
|
||||||
log.ZError(ctx, "forceKickOff", err, "kickReq", kickReq)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,8 +17,6 @@ package conversation
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||||
@@ -33,6 +31,7 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
type conversationServer struct {
|
type conversationServer struct {
|
||||||
@@ -185,7 +184,7 @@ func (c *conversationServer) SetConversations(ctx context.Context, req *pbConver
|
|||||||
return &pbConversation.SetConversationsResp{}, nil
|
return &pbConversation.SetConversationsResp{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取超级大群开启免打扰的用户ID.
|
// 获取超级大群开启免打扰的用户ID
|
||||||
func (c *conversationServer) GetRecvMsgNotNotifyUserIDs(ctx context.Context, req *pbConversation.GetRecvMsgNotNotifyUserIDsReq) (*pbConversation.GetRecvMsgNotNotifyUserIDsResp, error) {
|
func (c *conversationServer) GetRecvMsgNotNotifyUserIDs(ctx context.Context, req *pbConversation.GetRecvMsgNotNotifyUserIDsReq) (*pbConversation.GetRecvMsgNotNotifyUserIDsResp, error) {
|
||||||
userIDs, err := c.conversationDatabase.FindRecvMsgNotNotifyUserIDs(ctx, req.GroupID)
|
userIDs, err := c.conversationDatabase.FindRecvMsgNotNotifyUserIDs(ctx, req.GroupID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -194,7 +193,7 @@ func (c *conversationServer) GetRecvMsgNotNotifyUserIDs(ctx context.Context, req
|
|||||||
return &pbConversation.GetRecvMsgNotNotifyUserIDsResp{UserIDs: userIDs}, nil
|
return &pbConversation.GetRecvMsgNotNotifyUserIDsResp{UserIDs: userIDs}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// create conversation without notification for msg redis transfer.
|
// create conversation without notification for msg redis transfer
|
||||||
func (c *conversationServer) CreateSingleChatConversations(ctx context.Context, req *pbConversation.CreateSingleChatConversationsReq) (*pbConversation.CreateSingleChatConversationsResp, error) {
|
func (c *conversationServer) CreateSingleChatConversations(ctx context.Context, req *pbConversation.CreateSingleChatConversationsReq) (*pbConversation.CreateSingleChatConversationsResp, error) {
|
||||||
var conversation tableRelation.ConversationModel
|
var conversation tableRelation.ConversationModel
|
||||||
conversation.ConversationID = utils.GetConversationIDBySessionType(constant.SingleChatType, req.RecvID, req.SendID)
|
conversation.ConversationID = utils.GetConversationIDBySessionType(constant.SingleChatType, req.RecvID, req.SendID)
|
||||||
@@ -248,10 +247,7 @@ func (c *conversationServer) GetUserConversationIDsHash(ctx context.Context, req
|
|||||||
return &pbConversation.GetUserConversationIDsHashResp{Hash: hash}, nil
|
return &pbConversation.GetUserConversationIDsHashResp{Hash: hash}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *conversationServer) GetConversationsByConversationID(
|
func (c *conversationServer) GetConversationsByConversationID(ctx context.Context, req *pbConversation.GetConversationsByConversationIDReq) (*pbConversation.GetConversationsByConversationIDResp, error) {
|
||||||
ctx context.Context,
|
|
||||||
req *pbConversation.GetConversationsByConversationIDReq,
|
|
||||||
) (*pbConversation.GetConversationsByConversationIDResp, error) {
|
|
||||||
conversations, err := c.conversationDatabase.GetConversationsByConversationID(ctx, req.ConversationIDs)
|
conversations, err := c.conversationDatabase.GetConversationsByConversationID(ctx, req.ConversationIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok.
|
// ok
|
||||||
func (s *friendServer) ApplyToAddFriend(
|
func (s *friendServer) ApplyToAddFriend(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *pbfriend.ApplyToAddFriendReq,
|
req *pbfriend.ApplyToAddFriendReq,
|
||||||
@@ -116,7 +116,7 @@ func (s *friendServer) ApplyToAddFriend(
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok.
|
// ok
|
||||||
func (s *friendServer) ImportFriends(
|
func (s *friendServer) ImportFriends(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *pbfriend.ImportFriendReq,
|
req *pbfriend.ImportFriendReq,
|
||||||
@@ -142,7 +142,7 @@ func (s *friendServer) ImportFriends(
|
|||||||
return &pbfriend.ImportFriendResp{}, nil
|
return &pbfriend.ImportFriendResp{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok.
|
// ok
|
||||||
func (s *friendServer) RespondFriendApply(
|
func (s *friendServer) RespondFriendApply(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *pbfriend.RespondFriendApplyReq,
|
req *pbfriend.RespondFriendApplyReq,
|
||||||
@@ -178,7 +178,7 @@ func (s *friendServer) RespondFriendApply(
|
|||||||
return nil, errs.ErrArgs.Wrap("req.HandleResult != -1/1")
|
return nil, errs.ErrArgs.Wrap("req.HandleResult != -1/1")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok.
|
// ok
|
||||||
func (s *friendServer) DeleteFriend(
|
func (s *friendServer) DeleteFriend(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *pbfriend.DeleteFriendReq,
|
req *pbfriend.DeleteFriendReq,
|
||||||
@@ -199,7 +199,7 @@ func (s *friendServer) DeleteFriend(
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok.
|
// ok
|
||||||
func (s *friendServer) SetFriendRemark(
|
func (s *friendServer) SetFriendRemark(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *pbfriend.SetFriendRemarkReq,
|
req *pbfriend.SetFriendRemarkReq,
|
||||||
@@ -220,7 +220,7 @@ func (s *friendServer) SetFriendRemark(
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok.
|
// ok
|
||||||
func (s *friendServer) GetDesignatedFriends(
|
func (s *friendServer) GetDesignatedFriends(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *pbfriend.GetDesignatedFriendsReq,
|
req *pbfriend.GetDesignatedFriendsReq,
|
||||||
@@ -240,7 +240,7 @@ func (s *friendServer) GetDesignatedFriends(
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok 获取接收到的好友申请(即别人主动申请的).
|
// ok 获取接收到的好友申请(即别人主动申请的)
|
||||||
func (s *friendServer) GetPaginationFriendsApplyTo(
|
func (s *friendServer) GetPaginationFriendsApplyTo(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *pbfriend.GetPaginationFriendsApplyToReq,
|
req *pbfriend.GetPaginationFriendsApplyToReq,
|
||||||
@@ -263,7 +263,7 @@ func (s *friendServer) GetPaginationFriendsApplyTo(
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok 获取主动发出去的好友申请列表.
|
// ok 获取主动发出去的好友申请列表
|
||||||
func (s *friendServer) GetPaginationFriendsApplyFrom(
|
func (s *friendServer) GetPaginationFriendsApplyFrom(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *pbfriend.GetPaginationFriendsApplyFromReq,
|
req *pbfriend.GetPaginationFriendsApplyFromReq,
|
||||||
@@ -286,7 +286,7 @@ func (s *friendServer) GetPaginationFriendsApplyFrom(
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok.
|
// ok
|
||||||
func (s *friendServer) IsFriend(
|
func (s *friendServer) IsFriend(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *pbfriend.IsFriendReq,
|
req *pbfriend.IsFriendReq,
|
||||||
@@ -300,7 +300,7 @@ func (s *friendServer) IsFriend(
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok.
|
// ok
|
||||||
func (s *friendServer) GetPaginationFriends(
|
func (s *friendServer) GetPaginationFriends(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *pbfriend.GetPaginationFriendsReq,
|
req *pbfriend.GetPaginationFriendsReq,
|
||||||
|
|||||||
@@ -17,23 +17,20 @@ package group
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
pbConversation "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb"
|
||||||
"math/big"
|
"math/big"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
pbConversation "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw/specialerror"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw/specialerror"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
||||||
@@ -48,6 +45,7 @@ import (
|
|||||||
pbGroup "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group"
|
pbGroup "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
|
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
|
||||||
@@ -231,7 +229,7 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
} else {
|
} else {
|
||||||
// s.Notification.GroupCreatedNotification(ctx, group, groupMembers, userMap)
|
//s.Notification.GroupCreatedNotification(ctx, group, groupMembers, userMap)
|
||||||
tips := &sdkws.GroupCreatedTips{
|
tips := &sdkws.GroupCreatedTips{
|
||||||
Group: resp.GroupInfo,
|
Group: resp.GroupInfo,
|
||||||
OperationTime: group.CreateTime.UnixMilli(),
|
OperationTime: group.CreateTime.UnixMilli(),
|
||||||
@@ -260,7 +258,7 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJo
|
|||||||
pageNumber = req.Pagination.PageNumber
|
pageNumber = req.Pagination.PageNumber
|
||||||
showNumber = req.Pagination.ShowNumber
|
showNumber = req.Pagination.ShowNumber
|
||||||
}
|
}
|
||||||
// total, members, err := s.GroupDatabase.PageGroupMember(ctx, nil, []string{req.FromUserID}, nil, pageNumber, showNumber)
|
//total, members, err := s.GroupDatabase.PageGroupMember(ctx, nil, []string{req.FromUserID}, nil, pageNumber, showNumber)
|
||||||
total, members, err := s.GroupDatabase.PageGetJoinGroup(ctx, req.FromUserID, pageNumber, showNumber)
|
total, members, err := s.GroupDatabase.PageGetJoinGroup(ctx, req.FromUserID, pageNumber, showNumber)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -517,7 +515,7 @@ func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGrou
|
|||||||
Notification: group.Notification,
|
Notification: group.Notification,
|
||||||
Introduction: group.Introduction,
|
Introduction: group.Introduction,
|
||||||
FaceURL: group.FaceURL,
|
FaceURL: group.FaceURL,
|
||||||
// OwnerUserID: owner[0].UserID,
|
//OwnerUserID: owner[0].UserID,
|
||||||
CreateTime: group.CreateTime.UnixMilli(),
|
CreateTime: group.CreateTime.UnixMilli(),
|
||||||
MemberCount: num,
|
MemberCount: num,
|
||||||
Ex: group.Ex,
|
Ex: group.Ex,
|
||||||
@@ -902,6 +900,7 @@ func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInf
|
|||||||
}()
|
}()
|
||||||
num++
|
num++
|
||||||
s.Notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser})
|
s.Notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser})
|
||||||
|
|
||||||
}
|
}
|
||||||
switch len(data) - num {
|
switch len(data) - num {
|
||||||
case 0:
|
case 0:
|
||||||
@@ -1105,7 +1104,7 @@ func (s *groupServer) DismissGroup(ctx context.Context, req *pbGroup.DismissGrou
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// s.Notification.GroupDismissedNotification(ctx, req)
|
//s.Notification.GroupDismissedNotification(ctx, req)
|
||||||
tips := &sdkws.GroupDismissedTips{
|
tips := &sdkws.GroupDismissedTips{
|
||||||
Group: s.groupDB2PB(group, owner.UserID, num),
|
Group: s.groupDB2PB(group, owner.UserID, num),
|
||||||
OpUser: &sdkws.GroupMemberFullInfo{},
|
OpUser: &sdkws.GroupMemberFullInfo{},
|
||||||
|
|||||||
@@ -16,10 +16,9 @@ package group
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *groupServer) GroupCreateCount(ctx context.Context, req *group.GroupCreateCountReq) (*group.GroupCreateCountResp, error) {
|
func (s *groupServer) GroupCreateCount(ctx context.Context, req *group.GroupCreateCountReq) (*group.GroupCreateCountResp, error) {
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ func (m *msgServer) GetConversationsHasReadAndMaxSeq(ctx context.Context, req *m
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
conversationMaxSeqMap := make(map[string]int64)
|
var conversationMaxSeqMap = make(map[string]int64)
|
||||||
for _, conversation := range conversations {
|
for _, conversation := range conversations {
|
||||||
if conversation.MaxSeq != 0 {
|
if conversation.MaxSeq != 0 {
|
||||||
conversationMaxSeqMap[conversation.ConversationID] = conversation.MaxSeq
|
conversationMaxSeqMap[conversation.ConversationID] = conversation.MaxSeq
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ type LockerMessage struct {
|
|||||||
func NewLockerMessage(cache cache.MsgModel) *LockerMessage {
|
func NewLockerMessage(cache cache.MsgModel) *LockerMessage {
|
||||||
return &LockerMessage{cache: cache}
|
return &LockerMessage{cache: cache}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *LockerMessage) LockMessageTypeKey(ctx context.Context, clientMsgID, typeKey string) (err error) {
|
func (l *LockerMessage) LockMessageTypeKey(ctx context.Context, clientMsgID, typeKey string) (err error) {
|
||||||
for i := 0; i < 3; i++ {
|
for i := 0; i < 3; i++ {
|
||||||
err = l.cache.LockMessageTypeKey(ctx, clientMsgID, typeKey)
|
err = l.cache.LockMessageTypeKey(ctx, clientMsgID, typeKey)
|
||||||
@@ -48,8 +47,8 @@ func (l *LockerMessage) LockMessageTypeKey(ctx context.Context, clientMsgID, typ
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
func (l *LockerMessage) LockGlobalMessage(ctx context.Context, clientMsgID string) (err error) {
|
func (l *LockerMessage) LockGlobalMessage(ctx context.Context, clientMsgID string) (err error) {
|
||||||
for i := 0; i < 3; i++ {
|
for i := 0; i < 3; i++ {
|
||||||
err = l.cache.LockMessageTypeKey(ctx, clientMsgID, GlOBALLOCK)
|
err = l.cache.LockMessageTypeKey(ctx, clientMsgID, GlOBALLOCK)
|
||||||
@@ -61,12 +60,11 @@ func (l *LockerMessage) LockGlobalMessage(ctx context.Context, clientMsgID strin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
func (l *LockerMessage) UnLockMessageTypeKey(ctx context.Context, clientMsgID string, typeKey string) error {
|
func (l *LockerMessage) UnLockMessageTypeKey(ctx context.Context, clientMsgID string, typeKey string) error {
|
||||||
return l.cache.UnLockMessageTypeKey(ctx, clientMsgID, typeKey)
|
return l.cache.UnLockMessageTypeKey(ctx, clientMsgID, typeKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *LockerMessage) UnLockGlobalMessage(ctx context.Context, clientMsgID string) error {
|
func (l *LockerMessage) UnLockGlobalMessage(ctx context.Context, clientMsgID string) error {
|
||||||
return l.cache.UnLockMessageTypeKey(ctx, clientMsgID, GlOBALLOCK)
|
return l.cache.UnLockMessageTypeKey(ctx, clientMsgID, GlOBALLOCK)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ package msg
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
"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/common/log"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
||||||
@@ -83,7 +84,6 @@ func (m *msgServer) sendMsgSuperGroupChat(
|
|||||||
resp.ClientMsgID = req.MsgData.ClientMsgID
|
resp.ClientMsgID = req.MsgData.ClientMsgID
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *msgServer) setConversationAtInfo(nctx context.Context, msg *sdkws.MsgData) {
|
func (m *msgServer) setConversationAtInfo(nctx context.Context, msg *sdkws.MsgData) {
|
||||||
log.ZDebug(nctx, "setConversationAtInfo", "msg", msg)
|
log.ZDebug(nctx, "setConversationAtInfo", "msg", msg)
|
||||||
ctx := mcontext.NewCtx("@@@" + mcontext.GetOperationID(nctx))
|
ctx := mcontext.NewCtx("@@@" + mcontext.GetOperationID(nctx))
|
||||||
@@ -101,7 +101,7 @@ func (m *msgServer) setConversationAtInfo(nctx context.Context, msg *sdkws.MsgDa
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
atUserID = utils.DifferenceString([]string{constant.AtAllString}, msg.AtUserIDList)
|
atUserID = utils.DifferenceString([]string{constant.AtAllString}, msg.AtUserIDList)
|
||||||
if len(atUserID) == 0 { // just @everyone
|
if len(atUserID) == 0 { //just @everyone
|
||||||
conversation.GroupAtType = &wrapperspb.Int32Value{Value: constant.AtAll}
|
conversation.GroupAtType = &wrapperspb.Int32Value{Value: constant.AtAll}
|
||||||
} else { //@Everyone and @other people
|
} else { //@Everyone and @other people
|
||||||
conversation.GroupAtType = &wrapperspb.Int32Value{Value: constant.AtAllAtMe}
|
conversation.GroupAtType = &wrapperspb.Int32Value{Value: constant.AtAllAtMe}
|
||||||
@@ -123,6 +123,7 @@ func (m *msgServer) setConversationAtInfo(nctx context.Context, msg *sdkws.MsgDa
|
|||||||
log.ZWarn(ctx, "SetConversations", err, msg.AtUserIDList, conversation)
|
log.ZWarn(ctx, "SetConversations", err, msg.AtUserIDList, conversation)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *msgServer) sendMsgNotification(
|
func (m *msgServer) sendMsgNotification(
|
||||||
@@ -188,7 +189,3 @@ func (m *msgServer) sendMsgSingleChat(ctx context.Context, req *pbMsg.SendMsgReq
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *msgServer) BatchSendMsg(ctx context.Context, in *pbMsg.BatchSendMessageReq) (*pbMsg.BatchSendMessageResp, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ package msg
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
@@ -31,9 +32,8 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type MessageInterceptorChain []MessageInterceptorFunc
|
||||||
MessageInterceptorChain []MessageInterceptorFunc
|
type msgServer struct {
|
||||||
msgServer struct {
|
|
||||||
RegisterCenter discoveryregistry.SvcDiscoveryRegistry
|
RegisterCenter discoveryregistry.SvcDiscoveryRegistry
|
||||||
MsgDatabase controller.CommonMsgDatabase
|
MsgDatabase controller.CommonMsgDatabase
|
||||||
Group *rpcclient.GroupRpcClient
|
Group *rpcclient.GroupRpcClient
|
||||||
@@ -45,8 +45,7 @@ type (
|
|||||||
MessageLocker MessageLocker
|
MessageLocker MessageLocker
|
||||||
Handlers MessageInterceptorChain
|
Handlers MessageInterceptorChain
|
||||||
notificationSender *rpcclient.NotificationSender
|
notificationSender *rpcclient.NotificationSender
|
||||||
}
|
}
|
||||||
)
|
|
||||||
|
|
||||||
func (m *msgServer) addInterceptorHandler(interceptorFunc ...MessageInterceptorFunc) {
|
func (m *msgServer) addInterceptorHandler(interceptorFunc ...MessageInterceptorFunc) {
|
||||||
m.Handlers = append(m.Handlers, interceptorFunc...)
|
m.Handlers = append(m.Handlers, interceptorFunc...)
|
||||||
@@ -81,7 +80,12 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e
|
|||||||
userRpcClient := rpcclient.NewUserRpcClient(client)
|
userRpcClient := rpcclient.NewUserRpcClient(client)
|
||||||
groupRpcClient := rpcclient.NewGroupRpcClient(client)
|
groupRpcClient := rpcclient.NewGroupRpcClient(client)
|
||||||
friendRpcClient := rpcclient.NewFriendRpcClient(client)
|
friendRpcClient := rpcclient.NewFriendRpcClient(client)
|
||||||
msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, cacheModel)
|
mysql, err := relation.NewGormDB()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
msgMysModel := relation.NewChatLogGorm(mysql)
|
||||||
|
msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, cacheModel, msgMysModel)
|
||||||
s := &msgServer{
|
s := &msgServer{
|
||||||
Conversation: &conversationClient,
|
Conversation: &conversationClient,
|
||||||
User: &userRpcClient,
|
User: &userRpcClient,
|
||||||
|
|||||||
@@ -16,24 +16,15 @@ package msg
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (m *msgServer) GetActiveUser(ctx context.Context, req *msg.GetActiveUserReq) (*msg.GetActiveUserResp, error) {
|
func (m *msgServer) GetActiveUser(ctx context.Context, req *msg.GetActiveUserReq) (*msg.GetActiveUserResp, error) {
|
||||||
msgCount, userCount, users, dateCount, err := m.MsgDatabase.RangeUserSendCount(
|
msgCount, userCount, users, dateCount, err := m.MsgDatabase.RangeUserSendCount(ctx, time.UnixMilli(req.Start), time.UnixMilli(req.End), req.Group, req.Ase, req.Pagination.PageNumber, req.Pagination.ShowNumber)
|
||||||
ctx,
|
|
||||||
time.UnixMilli(req.Start),
|
|
||||||
time.UnixMilli(req.End),
|
|
||||||
req.Group,
|
|
||||||
req.Ase,
|
|
||||||
req.Pagination.PageNumber,
|
|
||||||
req.Pagination.ShowNumber,
|
|
||||||
)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -68,14 +59,7 @@ func (m *msgServer) GetActiveUser(ctx context.Context, req *msg.GetActiveUserReq
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *msgServer) GetActiveGroup(ctx context.Context, req *msg.GetActiveGroupReq) (*msg.GetActiveGroupResp, error) {
|
func (m *msgServer) GetActiveGroup(ctx context.Context, req *msg.GetActiveGroupReq) (*msg.GetActiveGroupResp, error) {
|
||||||
msgCount, groupCount, groups, dateCount, err := m.MsgDatabase.RangeGroupSendCount(
|
msgCount, groupCount, groups, dateCount, err := m.MsgDatabase.RangeGroupSendCount(ctx, time.UnixMilli(req.Start), time.UnixMilli(req.End), req.Ase, req.Pagination.PageNumber, req.Pagination.ShowNumber)
|
||||||
ctx,
|
|
||||||
time.UnixMilli(req.Start),
|
|
||||||
time.UnixMilli(req.End),
|
|
||||||
req.Ase,
|
|
||||||
req.Pagination.PageNumber,
|
|
||||||
req.Pagination.ShowNumber,
|
|
||||||
)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ package msg
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
||||||
|
|
||||||
@@ -108,11 +107,11 @@ func (m *msgServer) GetMaxSeq(ctx context.Context, req *sdkws.GetMaxSeqReq) (*sd
|
|||||||
|
|
||||||
func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq) (resp *msg.SearchMessageResp, err error) {
|
func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq) (resp *msg.SearchMessageResp, err error) {
|
||||||
var chatLogs []*sdkws.MsgData
|
var chatLogs []*sdkws.MsgData
|
||||||
var total int32
|
|
||||||
resp = &msg.SearchMessageResp{}
|
resp = &msg.SearchMessageResp{}
|
||||||
if total, chatLogs, err = m.MsgDatabase.SearchMessage(ctx, req); err != nil {
|
if chatLogs, err = m.MsgDatabase.SearchMessage(ctx, req); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
var num int
|
||||||
for _, chatLog := range chatLogs {
|
for _, chatLog := range chatLogs {
|
||||||
pbChatLog := &msg.ChatLog{}
|
pbChatLog := &msg.ChatLog{}
|
||||||
utils.CopyStructFields(pbChatLog, chatLog)
|
utils.CopyStructFields(pbChatLog, chatLog)
|
||||||
@@ -131,7 +130,7 @@ func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
pbChatLog.RecvNickname = recvUser.Nickname
|
pbChatLog.SenderNickname = recvUser.Nickname
|
||||||
|
|
||||||
case constant.GroupChatType, constant.SuperGroupChatType:
|
case constant.GroupChatType, constant.SuperGroupChatType:
|
||||||
group, err := m.Group.GetGroupInfo(ctx, chatLog.GroupID)
|
group, err := m.Group.GetGroupInfo(ctx, chatLog.GroupID)
|
||||||
@@ -146,8 +145,9 @@ func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq
|
|||||||
pbChatLog.GroupType = group.GroupType
|
pbChatLog.GroupType = group.GroupType
|
||||||
}
|
}
|
||||||
resp.ChatLogs = append(resp.ChatLogs, pbChatLog)
|
resp.ChatLogs = append(resp.ChatLogs, pbChatLog)
|
||||||
|
num++
|
||||||
}
|
}
|
||||||
|
|
||||||
resp.ChatLogsNum = total
|
resp.ChatLogsNum = int32(num)
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
var ExcludeContentType = []int{constant.HasReadReceipt}
|
var (
|
||||||
|
ExcludeContentType = []int{constant.HasReadReceipt}
|
||||||
|
)
|
||||||
|
|
||||||
type Validator interface {
|
type Validator interface {
|
||||||
validate(pb *msg.SendMsgReq) (bool, int32, string)
|
validate(pb *msg.SendMsgReq) (bool, int32, string)
|
||||||
@@ -124,7 +126,6 @@ func (m *msgServer) messageVerification(ctx context.Context, data *msg.SendMsgRe
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *msgServer) encapsulateMsgData(msg *sdkws.MsgData) {
|
func (m *msgServer) encapsulateMsgData(msg *sdkws.MsgData) {
|
||||||
msg.ServerMsgID = GetMsgID(msg.SendID)
|
msg.ServerMsgID = GetMsgID(msg.SendID)
|
||||||
msg.SendTime = utils.GetCurrentTimestampByMill()
|
msg.SendTime = utils.GetCurrentTimestampByMill()
|
||||||
|
|||||||
@@ -16,8 +16,6 @@ package third
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cont"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cont"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||||
@@ -25,6 +23,7 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (t *thirdServer) PartLimit(ctx context.Context, req *third.PartLimitReq) (*third.PartLimitResp, error) {
|
func (t *thirdServer) PartLimit(ctx context.Context, req *third.PartLimitReq) (*third.PartLimitResp, error) {
|
||||||
|
|||||||
@@ -17,15 +17,12 @@ package third
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cos"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cos"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/minio"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/minio"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/oss"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/oss"
|
||||||
|
"net/url"
|
||||||
"google.golang.org/grpc"
|
"time"
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||||
@@ -35,6 +32,7 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
|
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
|
||||||
|
|||||||
@@ -18,13 +18,12 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
|
||||||
|
"strings"
|
||||||
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
|
|
||||||
func toPbMapArray(m map[string][]string) []*third.KeyValues {
|
func toPbMapArray(m map[string][]string) []*third.KeyValues {
|
||||||
|
|||||||
@@ -17,11 +17,10 @@ package user
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
"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/constant"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert"
|
||||||
@@ -38,9 +37,8 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
type userServer struct {
|
type userServer struct {
|
||||||
@@ -235,7 +233,7 @@ func (s *userServer) GetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.Ge
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *userServer) GetAllUserID(ctx context.Context, req *pbuser.GetAllUserIDReq) (resp *pbuser.GetAllUserIDResp, err error) {
|
func (s *userServer) GetAllUserID(ctx context.Context, req *pbuser.GetAllUserIDReq) (resp *pbuser.GetAllUserIDResp, err error) {
|
||||||
userIDs, err := s.UserDatabase.GetAllUserID(ctx, req.Pagination.PageNumber, req.Pagination.ShowNumber)
|
userIDs, err := s.UserDatabase.GetAllUserID(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,18 +33,7 @@ func (c *MsgTool) ConversationsDestructMsgs() {
|
|||||||
}
|
}
|
||||||
log.ZDebug(context.Background(), "nums conversations need destruct", "nums", len(conversations))
|
log.ZDebug(context.Background(), "nums conversations need destruct", "nums", len(conversations))
|
||||||
for _, conversation := range conversations {
|
for _, conversation := range conversations {
|
||||||
log.ZDebug(
|
log.ZDebug(ctx, "UserMsgsDestruct", "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID, "msgDestructTime", conversation.MsgDestructTime, "lastMsgDestructTime", conversation.LatestMsgDestructTime)
|
||||||
ctx,
|
|
||||||
"UserMsgsDestruct",
|
|
||||||
"conversationID",
|
|
||||||
conversation.ConversationID,
|
|
||||||
"ownerUserID",
|
|
||||||
conversation.OwnerUserID,
|
|
||||||
"msgDestructTime",
|
|
||||||
conversation.MsgDestructTime,
|
|
||||||
"lastMsgDestructTime",
|
|
||||||
conversation.LatestMsgDestructTime,
|
|
||||||
)
|
|
||||||
seqs, err := c.msgDatabase.UserMsgsDestruct(ctx, conversation.OwnerUserID, conversation.ConversationID, conversation.MsgDestructTime, conversation.LatestMsgDestructTime)
|
seqs, err := c.msgDatabase.UserMsgsDestruct(ctx, conversation.OwnerUserID, conversation.ConversationID, conversation.MsgDestructTime, conversation.LatestMsgDestructTime)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.ZError(ctx, "user msg destruct failed", err, "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID)
|
log.ZError(ctx, "user msg destruct failed", err, "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID)
|
||||||
|
|||||||
@@ -41,11 +41,11 @@ func StartCronTask() error {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
log.ZInfo(context.Background(), "start msgDestruct cron task", "cron config", config.Config.MsgDestructTime)
|
log.ZInfo(context.Background(), "start msgDestruct cron task", "cron config", config.Config.MsgDestructTime)
|
||||||
// _, err = c.AddFunc(config.Config.MsgDestructTime, msgTool.ConversationsDestructMsgs)
|
_, err = c.AddFunc(config.Config.MsgDestructTime, msgTool.ConversationsDestructMsgs)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// fmt.Println("start conversationsDestructMsgs cron failed", err.Error(), config.Config.ChatRecordsClearTime)
|
fmt.Println("start conversationsDestructMsgs cron failed", err.Error(), config.Config.ChatRecordsClearTime)
|
||||||
// panic(err)
|
panic(err)
|
||||||
// }
|
}
|
||||||
c.Start()
|
c.Start()
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
+6
-12
@@ -20,10 +20,6 @@ import (
|
|||||||
"math"
|
"math"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/redis/go-redis/v9"
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
"google.golang.org/grpc/credentials/insecure"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
||||||
@@ -38,6 +34,9 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
|
"github.com/redis/go-redis/v9"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MsgTool struct {
|
type MsgTool struct {
|
||||||
@@ -49,8 +48,7 @@ type MsgTool struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewMsgTool(msgDatabase controller.CommonMsgDatabase, userDatabase controller.UserDatabase,
|
func NewMsgTool(msgDatabase controller.CommonMsgDatabase, userDatabase controller.UserDatabase,
|
||||||
groupDatabase controller.GroupDatabase, conversationDatabase controller.ConversationDatabase, msgNotificationSender *notification.MsgNotificationSender,
|
groupDatabase controller.GroupDatabase, conversationDatabase controller.ConversationDatabase, msgNotificationSender *notification.MsgNotificationSender) *MsgTool {
|
||||||
) *MsgTool {
|
|
||||||
return &MsgTool{
|
return &MsgTool{
|
||||||
msgDatabase: msgDatabase,
|
msgDatabase: msgDatabase,
|
||||||
userDatabase: userDatabase,
|
userDatabase: userDatabase,
|
||||||
@@ -81,18 +79,14 @@ func InitMsgTool() (*MsgTool, error) {
|
|||||||
}
|
}
|
||||||
discov.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials()))
|
discov.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials()))
|
||||||
userDB := relation.NewUserGorm(db)
|
userDB := relation.NewUserGorm(db)
|
||||||
msgDatabase := controller.InitCommonMsgDatabase(rdb, mongo.GetDatabase())
|
msgDatabase := controller.InitCommonMsgDatabase(rdb, mongo.GetDatabase(), db)
|
||||||
userDatabase := controller.NewUserDatabase(
|
userDatabase := controller.NewUserDatabase(
|
||||||
userDB,
|
userDB,
|
||||||
cache.NewUserCacheRedis(rdb, relation.NewUserGorm(db), cache.GetDefaultOpt()),
|
cache.NewUserCacheRedis(rdb, relation.NewUserGorm(db), cache.GetDefaultOpt()),
|
||||||
tx.NewGorm(db),
|
tx.NewGorm(db),
|
||||||
)
|
)
|
||||||
groupDatabase := controller.InitGroupDatabase(db, rdb, mongo.GetDatabase())
|
groupDatabase := controller.InitGroupDatabase(db, rdb, mongo.GetDatabase())
|
||||||
conversationDatabase := controller.NewConversationDatabase(
|
conversationDatabase := controller.NewConversationDatabase(relation.NewConversationGorm(db), cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), relation.NewConversationGorm(db)), tx.NewGorm(db))
|
||||||
relation.NewConversationGorm(db),
|
|
||||||
cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), relation.NewConversationGorm(db)),
|
|
||||||
tx.NewGorm(db),
|
|
||||||
)
|
|
||||||
msgRpcClient := rpcclient.NewMessageRpcClient(discov)
|
msgRpcClient := rpcclient.NewMessageRpcClient(discov)
|
||||||
msgNotificationSender := notification.NewMsgNotificationSender(rpcclient.WithRpcClient(&msgRpcClient))
|
msgNotificationSender := notification.NewMsgNotificationSender(rpcclient.WithRpcClient(&msgRpcClient))
|
||||||
msgTool := NewMsgTool(msgDatabase, userDatabase, groupDatabase, conversationDatabase, msgNotificationSender)
|
msgTool := NewMsgTool(msgDatabase, userDatabase, groupDatabase, conversationDatabase, msgNotificationSender)
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
// Copyright © 2023 OpenIM. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package apistruct
|
||||||
|
|
||||||
|
type UserRegisterReq struct {
|
||||||
|
Secret string `json:"secret" binding:"required,max=32"`
|
||||||
|
Platform int32 `json:"platform" binding:"required,min=1,max=12"`
|
||||||
|
ApiUserInfo
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserTokenInfo struct {
|
||||||
|
UserID string `json:"userID"`
|
||||||
|
Token string `json:"token"`
|
||||||
|
ExpiredTime int64 `json:"expiredTime"`
|
||||||
|
}
|
||||||
|
type UserRegisterResp struct {
|
||||||
|
UserToken UserTokenInfo `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserTokenReq struct {
|
||||||
|
Secret string `json:"secret" binding:"required,max=32"`
|
||||||
|
Platform int32 `json:"platform" binding:"required,min=1,max=12"`
|
||||||
|
UserID string `json:"userID" binding:"required,min=1,max=64"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserTokenResp struct {
|
||||||
|
UserToken UserTokenInfo `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ForceLogoutReq struct {
|
||||||
|
Platform int32 `json:"platform" binding:"required,min=1,max=12"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required,min=1,max=64"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ForceLogoutResp struct{}
|
||||||
|
|
||||||
|
type ParseTokenReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//type ParseTokenResp struct {
|
||||||
|
//
|
||||||
|
// ExpireTime int64 `json:"expireTime" binding:"required"`
|
||||||
|
//}
|
||||||
|
|
||||||
|
type ExpireTime struct {
|
||||||
|
ExpireTimeSeconds uint32 `json:"expireTimeSeconds"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ParseTokenResp struct {
|
||||||
|
Data map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
ExpireTime ExpireTime `json:"-"`
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Copyright © 2023 OpenIM. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package apistruct
|
||||||
|
|
||||||
|
type AwsStorageCredentialReq struct {
|
||||||
|
OperationID string `json:"operationID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AwsStorageCredentialRespData struct {
|
||||||
|
AccessKeyId string `json:"accessKeyID"`
|
||||||
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
|
SessionToken string `json:"sessionToken"`
|
||||||
|
RegionID string `json:"regionId"`
|
||||||
|
Bucket string `json:"bucket"`
|
||||||
|
FinalHost string `json:"FinalHost"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AwsStorageCredentialResp struct {
|
||||||
|
CosData AwsStorageCredentialRespData
|
||||||
|
Data map[string]interface{} `json:"data"`
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
// Copyright © 2023 OpenIM. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package apistruct
|
||||||
|
|
||||||
|
type OptResult struct {
|
||||||
|
ConversationID string `json:"conversationID"`
|
||||||
|
Result *int32 `json:"result"`
|
||||||
|
}
|
||||||
|
type GetAllConversationMessageOptReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
type GetAllConversationMessageOptResp struct {
|
||||||
|
ConversationOptResultList []*OptResult `json:"data"`
|
||||||
|
}
|
||||||
|
type GetReceiveMessageOptReq struct {
|
||||||
|
ConversationIDList []string `json:"conversationIDList" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
type GetReceiveMessageOptResp struct {
|
||||||
|
ConversationOptResultList []*OptResult `json:"data"`
|
||||||
|
}
|
||||||
|
type SetReceiveMessageOptReq struct {
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
Opt *int32 `json:"opt" binding:"required"`
|
||||||
|
ConversationIDList []string `json:"conversationIDList" binding:"required"`
|
||||||
|
}
|
||||||
|
type SetReceiveMessageOptResp struct {
|
||||||
|
ConversationOptResultList []*OptResult `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Conversation struct {
|
||||||
|
OwnerUserID string `json:"ownerUserID" binding:"required"`
|
||||||
|
ConversationID string `json:"conversationID" binding:"required"`
|
||||||
|
ConversationType int32 `json:"conversationType" binding:"required"`
|
||||||
|
UserID string `json:"userID"`
|
||||||
|
GroupID string `json:"groupID"`
|
||||||
|
RecvMsgOpt int32 `json:"recvMsgOpt" binding:"omitempty,oneof=0 1 2"`
|
||||||
|
UnreadCount int32 `json:"unreadCount" binding:"omitempty"`
|
||||||
|
DraftTextTime int64 `json:"draftTextTime"`
|
||||||
|
IsPinned bool `json:"isPinned" binding:"omitempty"`
|
||||||
|
IsPrivateChat bool `json:"isPrivateChat"`
|
||||||
|
BurnDuration int32 `json:"burnDuration"`
|
||||||
|
GroupAtType int32 `json:"groupAtType"`
|
||||||
|
IsNotInGroup bool `json:"isNotInGroup"`
|
||||||
|
UpdateUnreadCountTime int64 `json:"updateUnreadCountTime"`
|
||||||
|
AttachedInfo string `json:"attachedInfo"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetConversationReq struct {
|
||||||
|
Conversation
|
||||||
|
NotificationType int32 `json:"notificationType"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetConversationResp struct{}
|
||||||
|
type ModifyConversationFieldReq struct {
|
||||||
|
Conversation
|
||||||
|
FieldType int32 `json:"fieldType" binding:"required"`
|
||||||
|
UserIDList []string `json:"userIDList" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
type ModifyConversationFieldResp struct{}
|
||||||
|
|
||||||
|
type BatchSetConversationsReq struct {
|
||||||
|
Conversations []Conversation `json:"conversations" binding:"required"`
|
||||||
|
NotificationType int32 `json:"notificationType"`
|
||||||
|
OwnerUserID string `json:"ownerUserID" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type BatchSetConversationsResp struct {
|
||||||
|
Data struct {
|
||||||
|
Success []string `json:"success"`
|
||||||
|
Failed []string `json:"failed"`
|
||||||
|
} `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetConversationReq struct {
|
||||||
|
ConversationID string `json:"conversationID" binding:"required"`
|
||||||
|
OwnerUserID string `json:"ownerUserID" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetConversationResp struct {
|
||||||
|
Conversation Conversation `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetAllConversationsReq struct {
|
||||||
|
OwnerUserID string `json:"ownerUserID" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetAllConversationsResp struct {
|
||||||
|
Conversations []Conversation `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetConversationsReq struct {
|
||||||
|
ConversationIDs []string `json:"conversationIDs" binding:"required"`
|
||||||
|
OwnerUserID string `json:"ownerUserID" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetConversationsResp struct {
|
||||||
|
Conversations []Conversation `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetRecvMsgOptReq struct {
|
||||||
|
OwnerUserID string `json:"ownerUserID" binding:"required"`
|
||||||
|
ConversationID string `json:"conversationID"`
|
||||||
|
RecvMsgOpt int32 `json:"recvMsgOpt" binding:"omitempty,oneof=0 1 2"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
NotificationType int32 `json:"notificationType"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetRecvMsgOptResp struct{}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Copyright © 2023 OpenIM. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package apistruct
|
||||||
|
|
||||||
|
import sts "github.com/tencentyun/qcloud-cos-sts-sdk/go"
|
||||||
|
|
||||||
|
type TencentCloudStorageCredentialReq struct {
|
||||||
|
OperationID string `json:"operationID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TencentCloudStorageCredentialRespData struct {
|
||||||
|
*sts.CredentialResult
|
||||||
|
Region string `json:"region"`
|
||||||
|
Bucket string `json:"bucket"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TencentCloudStorageCredentialResp struct {
|
||||||
|
CosData TencentCloudStorageCredentialRespData `json:"-"`
|
||||||
|
|
||||||
|
Data map[string]interface{} `json:"data"`
|
||||||
|
}
|
||||||
@@ -0,0 +1,282 @@
|
|||||||
|
// Copyright © 2023 OpenIM. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package apistruct
|
||||||
|
|
||||||
|
//type ParamsCommFriend struct {
|
||||||
|
// OperationID string `json:"operationID" binding:"required"`
|
||||||
|
// ToUserID string `json:"toUserID" binding:"required"`
|
||||||
|
// FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type AddBlacklistReq struct {
|
||||||
|
// ParamsCommFriend
|
||||||
|
//}
|
||||||
|
//type AddBlacklistResp struct {
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type ImportFriendReq struct {
|
||||||
|
// FriendUserIDList []string `json:"friendUserIDList" binding:"required"`
|
||||||
|
// OperationID string `json:"operationID" binding:"required"`
|
||||||
|
// FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
//}
|
||||||
|
//type UserIDResult struct {
|
||||||
|
// UserID string `json:"userID"`
|
||||||
|
// Result int32 `json:"result"`
|
||||||
|
//}
|
||||||
|
//type ImportFriendResp struct {
|
||||||
|
//
|
||||||
|
// UserIDResultList []UserIDResult `json:"data"`
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type AddFriendReq struct {
|
||||||
|
// ParamsCommFriend
|
||||||
|
// ReqMsg string `json:"reqMsg"`
|
||||||
|
//}
|
||||||
|
//type AddFriendResp struct {
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type AddFriendResponseReq struct {
|
||||||
|
// ParamsCommFriend
|
||||||
|
// Flag int32 `json:"flag" binding:"required,oneof=-1 0 1"`
|
||||||
|
// HandleMsg string `json:"handleMsg"`
|
||||||
|
//}
|
||||||
|
//type AddFriendResponseResp struct {
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type DeleteFriendReq struct {
|
||||||
|
// ParamsCommFriend
|
||||||
|
//}
|
||||||
|
//type DeleteFriendResp struct {
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type GetBlackListReq struct {
|
||||||
|
// OperationID string `json:"operationID" binding:"required"`
|
||||||
|
// FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
//}
|
||||||
|
//type GetBlackListResp struct {
|
||||||
|
//
|
||||||
|
// BlackUserInfoList []*sdkws.PublicUserInfo `json:"-"`
|
||||||
|
// Map []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
////type PublicUserInfo struct {
|
||||||
|
//// UserID string `json:"userID"`
|
||||||
|
//// Nickname string `json:"nickname"`
|
||||||
|
//// FaceUrl string `json:"faceUrl"`
|
||||||
|
//// Gender int32 `json:"gender"`
|
||||||
|
////}
|
||||||
|
//
|
||||||
|
//type SetFriendRemarkReq struct {
|
||||||
|
// ParamsCommFriend
|
||||||
|
// Remark string `json:"remark"`
|
||||||
|
//}
|
||||||
|
//type SetFriendRemarkResp struct {
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type RemoveBlacklistReq struct {
|
||||||
|
// ParamsCommFriend
|
||||||
|
//}
|
||||||
|
//type RemoveBlacklistResp struct {
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type IsFriendReq struct {
|
||||||
|
// ParamsCommFriend
|
||||||
|
//}
|
||||||
|
//type Response struct {
|
||||||
|
// Friend bool `json:"isFriend"`
|
||||||
|
//}
|
||||||
|
//type IsFriendResp struct {
|
||||||
|
//
|
||||||
|
// Response Response `json:"data"`
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type GetFriendsInfoReq struct {
|
||||||
|
// ParamsCommFriend
|
||||||
|
//}
|
||||||
|
//type GetFriendsInfoResp struct {
|
||||||
|
//
|
||||||
|
// FriendInfoList []*sdkws.FriendInfo `json:"-"`
|
||||||
|
// Map []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type GetFriendListReq struct {
|
||||||
|
// OperationID string `json:"operationID" binding:"required"`
|
||||||
|
// FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
//}
|
||||||
|
//type GetFriendListResp struct {
|
||||||
|
//
|
||||||
|
// FriendInfoList []*sdkws.FriendInfo `json:"-"`
|
||||||
|
// Map []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type GetFriendApplyListReq struct {
|
||||||
|
// OperationID string `json:"operationID" binding:"required"`
|
||||||
|
// FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
//}
|
||||||
|
//type GetFriendApplyListResp struct {
|
||||||
|
//
|
||||||
|
// FriendRequestList []*sdkws.FriendRequest `json:"-"`
|
||||||
|
// Map []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type GetSelfApplyListReq struct {
|
||||||
|
// OperationID string `json:"operationID" binding:"required"`
|
||||||
|
// FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
//}
|
||||||
|
//type GetSelfApplyListResp struct {
|
||||||
|
//
|
||||||
|
// FriendRequestList []*sdkws.FriendRequest `json:"-"`
|
||||||
|
// Map []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
//}
|
||||||
|
|
||||||
|
type FriendInfo struct {
|
||||||
|
UserID string `json:"userID"`
|
||||||
|
Nickname string `json:"nickname"`
|
||||||
|
FaceURL string `json:"faceURL"`
|
||||||
|
Gender int32 `json:"gender"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type PublicUserInfo struct {
|
||||||
|
UserID string `json:"userID"`
|
||||||
|
Nickname string `json:"nickname"`
|
||||||
|
FaceURL string `json:"faceURL"`
|
||||||
|
Gender int32 `json:"gender"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FriendRequest struct {
|
||||||
|
FromUserID string `json:"fromUserID"`
|
||||||
|
FromNickname string `json:"fromNickname"`
|
||||||
|
FromFaceURL string `json:"fromFaceURL"`
|
||||||
|
FromGender int32 `json:"fromGender"`
|
||||||
|
ToUserID string `json:"toUserID"`
|
||||||
|
ToNickname string `json:"toNickname"`
|
||||||
|
ToFaceURL string `json:"toFaceURL"`
|
||||||
|
ToGender int32 `json:"toGender"`
|
||||||
|
HandleResult int32 `json:"handleResult"`
|
||||||
|
ReqMsg string `json:"reqMsg"`
|
||||||
|
CreateTime uint32 `json:"createTime"`
|
||||||
|
HandlerUserID string `json:"handlerUserID"`
|
||||||
|
HandleMsg string `json:"handleMsg"`
|
||||||
|
HandleTime uint32 `json:"handleTime"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AddBlacklistReq struct {
|
||||||
|
ToUserID string `json:"toUserID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
type AddBlacklistResp struct{}
|
||||||
|
|
||||||
|
type ImportFriendReq struct {
|
||||||
|
FriendUserIDList []string `json:"friendUserIDList" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ImportFriendResp struct {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
type AddFriendReq struct {
|
||||||
|
ToUserID string `json:"toUserID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
ReqMsg string `json:"reqMsg"`
|
||||||
|
}
|
||||||
|
type AddFriendResp struct {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
type AddFriendResponseReq struct {
|
||||||
|
ToUserID string `json:"toUserID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
HandleResult int32 `json:"flag" binding:"required,oneof=-1 0 1"`
|
||||||
|
HandleMsg string `json:"handleMsg"`
|
||||||
|
}
|
||||||
|
type AddFriendResponseResp struct{}
|
||||||
|
|
||||||
|
type DeleteFriendReq struct {
|
||||||
|
ToUserID string `json:"toUserID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
type DeleteFriendResp struct{}
|
||||||
|
|
||||||
|
type GetBlackListReq struct {
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
type GetBlackListResp struct {
|
||||||
|
BlackUserInfoList []PublicUserInfo `json:"blackUserInfoList"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetFriendRemarkReq struct {
|
||||||
|
ToUserID string `json:"toUserID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
}
|
||||||
|
type SetFriendRemarkResp struct{}
|
||||||
|
|
||||||
|
type RemoveBlacklistReq struct {
|
||||||
|
ToUserID string `json:"toUserID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
type RemoveBlacklistResp struct{}
|
||||||
|
|
||||||
|
type IsFriendReq struct {
|
||||||
|
ToUserID string `json:"toUserID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
type Response struct {
|
||||||
|
Friend bool `json:"isFriend"`
|
||||||
|
}
|
||||||
|
type IsFriendResp struct {
|
||||||
|
Response Response `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetFriendListReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
type GetFriendListResp struct {
|
||||||
|
OwnerUserID string `json:"ownerUserID"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
CreateTime uint32 `json:"createTime"`
|
||||||
|
AddSource int32 `json:"addSource"`
|
||||||
|
OperatorUserID string `json:"operatorUserID"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
// FriendUser *UserInfo // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetFriendApplyListReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetFriendApplyListResp struct {
|
||||||
|
FriendRequestList []FriendRequest `json:"friendRequestList"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetSelfApplyListReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
type GetSelfApplyListResp struct {
|
||||||
|
FriendRequestList []FriendRequest `json:"friendRequestList"`
|
||||||
|
}
|
||||||
@@ -0,0 +1,272 @@
|
|||||||
|
// Copyright © 2023 OpenIM. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package apistruct
|
||||||
|
|
||||||
|
import (
|
||||||
|
sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||||
|
)
|
||||||
|
|
||||||
|
type KickGroupMemberReq struct {
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
KickedUserIDList []string `json:"kickedUserIDList" binding:"required"`
|
||||||
|
Reason string `json:"reason"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
type KickGroupMemberResp struct {
|
||||||
|
// UserIDResultList []*UserIDResult `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetGroupMembersInfoReq struct {
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
MemberList []string `json:"memberList" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
type GetGroupMembersInfoResp struct {
|
||||||
|
MemberList []*sdkws.GroupMemberFullInfo `json:"-"`
|
||||||
|
Data []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type InviteUserToGroupReq struct {
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
InvitedUserIDList []string `json:"invitedUserIDList" binding:"required"`
|
||||||
|
Reason string `json:"reason"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
type InviteUserToGroupResp struct {
|
||||||
|
// UserIDResultList []*UserIDResult `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetJoinedGroupListReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
}
|
||||||
|
type GetJoinedGroupListResp struct {
|
||||||
|
GroupInfoList []*sdkws.GroupInfo `json:"-"`
|
||||||
|
Data []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetGroupMemberListReq struct {
|
||||||
|
GroupID string `json:"groupID"`
|
||||||
|
Filter int32 `json:"filter"`
|
||||||
|
NextSeq int32 `json:"nextSeq"`
|
||||||
|
OperationID string `json:"operationID"`
|
||||||
|
}
|
||||||
|
type GetGroupMemberListResp struct {
|
||||||
|
NextSeq int32 `json:"nextSeq"`
|
||||||
|
MemberList []*sdkws.GroupMemberFullInfo `json:"-"`
|
||||||
|
Data []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetGroupAllMemberReq struct {
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
Offset int32 `json:"offset"`
|
||||||
|
Count int32 `json:"count"`
|
||||||
|
}
|
||||||
|
type GetGroupAllMemberResp struct {
|
||||||
|
MemberList []*sdkws.GroupMemberFullInfo `json:"-"`
|
||||||
|
Data []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//type GetGroupAllMemberListBySplitReq struct {
|
||||||
|
// GroupID string `json:"groupID" binding:"required"`
|
||||||
|
// OperationID string `json:"operationID" binding:"required"`
|
||||||
|
// Offset int32 `json:"offset" binding:"required"`
|
||||||
|
// Count int32 `json:"count" binding:"required"`
|
||||||
|
//}
|
||||||
|
//type GetGroupAllMemberListBySplitResp struct {
|
||||||
|
//
|
||||||
|
// MemberList []*sdkws.GroupMemberFullInfo `json:"-"`
|
||||||
|
// Map []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
//}
|
||||||
|
|
||||||
|
type CreateGroupReq struct {
|
||||||
|
MemberList []*GroupAddMemberInfo `json:"memberList"`
|
||||||
|
OwnerUserID string `json:"ownerUserID"`
|
||||||
|
GroupType int32 `json:"groupType"`
|
||||||
|
GroupName string `json:"groupName"`
|
||||||
|
Notification string `json:"notification"`
|
||||||
|
Introduction string `json:"introduction"`
|
||||||
|
FaceURL string `json:"faceURL"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
GroupID string `json:"groupID"`
|
||||||
|
}
|
||||||
|
type CreateGroupResp struct {
|
||||||
|
GroupInfo sdkws.GroupInfo `json:"-"`
|
||||||
|
Data map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetGroupApplicationListReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"` // 作为管理员或群主收到的 进群申请
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetGroupApplicationListResp struct {
|
||||||
|
GroupRequestList []*sdkws.GroupRequest `json:"-"`
|
||||||
|
Data []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetUserReqGroupApplicationListReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
UserID string `json:"userID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetUserRespGroupApplicationResp struct {
|
||||||
|
GroupRequestList []*sdkws.GroupRequest `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetGroupInfoReq struct {
|
||||||
|
GroupIDList []string `json:"groupIDList" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
type GetGroupInfoResp struct {
|
||||||
|
GroupInfoList []*sdkws.GroupInfo `json:"-"`
|
||||||
|
Data []map[string]interface{} `json:"data" swaggerignore:"true"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//type GroupInfoAlias struct {
|
||||||
|
// sdkws.GroupInfo
|
||||||
|
// NeedVerification int32 `protobuf:"bytes,13,opt,name=needVerification" json:"needVerification,omitempty"`
|
||||||
|
//}
|
||||||
|
|
||||||
|
//type GroupInfoAlias struct {
|
||||||
|
// GroupID string `protobuf:"bytes,1,opt,name=groupID" json:"groupID,omitempty"`
|
||||||
|
// GroupName string `protobuf:"bytes,2,opt,name=groupName" json:"groupName,omitempty"`
|
||||||
|
// Notification string `protobuf:"bytes,3,opt,name=notification" json:"notification,omitempty"`
|
||||||
|
// Introduction string `protobuf:"bytes,4,opt,name=introduction" json:"introduction,omitempty"`
|
||||||
|
// FaceURL string `protobuf:"bytes,5,opt,name=faceURL" json:"faceURL,omitempty"`
|
||||||
|
// OwnerUserID string `protobuf:"bytes,6,opt,name=ownerUserID" json:"ownerUserID,omitempty"`
|
||||||
|
// CreateTime uint32 `protobuf:"varint,7,opt,name=createTime" json:"createTime,omitempty"`
|
||||||
|
// MemberCount uint32 `protobuf:"varint,8,opt,name=memberCount" json:"memberCount,omitempty"`
|
||||||
|
// Ex string `protobuf:"bytes,9,opt,name=ex" json:"ex,omitempty"`
|
||||||
|
// Status int32 `protobuf:"varint,10,opt,name=status" json:"status,omitempty"`
|
||||||
|
// CreatorUserID string `protobuf:"bytes,11,opt,name=creatorUserID" json:"creatorUserID,omitempty"`
|
||||||
|
// GroupType int32 `protobuf:"varint,12,opt,name=groupType" json:"groupType,omitempty"`
|
||||||
|
// NeedVerification int32 `protobuf:"bytes,13,opt,name=needVerification" json:"needVerification,omitempty"`
|
||||||
|
//}
|
||||||
|
|
||||||
|
type ApplicationGroupResponseReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"` // application from FromUserID
|
||||||
|
HandledMsg string `json:"handledMsg"`
|
||||||
|
HandleResult int32 `json:"handleResult" binding:"required,oneof=-1 1"`
|
||||||
|
}
|
||||||
|
type ApplicationGroupResponseResp struct{}
|
||||||
|
|
||||||
|
type JoinGroupReq struct {
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
ReqMessage string `json:"reqMessage"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
JoinSource int32 `json:"joinSource"`
|
||||||
|
InviterUserID string `json:"inviterUserID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type JoinGroupResp struct{}
|
||||||
|
|
||||||
|
type QuitGroupReq struct {
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
type QuitGroupResp struct{}
|
||||||
|
|
||||||
|
type SetGroupInfoReq struct {
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
GroupName string `json:"groupName"`
|
||||||
|
Notification string `json:"notification"`
|
||||||
|
Introduction string `json:"introduction"`
|
||||||
|
FaceURL string `json:"faceURL"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
NeedVerification *int32 `json:"needVerification"`
|
||||||
|
LookMemberInfo *int32 `json:"lookMemberInfo"`
|
||||||
|
ApplyMemberFriend *int32 `json:"applyMemberFriend"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetGroupInfoResp struct{}
|
||||||
|
|
||||||
|
type TransferGroupOwnerReq struct {
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
OldOwnerUserID string `json:"oldOwnerUserID" binding:"required"`
|
||||||
|
NewOwnerUserID string `json:"newOwnerUserID" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
type TransferGroupOwnerResp struct{}
|
||||||
|
|
||||||
|
type DismissGroupReq struct {
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
type DismissGroupResp struct{}
|
||||||
|
|
||||||
|
type MuteGroupMemberReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
UserID string `json:"userID" binding:"required"`
|
||||||
|
MutedSeconds uint32 `json:"mutedSeconds" binding:"required"`
|
||||||
|
}
|
||||||
|
type MuteGroupMemberResp struct{}
|
||||||
|
|
||||||
|
type CancelMuteGroupMemberReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
UserID string `json:"userID" binding:"required"`
|
||||||
|
}
|
||||||
|
type CancelMuteGroupMemberResp struct{}
|
||||||
|
|
||||||
|
type MuteGroupReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
}
|
||||||
|
type MuteGroupResp struct{}
|
||||||
|
|
||||||
|
type CancelMuteGroupReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
}
|
||||||
|
type CancelMuteGroupResp struct{}
|
||||||
|
|
||||||
|
type SetGroupMemberNicknameReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
UserID string `json:"userID" binding:"required"`
|
||||||
|
Nickname string `json:"nickname"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetGroupMemberNicknameResp struct{}
|
||||||
|
|
||||||
|
type SetGroupMemberInfoReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
UserID string `json:"userID" binding:"required"`
|
||||||
|
Nickname *string `json:"nickname"`
|
||||||
|
FaceURL *string `json:"userGroupFaceUrl"`
|
||||||
|
RoleLevel *int32 `json:"roleLevel" validate:"gte=1,lte=3"`
|
||||||
|
Ex *string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetGroupMemberInfoResp struct{}
|
||||||
|
|
||||||
|
type GetGroupAbstractInfoReq struct {
|
||||||
|
OperationID string `json:"operationID"`
|
||||||
|
GroupID string `json:"groupID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetGroupAbstractInfoResp struct {
|
||||||
|
GroupMemberNumber int32 `json:"groupMemberNumber"`
|
||||||
|
GroupMemberListHash uint64 `json:"groupMemberListHash"`
|
||||||
|
}
|
||||||
+60
-10
@@ -18,7 +18,34 @@ import (
|
|||||||
sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SendMsg struct {
|
type DeleteUsersReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
DeleteUserIDList []string `json:"deleteUserIDList" binding:"required"`
|
||||||
|
}
|
||||||
|
type DeleteUsersResp struct {
|
||||||
|
FailedUserIDList []string `json:"data"`
|
||||||
|
}
|
||||||
|
type GetAllUsersUidReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
type GetAllUsersUidResp struct {
|
||||||
|
UserIDList []string `json:"data"`
|
||||||
|
}
|
||||||
|
type GetUsersOnlineStatusReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
UserIDList []string `json:"userIDList" binding:"required,lte=200"`
|
||||||
|
}
|
||||||
|
type GetUsersOnlineStatusResp struct {
|
||||||
|
// SuccessResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccountCheckReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
CheckUserIDList []string `json:"checkUserIDList" binding:"required,lte=100"`
|
||||||
|
}
|
||||||
|
type AccountCheckResp struct{}
|
||||||
|
|
||||||
|
type ManagementSendMsg struct {
|
||||||
SendID string `json:"sendID" binding:"required"`
|
SendID string `json:"sendID" binding:"required"`
|
||||||
GroupID string `json:"groupID" binding:"required_if=SessionType 2|required_if=SessionType 3"`
|
GroupID string `json:"groupID" binding:"required_if=SessionType 2|required_if=SessionType 3"`
|
||||||
SenderNickname string `json:"senderNickname"`
|
SenderNickname string `json:"senderNickname"`
|
||||||
@@ -32,25 +59,48 @@ type SendMsg struct {
|
|||||||
OfflinePushInfo *sdkws.OfflinePushInfo `json:"offlinePushInfo"`
|
OfflinePushInfo *sdkws.OfflinePushInfo `json:"offlinePushInfo"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SendMsgReq struct {
|
type ManagementSendMsgReq struct {
|
||||||
|
SendID string `json:"sendID" binding:"required"`
|
||||||
RecvID string `json:"recvID" binding:"required_if" message:"recvID is required if sessionType is SingleChatType or NotificationChatType"`
|
RecvID string `json:"recvID" binding:"required_if" message:"recvID is required if sessionType is SingleChatType or NotificationChatType"`
|
||||||
SendMsg
|
GroupID string `json:"groupID" binding:"required_if" message:"groupID is required if sessionType is GroupChatType or SuperGroupChatType"`
|
||||||
|
SenderNickname string `json:"senderNickname"`
|
||||||
|
SenderFaceURL string `json:"senderFaceURL"`
|
||||||
|
SenderPlatformID int32 `json:"senderPlatformID"`
|
||||||
|
Content map[string]interface{} `json:"content" binding:"required" swaggerignore:"true"`
|
||||||
|
ContentType int32 `json:"contentType" binding:"required"`
|
||||||
|
SessionType int32 `json:"sessionType" binding:"required"`
|
||||||
|
IsOnlineOnly bool `json:"isOnlineOnly"`
|
||||||
|
NotOfflinePush bool `json:"notOfflinePush"`
|
||||||
|
OfflinePushInfo *sdkws.OfflinePushInfo `json:"offlinePushInfo"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type BatchSendMsgReq struct {
|
type ManagementSendMsgResp struct {
|
||||||
SendMsg
|
ResultList sdkws.UserSendMsgResp `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ManagementBatchSendMsgReq struct {
|
||||||
|
ManagementSendMsg
|
||||||
IsSendAll bool `json:"isSendAll"`
|
IsSendAll bool `json:"isSendAll"`
|
||||||
RecvIDs []string `json:"recvIDs"`
|
RecvIDList []string `json:"recvIDList"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type BatchSendMsgResp struct {
|
type ManagementBatchSendMsgResp struct {
|
||||||
Results []*SingleReturnResult `json:"results"`
|
Data struct {
|
||||||
FailedIDs []string `json:"failedUserIDs"`
|
ResultList []*SingleReturnResult `json:"resultList"`
|
||||||
|
FailedIDList []string
|
||||||
|
} `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SingleReturnResult struct {
|
type SingleReturnResult struct {
|
||||||
ServerMsgID string `json:"serverMsgID"`
|
ServerMsgID string `json:"serverMsgID"`
|
||||||
ClientMsgID string `json:"clientMsgID"`
|
ClientMsgID string `json:"clientMsgID"`
|
||||||
SendTime int64 `json:"sendTime"`
|
SendTime int64 `json:"sendTime"`
|
||||||
RecvID string `json:"recvID"`
|
RecvID string `json:"recvID"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CheckMsgIsSendSuccessReq struct {
|
||||||
|
OperationID string `json:"operationID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CheckMsgIsSendSuccessResp struct {
|
||||||
|
Status int32 `json:"status"`
|
||||||
|
}
|
||||||
|
|||||||
+41
-1
@@ -14,6 +14,46 @@
|
|||||||
|
|
||||||
package apistruct
|
package apistruct
|
||||||
|
|
||||||
|
type DelMsgReq struct {
|
||||||
|
UserID string `json:"userID,omitempty" binding:"required"`
|
||||||
|
SeqList []uint32 `json:"seqList,omitempty" binding:"required"`
|
||||||
|
OperationID string `json:"operationID,omitempty" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DelMsgResp struct{}
|
||||||
|
|
||||||
|
type CleanUpMsgReq struct {
|
||||||
|
UserID string `json:"userID" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CleanUpMsgResp struct{}
|
||||||
|
|
||||||
|
type DelSuperGroupMsgReq struct {
|
||||||
|
UserID string `json:"userID" binding:"required"`
|
||||||
|
GroupID string `json:"groupID" binding:"required"`
|
||||||
|
SeqList []uint32 `json:"seqList,omitempty"`
|
||||||
|
IsAllDelete bool `json:"isAllDelete"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DelSuperGroupMsgResp struct{}
|
||||||
|
|
||||||
|
type MsgDeleteNotificationElem struct {
|
||||||
|
GroupID string `json:"groupID"`
|
||||||
|
IsAllDelete bool `json:"isAllDelete"`
|
||||||
|
SeqList []uint32 `json:"seqList"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetMsgMinSeqReq struct {
|
||||||
|
UserID string `json:"userID" binding:"required"`
|
||||||
|
GroupID string `json:"groupID"`
|
||||||
|
MinSeq uint32 `json:"minSeq" binding:"required"`
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetMsgMinSeqResp struct{}
|
||||||
|
|
||||||
type PictureBaseInfo struct {
|
type PictureBaseInfo struct {
|
||||||
UUID string `mapstructure:"uuid"`
|
UUID string `mapstructure:"uuid"`
|
||||||
Type string `mapstructure:"type"`
|
Type string `mapstructure:"type"`
|
||||||
@@ -73,7 +113,7 @@ type CustomElem struct {
|
|||||||
Extension string `mapstructure:"extension"`
|
Extension string `mapstructure:"extension"`
|
||||||
}
|
}
|
||||||
type TextElem struct {
|
type TextElem struct {
|
||||||
Text string `mapstructure:"text" validate:"required"`
|
Content string `mapstructure:"content" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type RevokeElem struct {
|
type RevokeElem struct {
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// Copyright © 2023 OpenIM. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package apistruct
|
||||||
|
|
||||||
|
type OSSCredentialReq struct {
|
||||||
|
OperationID string `json:"operationID"`
|
||||||
|
Filename string `json:"filename"`
|
||||||
|
FileType string `json:"file_type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type OSSCredentialRespData struct {
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
AccessKeyId string `json:"access_key_id"`
|
||||||
|
AccessKeySecret string `json:"access_key_secret"`
|
||||||
|
Token string `json:"token"`
|
||||||
|
Bucket string `json:"bucket"`
|
||||||
|
FinalHost string `json:"final_host"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type OSSCredentialResp struct {
|
||||||
|
OssData OSSCredentialRespData `json:"-"`
|
||||||
|
Data map[string]interface{} `json:"data"`
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// Copyright © 2023 OpenIM. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package apistruct
|
||||||
|
|
||||||
|
type Pagination struct {
|
||||||
|
PageNumber int32 `json:"pageNumber" binding:"required"`
|
||||||
|
ShowNumber int32 `json:"showNumber" binding:"required"`
|
||||||
|
}
|
||||||
@@ -14,6 +14,18 @@
|
|||||||
|
|
||||||
package apistruct
|
package apistruct
|
||||||
|
|
||||||
|
type ApiUserInfo struct {
|
||||||
|
UserID string `json:"userID" binding:"required,min=1,max=64" swaggo:"true,用户ID,"`
|
||||||
|
Nickname string `json:"nickname" binding:"omitempty,min=1,max=64" swaggo:"true,my id,19"`
|
||||||
|
FaceURL string `json:"faceURL" binding:"omitempty,max=1024"`
|
||||||
|
Gender int32 `json:"gender" binding:"omitempty,oneof=0 1 2"`
|
||||||
|
PhoneNumber string `json:"phoneNumber" binding:"omitempty,max=32"`
|
||||||
|
Birth int64 `json:"birth" binding:"omitempty"`
|
||||||
|
Email string `json:"email" binding:"omitempty,max=64"`
|
||||||
|
CreateTime int64 `json:"createTime"`
|
||||||
|
Ex string `json:"ex" binding:"omitempty,max=1024"`
|
||||||
|
}
|
||||||
|
|
||||||
type GroupAddMemberInfo struct {
|
type GroupAddMemberInfo struct {
|
||||||
UserID string `json:"userID" binding:"required"`
|
UserID string `json:"userID" binding:"required"`
|
||||||
RoleLevel int32 `json:"roleLevel" binding:"required,oneof= 1 3"`
|
RoleLevel int32 `json:"roleLevel" binding:"required,oneof= 1 3"`
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
// Copyright © 2023 OpenIM. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package apistruct
|
||||||
|
|
||||||
|
type GetJoinedSuperGroupListReq struct {
|
||||||
|
GetJoinedGroupListReq
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetJoinedSuperGroupListResp struct {
|
||||||
|
GetJoinedGroupListResp
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetSuperGroupsInfoReq struct {
|
||||||
|
GetGroupInfoReq
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetSuperGroupsInfoResp struct {
|
||||||
|
GetGroupInfoResp
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
// Copyright © 2023 OpenIM. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package apistruct
|
||||||
|
|
||||||
|
import "mime/multipart"
|
||||||
|
|
||||||
|
type MinioStorageCredentialReq struct {
|
||||||
|
OperationID string `json:"operationID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MiniostorageCredentialResp struct {
|
||||||
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
|
AccessKeyID string `json:"accessKeyID"`
|
||||||
|
SessionToken string `json:"sessionToken"`
|
||||||
|
BucketName string `json:"bucketName"`
|
||||||
|
StsEndpointURL string `json:"stsEndpointURL"`
|
||||||
|
StorageTime int `json:"storageTime"`
|
||||||
|
IsDistributedMod bool `json:"isDistributedMod"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MinioUploadFileReq struct {
|
||||||
|
OperationID string `form:"operationID" binding:"required"`
|
||||||
|
FileType int `form:"fileType" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MinioUploadFile struct {
|
||||||
|
URL string `json:"URL"`
|
||||||
|
NewName string `json:"newName"`
|
||||||
|
SnapshotURL string `json:"snapshotURL,omitempty"`
|
||||||
|
SnapshotNewName string `json:"snapshotName,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MinioUploadFileResp struct {
|
||||||
|
Data struct {
|
||||||
|
MinioUploadFile
|
||||||
|
} `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UploadUpdateAppReq struct {
|
||||||
|
OperationID string `form:"operationID" binding:"required"`
|
||||||
|
Type int `form:"type" binding:"required"`
|
||||||
|
Version string `form:"version" binding:"required"`
|
||||||
|
File *multipart.FileHeader `form:"file" binding:"required"`
|
||||||
|
Yaml *multipart.FileHeader `form:"yaml"`
|
||||||
|
ForceUpdate bool `form:"forceUpdate"`
|
||||||
|
UpdateLog string `form:"updateLog" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UploadUpdateAppResp struct{}
|
||||||
|
|
||||||
|
type GetDownloadURLReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
Type int `json:"type" binding:"required"`
|
||||||
|
Version string `json:"version" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetDownloadURLResp struct {
|
||||||
|
Data struct {
|
||||||
|
HasNewVersion bool `json:"hasNewVersion"`
|
||||||
|
ForceUpdate bool `json:"forceUpdate"`
|
||||||
|
FileURL string `json:"fileURL"`
|
||||||
|
YamlURL string `json:"yamlURL"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
UpdateLog string `json:"update_log"`
|
||||||
|
} `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetRTCInvitationInfoReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
ClientMsgID string `json:"clientMsgID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetRTCInvitationInfoResp struct {
|
||||||
|
Data struct {
|
||||||
|
OpUserID string `json:"opUserID"`
|
||||||
|
Invitation struct {
|
||||||
|
InviterUserID string `json:"inviterUserID"`
|
||||||
|
InviteeUserIDList []string `json:"inviteeUserIDList"`
|
||||||
|
GroupID string `json:"groupID"`
|
||||||
|
RoomID string `json:"roomID"`
|
||||||
|
Timeout int32 `json:"timeout"`
|
||||||
|
MediaType string `json:"mediaType"`
|
||||||
|
SessionType int32 `json:"sessionType"`
|
||||||
|
InitiateTime int32 `json:"initiateTime"`
|
||||||
|
PlatformID int32 `json:"platformID"`
|
||||||
|
CustomData string `json:"customData"`
|
||||||
|
} `json:"invitation"`
|
||||||
|
OfflinePushInfo struct{} `json:"offlinePushInfo"`
|
||||||
|
} `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetRTCInvitationInfoStartAppReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetRTCInvitationInfoStartAppResp struct {
|
||||||
|
GetRTCInvitationInfoResp
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FCM第三方上报Token.
|
||||||
|
*/
|
||||||
|
type FcmUpdateTokenReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
Platform int `json:"platform" binding:"required,min=1,max=2"` // only for ios + android
|
||||||
|
FcmToken string `json:"fcmToken" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FcmUpdateTokenResp struct{}
|
||||||
|
type SetAppBadgeReq struct {
|
||||||
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
|
FromUserID string `json:"fromUserID" binding:"required"`
|
||||||
|
AppUnreadCount int32 `json:"appUnreadCount"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SetAppBadgeResp struct{}
|
||||||
@@ -16,7 +16,7 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/internal/msggateway"
|
"github.com/OpenIMSDK/Open-IM-Server/internal/msggateway"
|
||||||
//"github.com/OpenIMSDK/Open-IM-Server/internal/msggateway".
|
//"github.com/OpenIMSDK/Open-IM-Server/internal/msggateway"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ type CallBackConfig struct {
|
|||||||
|
|
||||||
type NotificationConf struct {
|
type NotificationConf struct {
|
||||||
IsSendMsg bool `yaml:"isSendMsg"`
|
IsSendMsg bool `yaml:"isSendMsg"`
|
||||||
ReliabilityLevel int `yaml:"reliabilityLevel"` // 1 online 2 persistent
|
ReliabilityLevel int `yaml:"reliabilityLevel"` // 1 online 2 presistent
|
||||||
UnreadCount bool `yaml:"unreadCount"`
|
UnreadCount bool `yaml:"unreadCount"`
|
||||||
OfflinePush POfflinePush `yaml:"offlinePush"`
|
OfflinePush POfflinePush `yaml:"offlinePush"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
_, b, _, _ = runtime.Caller(0)
|
_, b, _, _ = runtime.Caller(0)
|
||||||
// Root folder of this project.
|
// Root folder of this project
|
||||||
Root = filepath.Join(filepath.Dir(b), "../../..")
|
Root = filepath.Join(filepath.Dir(b), "../../..")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ const (
|
|||||||
SignalMsg = 202
|
SignalMsg = 202
|
||||||
CustomNotification = 203
|
CustomNotification = 203
|
||||||
|
|
||||||
// SysRelated.
|
//SysRelated.
|
||||||
NotificationBegin = 1000
|
NotificationBegin = 1000
|
||||||
|
|
||||||
FriendApplicationApprovedNotification = 1201 // add_friend_response
|
FriendApplicationApprovedNotification = 1201 // add_friend_response
|
||||||
@@ -113,37 +113,37 @@ const (
|
|||||||
|
|
||||||
NotificationEnd = 5000
|
NotificationEnd = 5000
|
||||||
|
|
||||||
// status.
|
//status.
|
||||||
MsgNormal = 1
|
MsgNormal = 1
|
||||||
MsgDeleted = 4
|
MsgDeleted = 4
|
||||||
|
|
||||||
// MsgFrom.
|
//MsgFrom.
|
||||||
UserMsgType = 100
|
UserMsgType = 100
|
||||||
SysMsgType = 200
|
SysMsgType = 200
|
||||||
|
|
||||||
// SessionType.
|
//SessionType.
|
||||||
SingleChatType = 1
|
SingleChatType = 1
|
||||||
GroupChatType = 2
|
GroupChatType = 2
|
||||||
SuperGroupChatType = 3
|
SuperGroupChatType = 3
|
||||||
NotificationChatType = 4
|
NotificationChatType = 4
|
||||||
// token.
|
//token.
|
||||||
NormalToken = 0
|
NormalToken = 0
|
||||||
InValidToken = 1
|
InValidToken = 1
|
||||||
KickedToken = 2
|
KickedToken = 2
|
||||||
ExpiredToken = 3
|
ExpiredToken = 3
|
||||||
|
|
||||||
// MultiTerminalLogin.
|
//MultiTerminalLogin.
|
||||||
DefalutNotKick = 0
|
DefalutNotKick = 0
|
||||||
// Full-end login, but the same end is mutually exclusive.
|
//Full-end login, but the same end is mutually exclusive.
|
||||||
AllLoginButSameTermKick = 1
|
AllLoginButSameTermKick = 1
|
||||||
// Only one of the endpoints can log in.
|
//Only one of the endpoints can log in.
|
||||||
SingleTerminalLogin = 2
|
SingleTerminalLogin = 2
|
||||||
// The web side can be online at the same time, and the other side can only log in at one end.
|
//The web side can be online at the same time, and the other side can only log in at one end.
|
||||||
WebAndOther = 3
|
WebAndOther = 3
|
||||||
// The PC side is mutually exclusive, and the mobile side is mutually exclusive, but the web side can be online at
|
// The PC side is mutually exclusive, and the mobile side is mutually exclusive, but the web side can be online at
|
||||||
// the same time.
|
// the same time.
|
||||||
PcMobileAndWeb = 4
|
PcMobileAndWeb = 4
|
||||||
// The PC terminal can be online at the same time,but other terminal only one of the endpoints can login.
|
//The PC terminal can be online at the same time,but other terminal only one of the endpoints can login.
|
||||||
PCAndOther = 5
|
PCAndOther = 5
|
||||||
|
|
||||||
OnlineStatus = "online"
|
OnlineStatus = "online"
|
||||||
@@ -151,12 +151,12 @@ const (
|
|||||||
Registered = "registered"
|
Registered = "registered"
|
||||||
UnRegistered = "unregistered"
|
UnRegistered = "unregistered"
|
||||||
|
|
||||||
// MsgReceiveOpt.
|
//MsgReceiveOpt.
|
||||||
ReceiveMessage = 0
|
ReceiveMessage = 0
|
||||||
NotReceiveMessage = 1
|
NotReceiveMessage = 1
|
||||||
ReceiveNotNotifyMessage = 2
|
ReceiveNotNotifyMessage = 2
|
||||||
|
|
||||||
// OptionsKey.
|
//OptionsKey.
|
||||||
IsHistory = "history"
|
IsHistory = "history"
|
||||||
IsPersistent = "persistent"
|
IsPersistent = "persistent"
|
||||||
IsOfflinePush = "offlinePush"
|
IsOfflinePush = "offlinePush"
|
||||||
@@ -170,13 +170,13 @@ const (
|
|||||||
IsNotNotification = "isNotNotification"
|
IsNotNotification = "isNotNotification"
|
||||||
IsSendMsg = "isSendMsg"
|
IsSendMsg = "isSendMsg"
|
||||||
|
|
||||||
// GroupStatus.
|
//GroupStatus.
|
||||||
GroupOk = 0
|
GroupOk = 0
|
||||||
GroupBanChat = 1
|
GroupBanChat = 1
|
||||||
GroupStatusDismissed = 2
|
GroupStatusDismissed = 2
|
||||||
GroupStatusMuted = 3
|
GroupStatusMuted = 3
|
||||||
|
|
||||||
// GroupType.
|
//GroupType.
|
||||||
NormalGroup = 0
|
NormalGroup = 0
|
||||||
SuperGroup = 1
|
SuperGroup = 1
|
||||||
WorkingGroup = 2
|
WorkingGroup = 2
|
||||||
@@ -184,19 +184,19 @@ const (
|
|||||||
GroupBaned = 3
|
GroupBaned = 3
|
||||||
GroupBanPrivateChat = 4
|
GroupBanPrivateChat = 4
|
||||||
|
|
||||||
// UserJoinGroupSource.
|
//UserJoinGroupSource.
|
||||||
JoinByAdmin = 1
|
JoinByAdmin = 1
|
||||||
|
|
||||||
JoinByInvitation = 2
|
JoinByInvitation = 2
|
||||||
JoinBySearch = 3
|
JoinBySearch = 3
|
||||||
JoinByQRCode = 4
|
JoinByQRCode = 4
|
||||||
|
|
||||||
// Minio.
|
//Minio.
|
||||||
MinioDurationTimes = 3600
|
MinioDurationTimes = 3600
|
||||||
// Aws.
|
//Aws.
|
||||||
AwsDurationTimes = 3600
|
AwsDurationTimes = 3600
|
||||||
|
|
||||||
// callbackCommand.
|
//callbackCommand.
|
||||||
CallbackBeforeSendSingleMsgCommand = "callbackBeforeSendSingleMsgCommand"
|
CallbackBeforeSendSingleMsgCommand = "callbackBeforeSendSingleMsgCommand"
|
||||||
CallbackAfterSendSingleMsgCommand = "callbackAfterSendSingleMsgCommand"
|
CallbackAfterSendSingleMsgCommand = "callbackAfterSendSingleMsgCommand"
|
||||||
CallbackBeforeSendGroupMsgCommand = "callbackBeforeSendGroupMsgCommand"
|
CallbackBeforeSendGroupMsgCommand = "callbackBeforeSendGroupMsgCommand"
|
||||||
@@ -217,10 +217,10 @@ const (
|
|||||||
CallbackGetMessageListReactionExtensionsCommand = "callbackGetMessageListReactionExtensionsCommand"
|
CallbackGetMessageListReactionExtensionsCommand = "callbackGetMessageListReactionExtensionsCommand"
|
||||||
CallbackAddMessageListReactionExtensionsCommand = "callbackAddMessageListReactionExtensionsCommand"
|
CallbackAddMessageListReactionExtensionsCommand = "callbackAddMessageListReactionExtensionsCommand"
|
||||||
|
|
||||||
// callback actionCode.
|
//callback actionCode.
|
||||||
ActionAllow = 0
|
ActionAllow = 0
|
||||||
ActionForbidden = 1
|
ActionForbidden = 1
|
||||||
// callback callbackHandleCode.
|
//callback callbackHandleCode.
|
||||||
CallbackHandleSuccess = 0
|
CallbackHandleSuccess = 0
|
||||||
CallbackHandleFailed = 1
|
CallbackHandleFailed = 1
|
||||||
|
|
||||||
@@ -359,5 +359,3 @@ const (
|
|||||||
const OpenIMCommonConfigKey = "OpenIMServerConfig"
|
const OpenIMCommonConfigKey = "OpenIMServerConfig"
|
||||||
|
|
||||||
const CallbackCommand = "command"
|
const CallbackCommand = "command"
|
||||||
|
|
||||||
const BatchNum = 100
|
|
||||||
|
|||||||
@@ -15,9 +15,9 @@
|
|||||||
package constant
|
package constant
|
||||||
|
|
||||||
// fixme 1<--->IOS 2<--->Android 3<--->Windows
|
// fixme 1<--->IOS 2<--->Android 3<--->Windows
|
||||||
// fixme 4<--->OSX 5<--->Web 6<--->MiniWeb 7<--->Linux.
|
// fixme 4<--->OSX 5<--->Web 6<--->MiniWeb 7<--->Linux
|
||||||
const (
|
const (
|
||||||
// Platform ID.
|
//Platform ID.
|
||||||
IOSPlatformID = 1
|
IOSPlatformID = 1
|
||||||
AndroidPlatformID = 2
|
AndroidPlatformID = 2
|
||||||
WindowsPlatformID = 3
|
WindowsPlatformID = 3
|
||||||
@@ -29,7 +29,7 @@ const (
|
|||||||
IPadPlatformID = 9
|
IPadPlatformID = 9
|
||||||
AdminPlatformID = 10
|
AdminPlatformID = 10
|
||||||
|
|
||||||
// Platform string match to Platform ID.
|
//Platform string match to Platform ID.
|
||||||
IOSPlatformStr = "IOS"
|
IOSPlatformStr = "IOS"
|
||||||
AndroidPlatformStr = "Android"
|
AndroidPlatformStr = "Android"
|
||||||
WindowsPlatformStr = "Windows"
|
WindowsPlatformStr = "Windows"
|
||||||
@@ -41,7 +41,7 @@ const (
|
|||||||
IPadPlatformStr = "IPad"
|
IPadPlatformStr = "IPad"
|
||||||
AdminPlatformStr = "Admin"
|
AdminPlatformStr = "Admin"
|
||||||
|
|
||||||
// terminal types.
|
//terminal types.
|
||||||
TerminalPC = "PC"
|
TerminalPC = "PC"
|
||||||
TerminalMobile = "Mobile"
|
TerminalMobile = "Mobile"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ func Db2PbGroupMember(m *relation.GroupMemberModel) *sdkws.GroupMemberFullInfo {
|
|||||||
JoinTime: m.JoinTime.UnixMilli(),
|
JoinTime: m.JoinTime.UnixMilli(),
|
||||||
Nickname: m.Nickname,
|
Nickname: m.Nickname,
|
||||||
FaceURL: m.FaceURL,
|
FaceURL: m.FaceURL,
|
||||||
// AppMangerLevel: m.AppMangerLevel,
|
//AppMangerLevel: m.AppMangerLevel,
|
||||||
JoinSource: m.JoinSource,
|
JoinSource: m.JoinSource,
|
||||||
OperatorUserID: m.OperatorUserID,
|
OperatorUserID: m.OperatorUserID,
|
||||||
Ex: m.Ex,
|
Ex: m.Ex,
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ func MsgPb2DB(msg *sdkws.MsgData) *unrelation.MsgDataModel {
|
|||||||
msgDataModel.AttachedInfo = msg.AttachedInfo
|
msgDataModel.AttachedInfo = msg.AttachedInfo
|
||||||
msgDataModel.Ex = msg.Ex
|
msgDataModel.Ex = msg.Ex
|
||||||
return &msgDataModel
|
return &msgDataModel
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func MsgDB2Pb(msgModel *unrelation.MsgDataModel) *sdkws.MsgData {
|
func MsgDB2Pb(msgModel *unrelation.MsgDataModel) *sdkws.MsgData {
|
||||||
|
|||||||
Vendored
+3
-3
@@ -29,13 +29,13 @@ const (
|
|||||||
blackExpireTime = time.Second * 60 * 60 * 12
|
blackExpireTime = time.Second * 60 * 60 * 12
|
||||||
)
|
)
|
||||||
|
|
||||||
// args fn will exec when no data in msgCache.
|
// args fn will exec when no data in msgCache
|
||||||
type BlackCache interface {
|
type BlackCache interface {
|
||||||
// get blackIDs from msgCache
|
//get blackIDs from msgCache
|
||||||
metaCache
|
metaCache
|
||||||
NewCache() BlackCache
|
NewCache() BlackCache
|
||||||
GetBlackIDs(ctx context.Context, userID string) (blackIDs []string, err error)
|
GetBlackIDs(ctx context.Context, userID string) (blackIDs []string, err error)
|
||||||
// del user's blackIDs msgCache, exec when a user's black list changed
|
//del user's blackIDs msgCache, exec when a user's black list changed
|
||||||
DelBlackIDs(ctx context.Context, userID string) BlackCache
|
DelBlackIDs(ctx context.Context, userID string) BlackCache
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+4
-4
@@ -41,7 +41,7 @@ const (
|
|||||||
conversationExpireTime = time.Second * 60 * 60 * 12
|
conversationExpireTime = time.Second * 60 * 60 * 12
|
||||||
)
|
)
|
||||||
|
|
||||||
// arg fn will exec when no data in msgCache.
|
// arg fn will exec when no data in msgCache
|
||||||
type ConversationCache interface {
|
type ConversationCache interface {
|
||||||
metaCache
|
metaCache
|
||||||
NewCache() ConversationCache
|
NewCache() ConversationCache
|
||||||
@@ -54,7 +54,7 @@ type ConversationCache interface {
|
|||||||
|
|
||||||
// get one conversation from msgCache
|
// get one conversation from msgCache
|
||||||
GetConversation(ctx context.Context, ownerUserID, conversationID string) (*relationTb.ConversationModel, error)
|
GetConversation(ctx context.Context, ownerUserID, conversationID string) (*relationTb.ConversationModel, error)
|
||||||
DelConversations(ownerUserID string, conversationIDs ...string) ConversationCache
|
DelConvsersations(ownerUserID string, conversationIDs ...string) ConversationCache
|
||||||
DelUsersConversation(conversationID string, ownerUserIDs ...string) ConversationCache
|
DelUsersConversation(conversationID string, ownerUserIDs ...string) ConversationCache
|
||||||
// get one conversation from msgCache
|
// get one conversation from msgCache
|
||||||
GetConversations(
|
GetConversations(
|
||||||
@@ -225,9 +225,9 @@ func (c *ConversationRedisCache) GetConversation(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ConversationRedisCache) DelConversations(ownerUserID string, conversationIDs ...string) ConversationCache {
|
func (c *ConversationRedisCache) DelConvsersations(ownerUserID string, convsersationIDs ...string) ConversationCache {
|
||||||
var keys []string
|
var keys []string
|
||||||
for _, conversationID := range conversationIDs {
|
for _, conversationID := range convsersationIDs {
|
||||||
keys = append(keys, c.getConversationKey(ownerUserID, conversationID))
|
keys = append(keys, c.getConversationKey(ownerUserID, conversationID))
|
||||||
}
|
}
|
||||||
cache := c.NewCache()
|
cache := c.NewCache()
|
||||||
|
|||||||
Vendored
+2
-2
@@ -32,7 +32,7 @@ const (
|
|||||||
friendKey = "FRIEND_INFO:"
|
friendKey = "FRIEND_INFO:"
|
||||||
)
|
)
|
||||||
|
|
||||||
// args fn will exec when no data in msgCache.
|
// args fn will exec when no data in msgCache
|
||||||
type FriendCache interface {
|
type FriendCache interface {
|
||||||
metaCache
|
metaCache
|
||||||
NewCache() FriendCache
|
NewCache() FriendCache
|
||||||
@@ -109,7 +109,7 @@ func (f *FriendCacheRedis) DelFriendIDs(ownerUserID ...string) FriendCache {
|
|||||||
return new
|
return new
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo.
|
// todo
|
||||||
func (f *FriendCacheRedis) GetTwoWayFriendIDs(
|
func (f *FriendCacheRedis) GetTwoWayFriendIDs(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
ownerUserID string,
|
ownerUserID string,
|
||||||
|
|||||||
Vendored
+5
-6
@@ -106,8 +106,7 @@ func NewGroupCacheRedis(
|
|||||||
opts rockscache.Options,
|
opts rockscache.Options,
|
||||||
) GroupCache {
|
) GroupCache {
|
||||||
rcClient := rockscache.NewClient(rdb, opts)
|
rcClient := rockscache.NewClient(rdb, opts)
|
||||||
return &GroupCacheRedis{
|
return &GroupCacheRedis{rcClient: rcClient, expireTime: groupExpireTime,
|
||||||
rcClient: rcClient, expireTime: groupExpireTime,
|
|
||||||
groupDB: groupDB, groupMemberDB: groupMemberDB, groupRequestDB: groupRequestDB,
|
groupDB: groupDB, groupMemberDB: groupMemberDB, groupRequestDB: groupRequestDB,
|
||||||
mongoDB: mongoClient, metaCache: NewMetaCacheRedis(rcClient),
|
mongoDB: mongoClient, metaCache: NewMetaCacheRedis(rcClient),
|
||||||
}
|
}
|
||||||
@@ -177,7 +176,7 @@ func (g *GroupCacheRedis) GetGroupMemberIndex(groupMember *relationTb.GroupMembe
|
|||||||
return 0, errIndex
|
return 0, errIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
// / groupInfo.
|
// / groupInfo
|
||||||
func (g *GroupCacheRedis) GetGroupsInfo(
|
func (g *GroupCacheRedis) GetGroupsInfo(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
groupIDs []string,
|
groupIDs []string,
|
||||||
@@ -266,7 +265,7 @@ func (g *GroupCacheRedis) GetSuperGroupMemberIDs(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// userJoinSuperGroup.
|
// userJoinSuperGroup
|
||||||
func (g *GroupCacheRedis) DelJoinedSuperGroupIDs(userIDs ...string) GroupCache {
|
func (g *GroupCacheRedis) DelJoinedSuperGroupIDs(userIDs ...string) GroupCache {
|
||||||
new := g.NewCache()
|
new := g.NewCache()
|
||||||
var keys []string
|
var keys []string
|
||||||
@@ -287,7 +286,7 @@ func (g *GroupCacheRedis) DelSuperGroupMemberIDs(groupIDs ...string) GroupCache
|
|||||||
return new
|
return new
|
||||||
}
|
}
|
||||||
|
|
||||||
// groupMembersHash.
|
// groupMembersHash
|
||||||
func (g *GroupCacheRedis) GetGroupMembersHash(ctx context.Context, groupID string) (hashCode uint64, err error) {
|
func (g *GroupCacheRedis) GetGroupMembersHash(ctx context.Context, groupID string) (hashCode uint64, err error) {
|
||||||
return getCache(
|
return getCache(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -332,7 +331,7 @@ func (g *GroupCacheRedis) DelGroupMembersHash(groupID string) GroupCache {
|
|||||||
return cache
|
return cache
|
||||||
}
|
}
|
||||||
|
|
||||||
// groupMemberIDs.
|
// groupMemberIDs
|
||||||
func (g *GroupCacheRedis) GetGroupMemberIDs(ctx context.Context, groupID string) (groupMemberIDs []string, err error) {
|
func (g *GroupCacheRedis) GetGroupMemberIDs(ctx context.Context, groupID string) (groupMemberIDs []string, err error) {
|
||||||
return getCache(
|
return getCache(
|
||||||
ctx,
|
ctx,
|
||||||
|
|||||||
Vendored
+2
-2
@@ -28,10 +28,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
maxRetry = 10 // number of retries
|
maxRetry = 10 //number of retries
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewRedis Initialize redis connection.
|
// NewRedis Initialize redis connection
|
||||||
func NewRedis() (redis.UniversalClient, error) {
|
func NewRedis() (redis.UniversalClient, error) {
|
||||||
if len(config.Config.Redis.Address) == 0 {
|
if len(config.Config.Redis.Address) == 0 {
|
||||||
return nil, errors.New("redis address is empty")
|
return nil, errors.New("redis address is empty")
|
||||||
|
|||||||
+2
-3
@@ -16,12 +16,11 @@ package cache
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||||
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TestNewRedis Test redis connection
|
//TestNewRedis Test redis connection
|
||||||
func TestNewRedis(t *testing.T) {
|
func TestNewRedis(t *testing.T) {
|
||||||
err := config.InitConfig("config_folder_path")
|
err := config.InitConfig("config_folder_path")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Vendored
+1
-3
@@ -212,7 +212,6 @@ func (c *msgCache) GetMaxSeqs(ctx context.Context, conversationIDs []string) (m
|
|||||||
func (c *msgCache) GetMaxSeq(ctx context.Context, conversationID string) (int64, error) {
|
func (c *msgCache) GetMaxSeq(ctx context.Context, conversationID string) (int64, error) {
|
||||||
return c.getSeq(ctx, conversationID, c.getMaxSeqKey)
|
return c.getSeq(ctx, conversationID, c.getMaxSeqKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *msgCache) SetMinSeq(ctx context.Context, conversationID string, minSeq int64) error {
|
func (c *msgCache) SetMinSeq(ctx context.Context, conversationID string, minSeq int64) error {
|
||||||
return c.setSeq(ctx, conversationID, minSeq, c.getMinSeqKey)
|
return c.setSeq(ctx, conversationID, minSeq, c.getMinSeqKey)
|
||||||
}
|
}
|
||||||
@@ -236,7 +235,6 @@ func (c *msgCache) SetMinSeqs(ctx context.Context, seqs map[string]int64) error
|
|||||||
func (c *msgCache) GetMinSeqs(ctx context.Context, conversationIDs []string) (map[string]int64, error) {
|
func (c *msgCache) GetMinSeqs(ctx context.Context, conversationIDs []string) (map[string]int64, error) {
|
||||||
return c.getSeqs(ctx, conversationIDs, c.getMinSeqKey)
|
return c.getSeqs(ctx, conversationIDs, c.getMinSeqKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *msgCache) GetMinSeq(ctx context.Context, conversationID string) (int64, error) {
|
func (c *msgCache) GetMinSeq(ctx context.Context, conversationID string) (int64, error) {
|
||||||
return c.getSeq(ctx, conversationID, c.getMinSeqKey)
|
return c.getSeq(ctx, conversationID, c.getMinSeqKey)
|
||||||
}
|
}
|
||||||
@@ -361,7 +359,7 @@ func (c *msgCache) GetMessagesBySeq(
|
|||||||
) (seqMsgs []*sdkws.MsgData, failedSeqs []int64, err error) {
|
) (seqMsgs []*sdkws.MsgData, failedSeqs []int64, err error) {
|
||||||
pipe := c.rdb.Pipeline()
|
pipe := c.rdb.Pipeline()
|
||||||
for _, v := range seqs {
|
for _, v := range seqs {
|
||||||
// MESSAGE_CACHE:169.254.225.224_reliability1653387820_0_1
|
//MESSAGE_CACHE:169.254.225.224_reliability1653387820_0_1
|
||||||
key := c.getMessageCacheKey(conversationID, v)
|
key := c.getMessageCacheKey(conversationID, v)
|
||||||
if err := pipe.Get(ctx, key).Err(); err != nil && err != redis.Nil {
|
if err := pipe.Get(ctx, key).Err(); err != nil && err != redis.Nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type AuthDatabase interface {
|
type AuthDatabase interface {
|
||||||
// 结果为空 不返回错误
|
//结果为空 不返回错误
|
||||||
GetTokensWithoutError(ctx context.Context, userID string, platformID int) (map[string]int, error)
|
GetTokensWithoutError(ctx context.Context, userID string, platformID int) (map[string]int, error)
|
||||||
// 创建token
|
//创建token
|
||||||
CreateToken(ctx context.Context, userID string, platformID int) (string, error)
|
CreateToken(ctx context.Context, userID string, platformID int) (string, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ func NewAuthDatabase(cache cache.MsgModel, accessSecret string, accessExpire int
|
|||||||
return &authDatabase{cache: cache, accessSecret: accessSecret, accessExpire: accessExpire}
|
return &authDatabase{cache: cache, accessSecret: accessSecret, accessExpire: accessExpire}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 结果为空 不返回错误.
|
// 结果为空 不返回错误
|
||||||
func (a *authDatabase) GetTokensWithoutError(
|
func (a *authDatabase) GetTokensWithoutError(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
userID string,
|
userID string,
|
||||||
@@ -52,7 +52,7 @@ func (a *authDatabase) GetTokensWithoutError(
|
|||||||
return a.cache.GetTokensWithoutError(ctx, userID, platformID)
|
return a.cache.GetTokensWithoutError(ctx, userID, platformID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建token.
|
// 创建token
|
||||||
func (a *authDatabase) CreateToken(ctx context.Context, userID string, platformID int) (string, error) {
|
func (a *authDatabase) CreateToken(ctx context.Context, userID string, platformID int) (string, error) {
|
||||||
tokens, err := a.cache.GetTokensWithoutError(ctx, userID, platformID)
|
tokens, err := a.cache.GetTokensWithoutError(ctx, userID, platformID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ func NewBlackDatabase(black relation.BlackModelInterface, cache cache.BlackCache
|
|||||||
return &blackDatabase{black, cache}
|
return &blackDatabase{black, cache}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create 增加黑名单.
|
// Create 增加黑名单
|
||||||
func (b *blackDatabase) Create(ctx context.Context, blacks []*relation.BlackModel) (err error) {
|
func (b *blackDatabase) Create(ctx context.Context, blacks []*relation.BlackModel) (err error) {
|
||||||
if err := b.black.Create(ctx, blacks); err != nil {
|
if err := b.black.Create(ctx, blacks); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -56,7 +56,7 @@ func (b *blackDatabase) Create(ctx context.Context, blacks []*relation.BlackMode
|
|||||||
return b.deleteBlackIDsCache(ctx, blacks)
|
return b.deleteBlackIDsCache(ctx, blacks)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete 删除黑名单.
|
// Delete 删除黑名单
|
||||||
func (b *blackDatabase) Delete(ctx context.Context, blacks []*relation.BlackModel) (err error) {
|
func (b *blackDatabase) Delete(ctx context.Context, blacks []*relation.BlackModel) (err error) {
|
||||||
if err := b.black.Delete(ctx, blacks); err != nil {
|
if err := b.black.Delete(ctx, blacks); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -72,7 +72,7 @@ func (b *blackDatabase) deleteBlackIDsCache(ctx context.Context, blacks []*relat
|
|||||||
return cache.ExecDel(ctx)
|
return cache.ExecDel(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FindOwnerBlacks 获取黑名单列表.
|
// FindOwnerBlacks 获取黑名单列表
|
||||||
func (b *blackDatabase) FindOwnerBlacks(
|
func (b *blackDatabase) FindOwnerBlacks(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
ownerUserID string,
|
ownerUserID string,
|
||||||
@@ -81,7 +81,7 @@ func (b *blackDatabase) FindOwnerBlacks(
|
|||||||
return b.black.FindOwnerBlacks(ctx, ownerUserID, pageNumber, showNumber)
|
return b.black.FindOwnerBlacks(ctx, ownerUserID, pageNumber, showNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckIn 检查user2是否在user1的黑名单列表中(inUser1Blacks==true) 检查user1是否在user2的黑名单列表中(inUser2Blacks==true).
|
// CheckIn 检查user2是否在user1的黑名单列表中(inUser1Blacks==true) 检查user1是否在user2的黑名单列表中(inUser2Blacks==true)
|
||||||
func (b *blackDatabase) CheckIn(
|
func (b *blackDatabase) CheckIn(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
userID1, userID2 string,
|
userID1, userID2 string,
|
||||||
|
|||||||
@@ -21,6 +21,11 @@ import (
|
|||||||
|
|
||||||
type ChatLogDatabase interface {
|
type ChatLogDatabase interface {
|
||||||
CreateChatLog(msg *pbMsg.MsgDataToMQ) error
|
CreateChatLog(msg *pbMsg.MsgDataToMQ) error
|
||||||
|
GetChatLog(
|
||||||
|
chatLog *relationTb.ChatLogModel,
|
||||||
|
pageNumber, showNumber int32,
|
||||||
|
contentTypes []int32,
|
||||||
|
) (int64, []relationTb.ChatLogModel, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewChatLogDatabase(chatLogModelInterface relationTb.ChatLogModelInterface) ChatLogDatabase {
|
func NewChatLogDatabase(chatLogModelInterface relationTb.ChatLogModelInterface) ChatLogDatabase {
|
||||||
@@ -34,3 +39,11 @@ type chatLogDatabase struct {
|
|||||||
func (c *chatLogDatabase) CreateChatLog(msg *pbMsg.MsgDataToMQ) error {
|
func (c *chatLogDatabase) CreateChatLog(msg *pbMsg.MsgDataToMQ) error {
|
||||||
return c.chatLogModel.Create(msg)
|
return c.chatLogModel.Create(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *chatLogDatabase) GetChatLog(
|
||||||
|
chatLog *relationTb.ChatLogModel,
|
||||||
|
pageNumber, showNumber int32,
|
||||||
|
contentTypes []int32,
|
||||||
|
) (int64, []relationTb.ChatLogModel, error) {
|
||||||
|
return c.chatLogModel.GetChatLog(chatLog, pageNumber, showNumber, contentTypes)
|
||||||
|
}
|
||||||
|
|||||||
@@ -27,21 +27,21 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type ConversationDatabase interface {
|
type ConversationDatabase interface {
|
||||||
// UpdateUserConversationFiled 更新用户该会话的属性信息
|
//UpdateUserConversationFiled 更新用户该会话的属性信息
|
||||||
UpdateUsersConversationFiled(ctx context.Context, userIDs []string, conversationID string, args map[string]interface{}) error
|
UpdateUsersConversationFiled(ctx context.Context, userIDs []string, conversationID string, args map[string]interface{}) error
|
||||||
// CreateConversation 创建一批新的会话
|
//CreateConversation 创建一批新的会话
|
||||||
CreateConversation(ctx context.Context, conversations []*relationTb.ConversationModel) error
|
CreateConversation(ctx context.Context, conversations []*relationTb.ConversationModel) error
|
||||||
// SyncPeerUserPrivateConversation 同步对端私聊会话内部保证事务操作
|
//SyncPeerUserPrivateConversation 同步对端私聊会话内部保证事务操作
|
||||||
SyncPeerUserPrivateConversationTx(ctx context.Context, conversation []*relationTb.ConversationModel) error
|
SyncPeerUserPrivateConversationTx(ctx context.Context, conversation []*relationTb.ConversationModel) error
|
||||||
// FindConversations 根据会话ID获取某个用户的多个会话
|
//FindConversations 根据会话ID获取某个用户的多个会话
|
||||||
FindConversations(ctx context.Context, ownerUserID string, conversationIDs []string) ([]*relationTb.ConversationModel, error)
|
FindConversations(ctx context.Context, ownerUserID string, conversationIDs []string) ([]*relationTb.ConversationModel, error)
|
||||||
// FindRecvMsgNotNotifyUserIDs 获取超级大群开启免打扰的用户ID
|
//FindRecvMsgNotNotifyUserIDs 获取超级大群开启免打扰的用户ID
|
||||||
FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error)
|
FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error)
|
||||||
// GetUserAllConversation 获取一个用户在服务器上所有的会话
|
//GetUserAllConversation 获取一个用户在服务器上所有的会话
|
||||||
GetUserAllConversation(ctx context.Context, ownerUserID string) ([]*relationTb.ConversationModel, error)
|
GetUserAllConversation(ctx context.Context, ownerUserID string) ([]*relationTb.ConversationModel, error)
|
||||||
// SetUserConversations 设置用户多个会话属性,如果会话不存在则创建,否则更新,内部保证原子性
|
//SetUserConversations 设置用户多个会话属性,如果会话不存在则创建,否则更新,内部保证原子性
|
||||||
SetUserConversations(ctx context.Context, ownerUserID string, conversations []*relationTb.ConversationModel) error
|
SetUserConversations(ctx context.Context, ownerUserID string, conversations []*relationTb.ConversationModel) error
|
||||||
// SetUsersConversationFiledTx 设置多个用户会话关于某个字段的更新操作,如果会话不存在则创建,否则更新,内部保证事务操作
|
//SetUsersConversationFiledTx 设置多个用户会话关于某个字段的更新操作,如果会话不存在则创建,否则更新,内部保证事务操作
|
||||||
SetUsersConversationFiledTx(ctx context.Context, userIDs []string, conversation *relationTb.ConversationModel, filedMap map[string]interface{}) error
|
SetUsersConversationFiledTx(ctx context.Context, userIDs []string, conversation *relationTb.ConversationModel, filedMap map[string]interface{}) error
|
||||||
CreateGroupChatConversation(ctx context.Context, groupID string, userIDs []string) error
|
CreateGroupChatConversation(ctx context.Context, groupID string, userIDs []string) error
|
||||||
GetConversationIDs(ctx context.Context, userID string) ([]string, error)
|
GetConversationIDs(ctx context.Context, userID string) ([]string, error)
|
||||||
@@ -98,13 +98,14 @@ func (c *conversationDatabase) SetUsersConversationFiledTx(ctx context.Context,
|
|||||||
temp.OwnerUserID = v
|
temp.OwnerUserID = v
|
||||||
temp.CreateTime = now
|
temp.CreateTime = now
|
||||||
conversations = append(conversations, temp)
|
conversations = append(conversations, temp)
|
||||||
|
|
||||||
}
|
}
|
||||||
if len(conversations) > 0 {
|
if len(conversations) > 0 {
|
||||||
err = conversationTx.Create(ctx, conversations)
|
err = conversationTx.Create(ctx, conversations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
cache = cache.DelConversationIDs(NotUserIDs...).DelUserConversationIDsHash(NotUserIDs...).DelConversations(conversation.ConversationID, NotUserIDs...)
|
cache = cache.DelConversationIDs(NotUserIDs...).DelUserConversationIDsHash(NotUserIDs...).DelConvsersations(conversation.ConversationID, NotUserIDs...)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
@@ -128,7 +129,7 @@ func (c *conversationDatabase) CreateConversation(ctx context.Context, conversat
|
|||||||
var userIDs []string
|
var userIDs []string
|
||||||
cache := c.cache.NewCache()
|
cache := c.cache.NewCache()
|
||||||
for _, conversation := range conversations {
|
for _, conversation := range conversations {
|
||||||
cache = cache.DelConversations(conversation.OwnerUserID, conversation.ConversationID)
|
cache = cache.DelConvsersations(conversation.OwnerUserID, conversation.ConversationID)
|
||||||
userIDs = append(userIDs, conversation.OwnerUserID)
|
userIDs = append(userIDs, conversation.OwnerUserID)
|
||||||
}
|
}
|
||||||
return cache.DelConversationIDs(userIDs...).DelUserConversationIDsHash(userIDs...).ExecDel(ctx)
|
return cache.DelConversationIDs(userIDs...).DelUserConversationIDsHash(userIDs...).ExecDel(ctx)
|
||||||
@@ -190,7 +191,7 @@ func (c *conversationDatabase) SetUserConversations(ctx context.Context, ownerUs
|
|||||||
var conversationIDs []string
|
var conversationIDs []string
|
||||||
for _, conversation := range conversations {
|
for _, conversation := range conversations {
|
||||||
conversationIDs = append(conversationIDs, conversation.ConversationID)
|
conversationIDs = append(conversationIDs, conversation.ConversationID)
|
||||||
cache = cache.DelConversations(conversation.OwnerUserID, conversation.ConversationID)
|
cache = cache.DelConvsersations(conversation.OwnerUserID, conversation.ConversationID)
|
||||||
}
|
}
|
||||||
conversationTx := c.conversationDB.NewTx(tx)
|
conversationTx := c.conversationDB.NewTx(tx)
|
||||||
existConversations, err := conversationTx.Find(ctx, ownerUserID, conversationIDs)
|
existConversations, err := conversationTx.Find(ctx, ownerUserID, conversationIDs)
|
||||||
@@ -247,7 +248,7 @@ func (c *conversationDatabase) CreateGroupChatConversation(ctx context.Context,
|
|||||||
for _, v := range notExistUserIDs {
|
for _, v := range notExistUserIDs {
|
||||||
conversation := relationTb.ConversationModel{ConversationType: constant.SuperGroupChatType, GroupID: groupID, OwnerUserID: v, ConversationID: conversationID}
|
conversation := relationTb.ConversationModel{ConversationType: constant.SuperGroupChatType, GroupID: groupID, OwnerUserID: v, ConversationID: conversationID}
|
||||||
conversations = append(conversations, &conversation)
|
conversations = append(conversations, &conversation)
|
||||||
cache = cache.DelConversations(v, conversationID)
|
cache = cache.DelConvsersations(v, conversationID)
|
||||||
}
|
}
|
||||||
cache = cache.DelConversationIDs(notExistUserIDs...).DelUserConversationIDsHash(notExistUserIDs...)
|
cache = cache.DelConversationIDs(notExistUserIDs...).DelUserConversationIDsHash(notExistUserIDs...)
|
||||||
if len(conversations) > 0 {
|
if len(conversations) > 0 {
|
||||||
@@ -261,7 +262,7 @@ func (c *conversationDatabase) CreateGroupChatConversation(ctx context.Context,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, v := range existConversationUserIDs {
|
for _, v := range existConversationUserIDs {
|
||||||
cache = cache.DelConversations(v, conversationID)
|
cache = cache.DelConvsersations(v, conversationID)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ func NewFriendDatabase(
|
|||||||
return &friendDatabase{friend: friend, friendRequest: friendRequest, cache: cache, tx: tx}
|
return &friendDatabase{friend: friend, friendRequest: friendRequest, cache: cache, tx: tx}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok 检查user2是否在user1的好友列表中(inUser1Friends==true) 检查user1是否在user2的好友列表中(inUser2Friends==true).
|
// ok 检查user2是否在user1的好友列表中(inUser1Friends==true) 检查user1是否在user2的好友列表中(inUser2Friends==true)
|
||||||
func (f *friendDatabase) CheckIn(
|
func (f *friendDatabase) CheckIn(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
userID1, userID2 string,
|
userID1, userID2 string,
|
||||||
@@ -109,7 +109,7 @@ func (f *friendDatabase) CheckIn(
|
|||||||
return utils.IsContain(userID2, userID1FriendIDs), utils.IsContain(userID1, userID2FriendIDs), nil
|
return utils.IsContain(userID2, userID1FriendIDs), utils.IsContain(userID1, userID2FriendIDs), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 增加或者更新好友申请 如果之前有记录则更新,没有记录则新增.
|
// 增加或者更新好友申请 如果之前有记录则更新,没有记录则新增
|
||||||
func (f *friendDatabase) AddFriendRequest(
|
func (f *friendDatabase) AddFriendRequest(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
fromUserID, toUserID string,
|
fromUserID, toUserID string,
|
||||||
@@ -118,11 +118,11 @@ func (f *friendDatabase) AddFriendRequest(
|
|||||||
) (err error) {
|
) (err error) {
|
||||||
return f.tx.Transaction(func(tx any) error {
|
return f.tx.Transaction(func(tx any) error {
|
||||||
_, err := f.friendRequest.NewTx(tx).Take(ctx, fromUserID, toUserID)
|
_, err := f.friendRequest.NewTx(tx).Take(ctx, fromUserID, toUserID)
|
||||||
// 有db错误
|
//有db错误
|
||||||
if err != nil && errs.Unwrap(err) != gorm.ErrRecordNotFound {
|
if err != nil && errs.Unwrap(err) != gorm.ErrRecordNotFound {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// 无错误 则更新
|
//无错误 则更新
|
||||||
if err == nil {
|
if err == nil {
|
||||||
m := make(map[string]interface{}, 1)
|
m := make(map[string]interface{}, 1)
|
||||||
m["handle_result"] = 0
|
m["handle_result"] = 0
|
||||||
@@ -135,7 +135,7 @@ func (f *friendDatabase) AddFriendRequest(
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// gorm.ErrRecordNotFound 错误,则新增
|
//gorm.ErrRecordNotFound 错误,则新增
|
||||||
if err := f.friendRequest.NewTx(tx).Create(ctx, []*relation.FriendRequestModel{{FromUserID: fromUserID, ToUserID: toUserID, ReqMsg: reqMsg, Ex: ex, CreateTime: time.Now(), HandleTime: time.Unix(0, 0)}}); err != nil {
|
if err := f.friendRequest.NewTx(tx).Create(ctx, []*relation.FriendRequestModel{{FromUserID: fromUserID, ToUserID: toUserID, ReqMsg: reqMsg, Ex: ex, CreateTime: time.Now(), HandleTime: time.Unix(0, 0)}}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -143,7 +143,7 @@ func (f *friendDatabase) AddFriendRequest(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// (1)先判断是否在好友表 (在不在都不返回错误) (2)对于不在好友列表的 插入即可.
|
// (1)先判断是否在好友表 (在不在都不返回错误) (2)对于不在好友列表的 插入即可
|
||||||
func (f *friendDatabase) BecomeFriends(
|
func (f *friendDatabase) BecomeFriends(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
ownerUserID string,
|
ownerUserID string,
|
||||||
@@ -152,7 +152,7 @@ func (f *friendDatabase) BecomeFriends(
|
|||||||
) (err error) {
|
) (err error) {
|
||||||
cache := f.cache.NewCache()
|
cache := f.cache.NewCache()
|
||||||
if err := f.tx.Transaction(func(tx any) error {
|
if err := f.tx.Transaction(func(tx any) error {
|
||||||
// 先find 找出重复的 去掉重复的
|
//先find 找出重复的 去掉重复的
|
||||||
fs1, err := f.friend.NewTx(tx).FindFriends(ctx, ownerUserID, friendUserIDs)
|
fs1, err := f.friend.NewTx(tx).FindFriends(ctx, ownerUserID, friendUserIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -194,7 +194,7 @@ func (f *friendDatabase) BecomeFriends(
|
|||||||
return cache.ExecDel(ctx)
|
return cache.ExecDel(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 拒绝好友申请 (1)检查是否有申请记录且为未处理状态 (没有记录返回错误) (2)修改申请记录 已拒绝.
|
// 拒绝好友申请 (1)检查是否有申请记录且为未处理状态 (没有记录返回错误) (2)修改申请记录 已拒绝
|
||||||
func (f *friendDatabase) RefuseFriendRequest(
|
func (f *friendDatabase) RefuseFriendRequest(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
friendRequest *relation.FriendRequestModel,
|
friendRequest *relation.FriendRequestModel,
|
||||||
@@ -215,7 +215,7 @@ func (f *friendDatabase) RefuseFriendRequest(
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// AgreeFriendRequest 同意好友申请 (1)检查是否有申请记录且为未处理状态 (没有记录返回错误) (2)检查是否好友(不返回错误) (3) 建立双向好友关系(存在的忽略).
|
// AgreeFriendRequest 同意好友申请 (1)检查是否有申请记录且为未处理状态 (没有记录返回错误) (2)检查是否好友(不返回错误) (3) 建立双向好友关系(存在的忽略)
|
||||||
func (f *friendDatabase) AgreeFriendRequest(
|
func (f *friendDatabase) AgreeFriendRequest(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
friendRequest *relation.FriendRequestModel,
|
friendRequest *relation.FriendRequestModel,
|
||||||
@@ -289,7 +289,7 @@ func (f *friendDatabase) AgreeFriendRequest(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除好友 外部判断是否好友关系.
|
// 删除好友 外部判断是否好友关系
|
||||||
func (f *friendDatabase) Delete(ctx context.Context, ownerUserID string, friendUserIDs []string) (err error) {
|
func (f *friendDatabase) Delete(ctx context.Context, ownerUserID string, friendUserIDs []string) (err error) {
|
||||||
if err := f.friend.Delete(ctx, ownerUserID, friendUserIDs); err != nil {
|
if err := f.friend.Delete(ctx, ownerUserID, friendUserIDs); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -297,7 +297,7 @@ func (f *friendDatabase) Delete(ctx context.Context, ownerUserID string, friendU
|
|||||||
return f.cache.DelFriendIDs(append(friendUserIDs, ownerUserID)...).ExecDel(ctx)
|
return f.cache.DelFriendIDs(append(friendUserIDs, ownerUserID)...).ExecDel(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新好友备注 零值也支持.
|
// 更新好友备注 零值也支持
|
||||||
func (f *friendDatabase) UpdateRemark(ctx context.Context, ownerUserID, friendUserID, remark string) (err error) {
|
func (f *friendDatabase) UpdateRemark(ctx context.Context, ownerUserID, friendUserID, remark string) (err error) {
|
||||||
if err := f.friend.UpdateRemark(ctx, ownerUserID, friendUserID, remark); err != nil {
|
if err := f.friend.UpdateRemark(ctx, ownerUserID, friendUserID, remark); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -305,7 +305,7 @@ func (f *friendDatabase) UpdateRemark(ctx context.Context, ownerUserID, friendUs
|
|||||||
return f.cache.DelFriend(ownerUserID, friendUserID).ExecDel(ctx)
|
return f.cache.DelFriend(ownerUserID, friendUserID).ExecDel(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取ownerUserID的好友列表 无结果不返回错误.
|
// 获取ownerUserID的好友列表 无结果不返回错误
|
||||||
func (f *friendDatabase) PageOwnerFriends(
|
func (f *friendDatabase) PageOwnerFriends(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
ownerUserID string,
|
ownerUserID string,
|
||||||
@@ -314,7 +314,7 @@ func (f *friendDatabase) PageOwnerFriends(
|
|||||||
return f.friend.FindOwnerFriends(ctx, ownerUserID, pageNumber, showNumber)
|
return f.friend.FindOwnerFriends(ctx, ownerUserID, pageNumber, showNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
// friendUserID在哪些人的好友列表中.
|
// friendUserID在哪些人的好友列表中
|
||||||
func (f *friendDatabase) PageInWhoseFriends(
|
func (f *friendDatabase) PageInWhoseFriends(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
friendUserID string,
|
friendUserID string,
|
||||||
@@ -323,7 +323,7 @@ func (f *friendDatabase) PageInWhoseFriends(
|
|||||||
return f.friend.FindInWhoseFriends(ctx, friendUserID, pageNumber, showNumber)
|
return f.friend.FindInWhoseFriends(ctx, friendUserID, pageNumber, showNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取我发出去的好友申请 无结果不返回错误.
|
// 获取我发出去的好友申请 无结果不返回错误
|
||||||
func (f *friendDatabase) PageFriendRequestFromMe(
|
func (f *friendDatabase) PageFriendRequestFromMe(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
userID string,
|
userID string,
|
||||||
@@ -332,7 +332,7 @@ func (f *friendDatabase) PageFriendRequestFromMe(
|
|||||||
return f.friendRequest.FindFromUserID(ctx, userID, pageNumber, showNumber)
|
return f.friendRequest.FindFromUserID(ctx, userID, pageNumber, showNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取我收到的的好友申请 无结果不返回错误.
|
// 获取我收到的的好友申请 无结果不返回错误
|
||||||
func (f *friendDatabase) PageFriendRequestToMe(
|
func (f *friendDatabase) PageFriendRequestToMe(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
userID string,
|
userID string,
|
||||||
@@ -341,7 +341,7 @@ func (f *friendDatabase) PageFriendRequestToMe(
|
|||||||
return f.friendRequest.FindToUserID(ctx, userID, pageNumber, showNumber)
|
return f.friendRequest.FindToUserID(ctx, userID, pageNumber, showNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取某人指定好友的信息 如果有好友不存在,也返回错误.
|
// 获取某人指定好友的信息 如果有好友不存在,也返回错误
|
||||||
func (f *friendDatabase) FindFriendsWithError(
|
func (f *friendDatabase) FindFriendsWithError(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
ownerUserID string,
|
ownerUserID string,
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ func (g *groupDatabase) CreateGroup(
|
|||||||
groups []*relationTb.GroupModel,
|
groups []*relationTb.GroupModel,
|
||||||
groupMembers []*relationTb.GroupMemberModel,
|
groupMembers []*relationTb.GroupMemberModel,
|
||||||
) error {
|
) error {
|
||||||
cache := g.cache.NewCache()
|
var cache = g.cache.NewCache()
|
||||||
if err := g.tx.Transaction(func(tx any) error {
|
if err := g.tx.Transaction(func(tx any) error {
|
||||||
if len(groups) > 0 {
|
if len(groups) > 0 {
|
||||||
if err := g.groupDB.NewTx(tx).Create(ctx, groups); err != nil {
|
if err := g.groupDB.NewTx(tx).Create(ctx, groups); err != nil {
|
||||||
@@ -473,7 +473,7 @@ func (g *groupDatabase) UpdateGroupMember(
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *groupDatabase) UpdateGroupMembers(ctx context.Context, data []*relationTb.BatchUpdateGroupMember) error {
|
func (g *groupDatabase) UpdateGroupMembers(ctx context.Context, data []*relationTb.BatchUpdateGroupMember) error {
|
||||||
cache := g.cache.NewCache()
|
var cache = g.cache.NewCache()
|
||||||
if err := g.tx.Transaction(func(tx any) error {
|
if err := g.tx.Transaction(func(tx any) error {
|
||||||
for _, item := range data {
|
for _, item := range data {
|
||||||
if err := g.groupMemberDB.NewTx(tx).Update(ctx, item.GroupID, item.UserID, item.Map); err != nil {
|
if err := g.groupMemberDB.NewTx(tx).Update(ctx, item.GroupID, item.UserID, item.Map); err != nil {
|
||||||
|
|||||||
@@ -15,8 +15,9 @@
|
|||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
relation2 "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation"
|
||||||
"errors"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
|
||||||
|
"gorm.io/gorm"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/redis/go-redis/v9"
|
"github.com/redis/go-redis/v9"
|
||||||
@@ -31,11 +32,13 @@ import (
|
|||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||||
|
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
"context"
|
||||||
|
"errors"
|
||||||
|
|
||||||
pbMsg "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
pbMsg "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||||
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -92,7 +95,7 @@ type CommonMsgDatabase interface {
|
|||||||
GetConversationMinMaxSeqInMongoAndCache(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error)
|
GetConversationMinMaxSeqInMongoAndCache(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error)
|
||||||
SetSendMsgStatus(ctx context.Context, id string, status int32) error
|
SetSendMsgStatus(ctx context.Context, id string, status int32) error
|
||||||
GetSendMsgStatus(ctx context.Context, id string) (int32, error)
|
GetSendMsgStatus(ctx context.Context, id string) (int32, error)
|
||||||
SearchMessage(ctx context.Context, req *pbMsg.SearchMessageReq) (total int32, msgData []*sdkws.MsgData, err error)
|
SearchMessage(ctx context.Context, req *pbMsg.SearchMessageReq) (msgData []*sdkws.MsgData, err error)
|
||||||
|
|
||||||
// to mq
|
// to mq
|
||||||
MsgToMQ(ctx context.Context, key string, msg2mq *sdkws.MsgData) error
|
MsgToMQ(ctx context.Context, key string, msg2mq *sdkws.MsgData) error
|
||||||
@@ -100,27 +103,13 @@ type CommonMsgDatabase interface {
|
|||||||
MsgToPushMQ(ctx context.Context, key, conversarionID string, msg2mq *sdkws.MsgData) (int32, int64, error)
|
MsgToPushMQ(ctx context.Context, key, conversarionID string, msg2mq *sdkws.MsgData) (int32, int64, error)
|
||||||
MsgToMongoMQ(ctx context.Context, key, conversarionID string, msgs []*sdkws.MsgData, lastSeq int64) error
|
MsgToMongoMQ(ctx context.Context, key, conversarionID string, msgs []*sdkws.MsgData, lastSeq int64) error
|
||||||
|
|
||||||
RangeUserSendCount(
|
RangeUserSendCount(ctx context.Context, start time.Time, end time.Time, group bool, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, users []*unRelationTb.UserCount, dateCount map[string]int64, err error)
|
||||||
ctx context.Context,
|
RangeGroupSendCount(ctx context.Context, start time.Time, end time.Time, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error)
|
||||||
start time.Time,
|
|
||||||
end time.Time,
|
|
||||||
group bool,
|
|
||||||
ase bool,
|
|
||||||
pageNumber int32,
|
|
||||||
showNumber int32,
|
|
||||||
) (msgCount int64, userCount int64, users []*unRelationTb.UserCount, dateCount map[string]int64, err error)
|
|
||||||
RangeGroupSendCount(
|
|
||||||
ctx context.Context,
|
|
||||||
start time.Time,
|
|
||||||
end time.Time,
|
|
||||||
ase bool,
|
|
||||||
pageNumber int32,
|
|
||||||
showNumber int32,
|
|
||||||
) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCommonMsgDatabase(msgDocModel unRelationTb.MsgDocModelInterface, cacheModel cache.MsgModel) CommonMsgDatabase {
|
func NewCommonMsgDatabase(msgDocModel unRelationTb.MsgDocModelInterface, cacheModel cache.MsgModel, msgMyqModel relation.ChatLogModelInterface) CommonMsgDatabase {
|
||||||
return &commonMsgDatabase{
|
return &commonMsgDatabase{
|
||||||
|
msgMyq: msgMyqModel,
|
||||||
msgDocDatabase: msgDocModel,
|
msgDocDatabase: msgDocModel,
|
||||||
cache: cacheModel,
|
cache: cacheModel,
|
||||||
producer: kafka.NewKafkaProducer(config.Config.Kafka.Addr, config.Config.Kafka.LatestMsgToRedis.Topic),
|
producer: kafka.NewKafkaProducer(config.Config.Kafka.Addr, config.Config.Kafka.LatestMsgToRedis.Topic),
|
||||||
@@ -129,16 +118,18 @@ func NewCommonMsgDatabase(msgDocModel unRelationTb.MsgDocModelInterface, cacheMo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitCommonMsgDatabase(rdb redis.UniversalClient, database *mongo.Database) CommonMsgDatabase {
|
func InitCommonMsgDatabase(rdb redis.UniversalClient, database *mongo.Database, dbGrom *gorm.DB) CommonMsgDatabase {
|
||||||
cacheModel := cache.NewMsgCacheModel(rdb)
|
cacheModel := cache.NewMsgCacheModel(rdb)
|
||||||
msgDocModel := unrelation.NewMsgMongoDriver(database)
|
msgDocModel := unrelation.NewMsgMongoDriver(database)
|
||||||
CommonMsgDatabase := NewCommonMsgDatabase(msgDocModel, cacheModel)
|
msgMyqModel := relation2.NewChatLogGorm(dbGrom)
|
||||||
|
CommonMsgDatabase := NewCommonMsgDatabase(msgDocModel, cacheModel, msgMyqModel)
|
||||||
return CommonMsgDatabase
|
return CommonMsgDatabase
|
||||||
}
|
}
|
||||||
|
|
||||||
type commonMsgDatabase struct {
|
type commonMsgDatabase struct {
|
||||||
msgDocDatabase unRelationTb.MsgDocModelInterface
|
msgDocDatabase unRelationTb.MsgDocModelInterface
|
||||||
msg unRelationTb.MsgDocModel
|
msg unRelationTb.MsgDocModel
|
||||||
|
msgMyq relation.ChatLogModelInterface
|
||||||
cache cache.MsgModel
|
cache cache.MsgModel
|
||||||
producer *kafka.Producer
|
producer *kafka.Producer
|
||||||
producerToMongo *kafka.Producer
|
producerToMongo *kafka.Producer
|
||||||
@@ -181,7 +172,7 @@ func (db *commonMsgDatabase) BatchInsertBlock(ctx context.Context, conversationI
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
num := db.msg.GetSingleGocMsgNum()
|
num := db.msg.GetSingleGocMsgNum()
|
||||||
// num = 100
|
//num = 100
|
||||||
for i, field := range fields { // 检查类型
|
for i, field := range fields { // 检查类型
|
||||||
var ok bool
|
var ok bool
|
||||||
switch key {
|
switch key {
|
||||||
@@ -399,7 +390,7 @@ func (db *commonMsgDatabase) BatchInsertChat2Cache(ctx context.Context, conversa
|
|||||||
|
|
||||||
func (db *commonMsgDatabase) getMsgBySeqs(ctx context.Context, userID, conversationID string, seqs []int64) (totalMsgs []*sdkws.MsgData, err error) {
|
func (db *commonMsgDatabase) getMsgBySeqs(ctx context.Context, userID, conversationID string, seqs []int64) (totalMsgs []*sdkws.MsgData, err error) {
|
||||||
for docID, seqs := range db.msg.GetDocIDSeqsMap(conversationID, seqs) {
|
for docID, seqs := range db.msg.GetDocIDSeqsMap(conversationID, seqs) {
|
||||||
// log.ZDebug(ctx, "getMsgBySeqs", "docID", docID, "seqs", seqs)
|
//log.ZDebug(ctx, "getMsgBySeqs", "docID", docID, "seqs", seqs)
|
||||||
msgs, err := db.findMsgInfoBySeq(ctx, userID, docID, seqs)
|
msgs, err := db.findMsgInfoBySeq(ctx, userID, docID, seqs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -584,22 +575,7 @@ func (db *commonMsgDatabase) GetMsgBySeqs(ctx context.Context, userID string, co
|
|||||||
log.ZError(ctx, "get message from redis exception", err, "failedSeqs", failedSeqs, "conversationID", conversationID)
|
log.ZError(ctx, "get message from redis exception", err, "failedSeqs", failedSeqs, "conversationID", conversationID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.ZInfo(
|
log.ZInfo(ctx, "db.cache.GetMessagesBySeq", "userID", userID, "conversationID", conversationID, "seqs", seqs, "successMsgs", len(successMsgs), "failedSeqs", failedSeqs, "conversationID", conversationID)
|
||||||
ctx,
|
|
||||||
"db.cache.GetMessagesBySeq",
|
|
||||||
"userID",
|
|
||||||
userID,
|
|
||||||
"conversationID",
|
|
||||||
conversationID,
|
|
||||||
"seqs",
|
|
||||||
seqs,
|
|
||||||
"successMsgs",
|
|
||||||
len(successMsgs),
|
|
||||||
"failedSeqs",
|
|
||||||
failedSeqs,
|
|
||||||
"conversationID",
|
|
||||||
conversationID,
|
|
||||||
)
|
|
||||||
prome.Add(prome.MsgPullFromRedisSuccessCounter, len(successMsgs))
|
prome.Add(prome.MsgPullFromRedisSuccessCounter, len(successMsgs))
|
||||||
if len(failedSeqs) > 0 {
|
if len(failedSeqs) > 0 {
|
||||||
mongoMsgs, err := db.getMsgBySeqs(ctx, userID, conversationID, failedSeqs)
|
mongoMsgs, err := db.getMsgBySeqs(ctx, userID, conversationID, failedSeqs)
|
||||||
@@ -661,6 +637,7 @@ func (db *commonMsgDatabase) UserMsgsDestruct(ctx context.Context, userID string
|
|||||||
log.ZDebug(ctx, "deleteMsgRecursion finished", "conversationID", conversationID, "userID", userID, "index", index)
|
log.ZDebug(ctx, "deleteMsgRecursion finished", "conversationID", conversationID, "userID", userID, "index", index)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -675,7 +652,7 @@ func (db *commonMsgDatabase) UserMsgsDestruct(ctx context.Context, userID string
|
|||||||
return seqs, nil
|
return seqs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// this is struct for recursion.
|
// this is struct for recursion
|
||||||
type delMsgRecursionStruct struct {
|
type delMsgRecursionStruct struct {
|
||||||
minSeq int64
|
minSeq int64
|
||||||
delDocIDs []string
|
delDocIDs []string
|
||||||
@@ -688,7 +665,7 @@ func (d *delMsgRecursionStruct) getSetMinSeq() int64 {
|
|||||||
// index 0....19(del) 20...69
|
// index 0....19(del) 20...69
|
||||||
// seq 70
|
// seq 70
|
||||||
// set minSeq 21
|
// set minSeq 21
|
||||||
// recursion 删除list并且返回设置的最小seq.
|
// recursion 删除list并且返回设置的最小seq
|
||||||
func (db *commonMsgDatabase) deleteMsgRecursion(ctx context.Context, conversationID string, index int64, delStruct *delMsgRecursionStruct, remainTime int64) (int64, error) {
|
func (db *commonMsgDatabase) deleteMsgRecursion(ctx context.Context, conversationID string, index int64, delStruct *delMsgRecursionStruct, remainTime int64) (int64, error) {
|
||||||
// find from oldest list
|
// find from oldest list
|
||||||
msgDocModel, err := db.msgDocDatabase.GetMsgDocModelByIndex(ctx, conversationID, index, 1)
|
msgDocModel, err := db.msgDocDatabase.GetMsgDocModelByIndex(ctx, conversationID, index, 1)
|
||||||
@@ -814,19 +791,15 @@ func (db *commonMsgDatabase) CleanUpUserConversationsMsgs(ctx context.Context, u
|
|||||||
func (db *commonMsgDatabase) SetMaxSeq(ctx context.Context, conversationID string, maxSeq int64) error {
|
func (db *commonMsgDatabase) SetMaxSeq(ctx context.Context, conversationID string, maxSeq int64) error {
|
||||||
return db.cache.SetMaxSeq(ctx, conversationID, maxSeq)
|
return db.cache.SetMaxSeq(ctx, conversationID, maxSeq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) GetMaxSeqs(ctx context.Context, conversationIDs []string) (map[string]int64, error) {
|
func (db *commonMsgDatabase) GetMaxSeqs(ctx context.Context, conversationIDs []string) (map[string]int64, error) {
|
||||||
return db.cache.GetMaxSeqs(ctx, conversationIDs)
|
return db.cache.GetMaxSeqs(ctx, conversationIDs)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) GetMaxSeq(ctx context.Context, conversationID string) (int64, error) {
|
func (db *commonMsgDatabase) GetMaxSeq(ctx context.Context, conversationID string) (int64, error) {
|
||||||
return db.cache.GetMaxSeq(ctx, conversationID)
|
return db.cache.GetMaxSeq(ctx, conversationID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) SetMinSeq(ctx context.Context, conversationID string, minSeq int64) error {
|
func (db *commonMsgDatabase) SetMinSeq(ctx context.Context, conversationID string, minSeq int64) error {
|
||||||
return db.cache.SetMinSeq(ctx, conversationID, minSeq)
|
return db.cache.SetMinSeq(ctx, conversationID, minSeq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) SetMinSeqs(ctx context.Context, seqs map[string]int64) error {
|
func (db *commonMsgDatabase) SetMinSeqs(ctx context.Context, seqs map[string]int64) error {
|
||||||
return db.cache.SetMinSeqs(ctx, seqs)
|
return db.cache.SetMinSeqs(ctx, seqs)
|
||||||
}
|
}
|
||||||
@@ -834,23 +807,18 @@ func (db *commonMsgDatabase) SetMinSeqs(ctx context.Context, seqs map[string]int
|
|||||||
func (db *commonMsgDatabase) GetMinSeqs(ctx context.Context, conversationIDs []string) (map[string]int64, error) {
|
func (db *commonMsgDatabase) GetMinSeqs(ctx context.Context, conversationIDs []string) (map[string]int64, error) {
|
||||||
return db.cache.GetMinSeqs(ctx, conversationIDs)
|
return db.cache.GetMinSeqs(ctx, conversationIDs)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) GetMinSeq(ctx context.Context, conversationID string) (int64, error) {
|
func (db *commonMsgDatabase) GetMinSeq(ctx context.Context, conversationID string) (int64, error) {
|
||||||
return db.cache.GetMinSeq(ctx, conversationID)
|
return db.cache.GetMinSeq(ctx, conversationID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) GetConversationUserMinSeq(ctx context.Context, conversationID string, userID string) (int64, error) {
|
func (db *commonMsgDatabase) GetConversationUserMinSeq(ctx context.Context, conversationID string, userID string) (int64, error) {
|
||||||
return db.cache.GetConversationUserMinSeq(ctx, conversationID, userID)
|
return db.cache.GetConversationUserMinSeq(ctx, conversationID, userID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) GetConversationUserMinSeqs(ctx context.Context, conversationID string, userIDs []string) (map[string]int64, error) {
|
func (db *commonMsgDatabase) GetConversationUserMinSeqs(ctx context.Context, conversationID string, userIDs []string) (map[string]int64, error) {
|
||||||
return db.cache.GetConversationUserMinSeqs(ctx, conversationID, userIDs)
|
return db.cache.GetConversationUserMinSeqs(ctx, conversationID, userIDs)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) SetConversationUserMinSeq(ctx context.Context, conversationID string, userID string, minSeq int64) error {
|
func (db *commonMsgDatabase) SetConversationUserMinSeq(ctx context.Context, conversationID string, userID string, minSeq int64) error {
|
||||||
return db.cache.SetConversationUserMinSeq(ctx, conversationID, userID, minSeq)
|
return db.cache.SetConversationUserMinSeq(ctx, conversationID, userID, minSeq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) SetConversationUserMinSeqs(ctx context.Context, conversationID string, seqs map[string]int64) (err error) {
|
func (db *commonMsgDatabase) SetConversationUserMinSeqs(ctx context.Context, conversationID string, seqs map[string]int64) (err error) {
|
||||||
return db.cache.SetConversationUserMinSeqs(ctx, conversationID, seqs)
|
return db.cache.SetConversationUserMinSeqs(ctx, conversationID, seqs)
|
||||||
}
|
}
|
||||||
@@ -866,7 +834,6 @@ func (db *commonMsgDatabase) UserSetHasReadSeqs(ctx context.Context, userID stri
|
|||||||
func (db *commonMsgDatabase) SetHasReadSeq(ctx context.Context, userID string, conversationID string, hasReadSeq int64) error {
|
func (db *commonMsgDatabase) SetHasReadSeq(ctx context.Context, userID string, conversationID string, hasReadSeq int64) error {
|
||||||
return db.cache.SetHasReadSeq(ctx, userID, conversationID, hasReadSeq)
|
return db.cache.SetHasReadSeq(ctx, userID, conversationID, hasReadSeq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) GetHasReadSeqs(ctx context.Context, userID string, conversationIDs []string) (map[string]int64, error) {
|
func (db *commonMsgDatabase) GetHasReadSeqs(ctx context.Context, userID string, conversationIDs []string) (map[string]int64, error) {
|
||||||
return db.cache.GetHasReadSeqs(ctx, userID, conversationIDs)
|
return db.cache.GetHasReadSeqs(ctx, userID, conversationIDs)
|
||||||
}
|
}
|
||||||
@@ -917,37 +884,22 @@ func (db *commonMsgDatabase) GetMinMaxSeqMongo(ctx context.Context, conversation
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) RangeUserSendCount(
|
func (db *commonMsgDatabase) RangeUserSendCount(ctx context.Context, start time.Time, end time.Time, group bool, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, users []*unRelationTb.UserCount, dateCount map[string]int64, err error) {
|
||||||
ctx context.Context,
|
|
||||||
start time.Time,
|
|
||||||
end time.Time,
|
|
||||||
group bool,
|
|
||||||
ase bool,
|
|
||||||
pageNumber int32,
|
|
||||||
showNumber int32,
|
|
||||||
) (msgCount int64, userCount int64, users []*unRelationTb.UserCount, dateCount map[string]int64, err error) {
|
|
||||||
return db.msgDocDatabase.RangeUserSendCount(ctx, start, end, group, ase, pageNumber, showNumber)
|
return db.msgDocDatabase.RangeUserSendCount(ctx, start, end, group, ase, pageNumber, showNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) RangeGroupSendCount(
|
func (db *commonMsgDatabase) RangeGroupSendCount(ctx context.Context, start time.Time, end time.Time, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error) {
|
||||||
ctx context.Context,
|
|
||||||
start time.Time,
|
|
||||||
end time.Time,
|
|
||||||
ase bool,
|
|
||||||
pageNumber int32,
|
|
||||||
showNumber int32,
|
|
||||||
) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error) {
|
|
||||||
return db.msgDocDatabase.RangeGroupSendCount(ctx, start, end, ase, pageNumber, showNumber)
|
return db.msgDocDatabase.RangeGroupSendCount(ctx, start, end, ase, pageNumber, showNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) SearchMessage(ctx context.Context, req *pbMsg.SearchMessageReq) (total int32, msgData []*sdkws.MsgData, err error) {
|
func (db *commonMsgDatabase) SearchMessage(ctx context.Context, req *pbMsg.SearchMessageReq) (msgData []*sdkws.MsgData, err error) {
|
||||||
var totalMsgs []*sdkws.MsgData
|
var totalMsgs []*sdkws.MsgData
|
||||||
total, msgs, err := db.msgDocDatabase.SearchMessage(ctx, req)
|
msgs, err := db.msgDocDatabase.SearchMessage(ctx, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
for _, msg := range msgs {
|
for _, msg := range msgs {
|
||||||
totalMsgs = append(totalMsgs, convert.MsgDB2Pb(msg.Msg))
|
totalMsgs = append(totalMsgs, convert.MsgDB2Pb(msg.Msg))
|
||||||
}
|
}
|
||||||
return total, totalMsgs, nil
|
return totalMsgs, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,12 +16,11 @@ package controller
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"path/filepath"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cont"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cont"
|
||||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
|
||||||
|
"path/filepath"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type S3Database interface {
|
type S3Database interface {
|
||||||
|
|||||||
@@ -26,22 +26,22 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type UserDatabase interface {
|
type UserDatabase interface {
|
||||||
// 获取指定用户的信息 如有userID未找到 也返回错误
|
//获取指定用户的信息 如有userID未找到 也返回错误
|
||||||
FindWithError(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error)
|
FindWithError(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error)
|
||||||
// 获取指定用户的信息 如有userID未找到 不返回错误
|
//获取指定用户的信息 如有userID未找到 不返回错误
|
||||||
Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error)
|
Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error)
|
||||||
// 插入多条 外部保证userID 不重复 且在db中不存在
|
//插入多条 外部保证userID 不重复 且在db中不存在
|
||||||
Create(ctx context.Context, users []*relation.UserModel) (err error)
|
Create(ctx context.Context, users []*relation.UserModel) (err error)
|
||||||
// 更新(非零值) 外部保证userID存在
|
//更新(非零值) 外部保证userID存在
|
||||||
Update(ctx context.Context, user *relation.UserModel) (err error)
|
Update(ctx context.Context, user *relation.UserModel) (err error)
|
||||||
// 更新(零值) 外部保证userID存在
|
//更新(零值) 外部保证userID存在
|
||||||
UpdateByMap(ctx context.Context, userID string, args map[string]interface{}) (err error)
|
UpdateByMap(ctx context.Context, userID string, args map[string]interface{}) (err error)
|
||||||
// 如果没找到,不返回错误
|
//如果没找到,不返回错误
|
||||||
Page(ctx context.Context, pageNumber, showNumber int32) (users []*relation.UserModel, count int64, err error)
|
Page(ctx context.Context, pageNumber, showNumber int32) (users []*relation.UserModel, count int64, err error)
|
||||||
// 只要有一个存在就为true
|
//只要有一个存在就为true
|
||||||
IsExist(ctx context.Context, userIDs []string) (exist bool, err error)
|
IsExist(ctx context.Context, userIDs []string) (exist bool, err error)
|
||||||
//获取所有用户ID
|
//获取所有用户ID
|
||||||
GetAllUserID(ctx context.Context, pageNumber, showNumber int32) ([]string, error)
|
GetAllUserID(ctx context.Context) ([]string, error)
|
||||||
//函数内部先查询db中是否存在,存在则什么都不做;不存在则插入
|
//函数内部先查询db中是否存在,存在则什么都不做;不存在则插入
|
||||||
InitOnce(ctx context.Context, users []*relation.UserModel) (err error)
|
InitOnce(ctx context.Context, users []*relation.UserModel) (err error)
|
||||||
// 获取用户总数
|
// 获取用户总数
|
||||||
@@ -75,7 +75,7 @@ func (u *userDatabase) InitOnce(ctx context.Context, users []*relation.UserModel
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取指定用户的信息 如有userID未找到 也返回错误.
|
// 获取指定用户的信息 如有userID未找到 也返回错误
|
||||||
func (u *userDatabase) FindWithError(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) {
|
func (u *userDatabase) FindWithError(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) {
|
||||||
users, err = u.cache.GetUsersInfo(ctx, userIDs)
|
users, err = u.cache.GetUsersInfo(ctx, userIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -87,13 +87,13 @@ func (u *userDatabase) FindWithError(ctx context.Context, userIDs []string) (use
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取指定用户的信息 如有userID未找到 不返回错误.
|
// 获取指定用户的信息 如有userID未找到 不返回错误
|
||||||
func (u *userDatabase) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) {
|
func (u *userDatabase) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) {
|
||||||
users, err = u.cache.GetUsersInfo(ctx, userIDs)
|
users, err = u.cache.GetUsersInfo(ctx, userIDs)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 插入多条 外部保证userID 不重复 且在db中不存在.
|
// 插入多条 外部保证userID 不重复 且在db中不存在
|
||||||
func (u *userDatabase) Create(ctx context.Context, users []*relation.UserModel) (err error) {
|
func (u *userDatabase) Create(ctx context.Context, users []*relation.UserModel) (err error) {
|
||||||
if err := u.tx.Transaction(func(tx any) error {
|
if err := u.tx.Transaction(func(tx any) error {
|
||||||
err = u.userDB.Create(ctx, users)
|
err = u.userDB.Create(ctx, users)
|
||||||
@@ -111,7 +111,7 @@ func (u *userDatabase) Create(ctx context.Context, users []*relation.UserModel)
|
|||||||
return u.cache.DelUsersInfo(userIDs...).ExecDel(ctx)
|
return u.cache.DelUsersInfo(userIDs...).ExecDel(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新(非零值) 外部保证userID存在.
|
// 更新(非零值) 外部保证userID存在
|
||||||
func (u *userDatabase) Update(ctx context.Context, user *relation.UserModel) (err error) {
|
func (u *userDatabase) Update(ctx context.Context, user *relation.UserModel) (err error) {
|
||||||
if err := u.userDB.Update(ctx, user); err != nil {
|
if err := u.userDB.Update(ctx, user); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -119,7 +119,7 @@ func (u *userDatabase) Update(ctx context.Context, user *relation.UserModel) (er
|
|||||||
return u.cache.DelUsersInfo(user.UserID).ExecDel(ctx)
|
return u.cache.DelUsersInfo(user.UserID).ExecDel(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新(零值) 外部保证userID存在.
|
// 更新(零值) 外部保证userID存在
|
||||||
func (u *userDatabase) UpdateByMap(ctx context.Context, userID string, args map[string]interface{}) (err error) {
|
func (u *userDatabase) UpdateByMap(ctx context.Context, userID string, args map[string]interface{}) (err error) {
|
||||||
if err := u.userDB.UpdateByMap(ctx, userID, args); err != nil {
|
if err := u.userDB.UpdateByMap(ctx, userID, args); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -127,7 +127,7 @@ func (u *userDatabase) UpdateByMap(ctx context.Context, userID string, args map[
|
|||||||
return u.cache.DelUsersInfo(userID).ExecDel(ctx)
|
return u.cache.DelUsersInfo(userID).ExecDel(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取,如果没找到,不返回错误.
|
// 获取,如果没找到,不返回错误
|
||||||
func (u *userDatabase) Page(
|
func (u *userDatabase) Page(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
pageNumber, showNumber int32,
|
pageNumber, showNumber int32,
|
||||||
@@ -135,7 +135,7 @@ func (u *userDatabase) Page(
|
|||||||
return u.userDB.Page(ctx, pageNumber, showNumber)
|
return u.userDB.Page(ctx, pageNumber, showNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
// userIDs是否存在 只要有一个存在就为true.
|
// userIDs是否存在 只要有一个存在就为true
|
||||||
func (u *userDatabase) IsExist(ctx context.Context, userIDs []string) (exist bool, err error) {
|
func (u *userDatabase) IsExist(ctx context.Context, userIDs []string) (exist bool, err error) {
|
||||||
users, err := u.userDB.Find(ctx, userIDs)
|
users, err := u.userDB.Find(ctx, userIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -147,8 +147,8 @@ func (u *userDatabase) IsExist(ctx context.Context, userIDs []string) (exist boo
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *userDatabase) GetAllUserID(ctx context.Context, pageNumber, showNumber int32) (userIDs []string, err error) {
|
func (u *userDatabase) GetAllUserID(ctx context.Context) (userIDs []string, err error) {
|
||||||
return u.userDB.GetAllUserID(ctx, pageNumber, showNumber)
|
return u.userDB.GetAllUserID(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *userDatabase) CountTotal(ctx context.Context, before *time.Time) (count int64, err error) {
|
func (u *userDatabase) CountTotal(ctx context.Context, before *time.Time) (count int64, err error) {
|
||||||
|
|||||||
@@ -76,4 +76,5 @@ func (g *ConversationLocalCache) GetConversationIDs(ctx context.Context, userID
|
|||||||
return conversationIDsResp.ConversationIDs, nil
|
return conversationIDsResp.ConversationIDs, nil
|
||||||
}
|
}
|
||||||
return hash.ids, nil
|
return hash.ids, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
package relation
|
package relation
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/golang/protobuf/jsonpb"
|
"github.com/golang/protobuf/jsonpb"
|
||||||
"github.com/jinzhu/copier"
|
"github.com/jinzhu/copier"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
@@ -60,3 +62,44 @@ func (c *ChatLogGorm) Create(msg *pbMsg.MsgDataToMQ) error {
|
|||||||
chatLog.SendTime = utils.UnixMillSecondToTime(msg.MsgData.SendTime)
|
chatLog.SendTime = utils.UnixMillSecondToTime(msg.MsgData.SendTime)
|
||||||
return c.DB.Create(chatLog).Error
|
return c.DB.Create(chatLog).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *ChatLogGorm) GetChatLog(
|
||||||
|
chatLog *relation.ChatLogModel,
|
||||||
|
pageNumber, showNumber int32,
|
||||||
|
contentTypeList []int32,
|
||||||
|
) (int64, []relation.ChatLogModel, error) {
|
||||||
|
mdb := c.DB.Model(chatLog)
|
||||||
|
if chatLog.SendTime.Unix() > 0 {
|
||||||
|
mdb = mdb.Where("send_time > ? and send_time < ?", chatLog.SendTime, chatLog.SendTime.AddDate(0, 0, 1))
|
||||||
|
}
|
||||||
|
if chatLog.Content != "" {
|
||||||
|
mdb = mdb.Where(" content like ? ", fmt.Sprintf("%%%s%%", chatLog.Content))
|
||||||
|
}
|
||||||
|
if chatLog.SessionType == 1 {
|
||||||
|
mdb = mdb.Where("session_type = ?", chatLog.SessionType)
|
||||||
|
} else if chatLog.SessionType == 2 {
|
||||||
|
mdb = mdb.Where("session_type in (?)", []int{constant.GroupChatType, constant.SuperGroupChatType})
|
||||||
|
}
|
||||||
|
if chatLog.ContentType != 0 {
|
||||||
|
mdb = mdb.Where("content_type = ?", chatLog.ContentType)
|
||||||
|
}
|
||||||
|
if chatLog.SendID != "" {
|
||||||
|
mdb = mdb.Where("send_id = ?", chatLog.SendID)
|
||||||
|
}
|
||||||
|
if chatLog.RecvID != "" {
|
||||||
|
mdb = mdb.Where("recv_id = ?", chatLog.RecvID)
|
||||||
|
}
|
||||||
|
if len(contentTypeList) > 0 {
|
||||||
|
mdb = mdb.Where("content_type in (?)", contentTypeList)
|
||||||
|
}
|
||||||
|
var count int64
|
||||||
|
if err := mdb.Count(&count).Error; err != nil {
|
||||||
|
return 0, nil, err
|
||||||
|
}
|
||||||
|
var chatLogs []relation.ChatLogModel
|
||||||
|
mdb = mdb.Limit(int(showNumber)).Offset(int(showNumber * (pageNumber - 1)))
|
||||||
|
if err := mdb.Find(&chatLogs).Error; err != nil {
|
||||||
|
return 0, nil, err
|
||||||
|
}
|
||||||
|
return count, chatLogs, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -35,12 +35,12 @@ func (f *FriendGorm) NewTx(tx any) relation.FriendModelInterface {
|
|||||||
return &FriendGorm{NewMetaDB(tx.(*gorm.DB), &relation.FriendModel{})}
|
return &FriendGorm{NewMetaDB(tx.(*gorm.DB), &relation.FriendModel{})}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 插入多条记录.
|
// 插入多条记录
|
||||||
func (f *FriendGorm) Create(ctx context.Context, friends []*relation.FriendModel) (err error) {
|
func (f *FriendGorm) Create(ctx context.Context, friends []*relation.FriendModel) (err error) {
|
||||||
return utils.Wrap(f.db(ctx).Create(&friends).Error, "")
|
return utils.Wrap(f.db(ctx).Create(&friends).Error, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除ownerUserID指定的好友.
|
// 删除ownerUserID指定的好友
|
||||||
func (f *FriendGorm) Delete(ctx context.Context, ownerUserID string, friendUserIDs []string) (err error) {
|
func (f *FriendGorm) Delete(ctx context.Context, ownerUserID string, friendUserIDs []string) (err error) {
|
||||||
err = utils.Wrap(
|
err = utils.Wrap(
|
||||||
f.db(ctx).
|
f.db(ctx).
|
||||||
@@ -52,7 +52,7 @@ func (f *FriendGorm) Delete(ctx context.Context, ownerUserID string, friendUserI
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新ownerUserID单个好友信息 更新零值.
|
// 更新ownerUserID单个好友信息 更新零值
|
||||||
func (f *FriendGorm) UpdateByMap(
|
func (f *FriendGorm) UpdateByMap(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
ownerUserID string,
|
ownerUserID string,
|
||||||
@@ -65,12 +65,12 @@ func (f *FriendGorm) UpdateByMap(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新好友信息的非零值.
|
// 更新好友信息的非零值
|
||||||
func (f *FriendGorm) Update(ctx context.Context, friends []*relation.FriendModel) (err error) {
|
func (f *FriendGorm) Update(ctx context.Context, friends []*relation.FriendModel) (err error) {
|
||||||
return utils.Wrap(f.db(ctx).Updates(&friends).Error, "")
|
return utils.Wrap(f.db(ctx).Updates(&friends).Error, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新好友备注(也支持零值 ).
|
// 更新好友备注(也支持零值 )
|
||||||
func (f *FriendGorm) UpdateRemark(ctx context.Context, ownerUserID, friendUserID, remark string) (err error) {
|
func (f *FriendGorm) UpdateRemark(ctx context.Context, ownerUserID, friendUserID, remark string) (err error) {
|
||||||
if remark != "" {
|
if remark != "" {
|
||||||
return utils.Wrap(
|
return utils.Wrap(
|
||||||
@@ -86,7 +86,7 @@ func (f *FriendGorm) UpdateRemark(ctx context.Context, ownerUserID, friendUserID
|
|||||||
return utils.Wrap(f.db(ctx).Where("owner_user_id = ?", ownerUserID).Updates(m).Error, "")
|
return utils.Wrap(f.db(ctx).Where("owner_user_id = ?", ownerUserID).Updates(m).Error, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取单个好友信息,如没找到 返回错误.
|
// 获取单个好友信息,如没找到 返回错误
|
||||||
func (f *FriendGorm) Take(
|
func (f *FriendGorm) Take(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
ownerUserID, friendUserID string,
|
ownerUserID, friendUserID string,
|
||||||
@@ -98,7 +98,7 @@ func (f *FriendGorm) Take(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查找好友关系,如果是双向关系,则都返回.
|
// 查找好友关系,如果是双向关系,则都返回
|
||||||
func (f *FriendGorm) FindUserState(
|
func (f *FriendGorm) FindUserState(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
userID1, userID2 string,
|
userID1, userID2 string,
|
||||||
@@ -112,7 +112,7 @@ func (f *FriendGorm) FindUserState(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取 owner指定的好友列表 如果有friendUserIDs不存在,也不返回错误.
|
// 获取 owner指定的好友列表 如果有friendUserIDs不存在,也不返回错误
|
||||||
func (f *FriendGorm) FindFriends(
|
func (f *FriendGorm) FindFriends(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
ownerUserID string,
|
ownerUserID string,
|
||||||
@@ -124,7 +124,7 @@ func (f *FriendGorm) FindFriends(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取哪些人添加了friendUserID 如果有ownerUserIDs不存在,也不返回错误.
|
// 获取哪些人添加了friendUserID 如果有ownerUserIDs不存在,也不返回错误
|
||||||
func (f *FriendGorm) FindReversalFriends(
|
func (f *FriendGorm) FindReversalFriends(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
friendUserID string,
|
friendUserID string,
|
||||||
@@ -136,7 +136,7 @@ func (f *FriendGorm) FindReversalFriends(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取ownerUserID好友列表 支持翻页.
|
// 获取ownerUserID好友列表 支持翻页
|
||||||
func (f *FriendGorm) FindOwnerFriends(
|
func (f *FriendGorm) FindOwnerFriends(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
ownerUserID string,
|
ownerUserID string,
|
||||||
@@ -158,7 +158,7 @@ func (f *FriendGorm) FindOwnerFriends(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取哪些人添加了friendUserID 支持翻页.
|
// 获取哪些人添加了friendUserID 支持翻页
|
||||||
func (f *FriendGorm) FindInWhoseFriends(
|
func (f *FriendGorm) FindInWhoseFriends(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
friendUserID string,
|
friendUserID string,
|
||||||
|
|||||||
@@ -35,12 +35,12 @@ func (f *FriendRequestGorm) NewTx(tx any) relation.FriendRequestModelInterface {
|
|||||||
return &FriendRequestGorm{NewMetaDB(tx.(*gorm.DB), &relation.FriendRequestModel{})}
|
return &FriendRequestGorm{NewMetaDB(tx.(*gorm.DB), &relation.FriendRequestModel{})}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 插入多条记录.
|
// 插入多条记录
|
||||||
func (f *FriendRequestGorm) Create(ctx context.Context, friendRequests []*relation.FriendRequestModel) (err error) {
|
func (f *FriendRequestGorm) Create(ctx context.Context, friendRequests []*relation.FriendRequestModel) (err error) {
|
||||||
return utils.Wrap(f.db(ctx).Create(&friendRequests).Error, "")
|
return utils.Wrap(f.db(ctx).Create(&friendRequests).Error, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除记录.
|
// 删除记录
|
||||||
func (f *FriendRequestGorm) Delete(ctx context.Context, fromUserID, toUserID string) (err error) {
|
func (f *FriendRequestGorm) Delete(ctx context.Context, fromUserID, toUserID string) (err error) {
|
||||||
return utils.Wrap(
|
return utils.Wrap(
|
||||||
f.db(ctx).
|
f.db(ctx).
|
||||||
@@ -51,7 +51,7 @@ func (f *FriendRequestGorm) Delete(ctx context.Context, fromUserID, toUserID str
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新零值.
|
// 更新零值
|
||||||
func (f *FriendRequestGorm) UpdateByMap(
|
func (f *FriendRequestGorm) UpdateByMap(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
fromUserID string,
|
fromUserID string,
|
||||||
@@ -68,7 +68,7 @@ func (f *FriendRequestGorm) UpdateByMap(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新记录 (非零值).
|
// 更新记录 (非零值)
|
||||||
func (f *FriendRequestGorm) Update(ctx context.Context, friendRequest *relation.FriendRequestModel) (err error) {
|
func (f *FriendRequestGorm) Update(ctx context.Context, friendRequest *relation.FriendRequestModel) (err error) {
|
||||||
return utils.Wrap(
|
return utils.Wrap(
|
||||||
f.db(ctx).
|
f.db(ctx).
|
||||||
@@ -79,7 +79,7 @@ func (f *FriendRequestGorm) Update(ctx context.Context, friendRequest *relation.
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取来指定用户的好友申请 未找到 不返回错误.
|
// 获取来指定用户的好友申请 未找到 不返回错误
|
||||||
func (f *FriendRequestGorm) Find(
|
func (f *FriendRequestGorm) Find(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
fromUserID, toUserID string,
|
fromUserID, toUserID string,
|
||||||
@@ -104,7 +104,7 @@ func (f *FriendRequestGorm) Take(
|
|||||||
return friendRequest, err
|
return friendRequest, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取toUserID收到的好友申请列表.
|
// 获取toUserID收到的好友申请列表
|
||||||
func (f *FriendRequestGorm) FindToUserID(
|
func (f *FriendRequestGorm) FindToUserID(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
toUserID string,
|
toUserID string,
|
||||||
@@ -126,7 +126,7 @@ func (f *FriendRequestGorm) FindToUserID(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取fromUserID发出去的好友申请列表.
|
// 获取fromUserID发出去的好友申请列表
|
||||||
func (f *FriendRequestGorm) FindFromUserID(
|
func (f *FriendRequestGorm) FindFromUserID(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
fromUserID string,
|
fromUserID string,
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user