@ -7,17 +7,16 @@ import (
imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
rocksCache "Open_IM/pkg/common/db/rocks_cache"
"Open_IM/pkg/common/log"
"Open_IM/pkg/common/middleware"
promePkg "Open_IM/pkg/common/prometheus"
"Open_IM/pkg/common/token_verify"
cp "Open_IM/pkg/common/utils"
"Open_IM/pkg/getcdv3"
pbCache "Open_IM/pkg/proto/cache"
pbFriend "Open_IM/pkg/proto/friend"
sdkws "Open_IM/pkg/proto/sdk_ws"
"Open_IM/pkg/utils"
"context"
"errors"
"fmt"
"github.com/OpenIMSDK/getcdv3"
"net"
"strconv"
"strings"
@ -29,19 +28,25 @@ import (
)
type friendServer struct {
rpcPort int
rpcRegisterName string
etcdSchema string
etcdAddr [ ] string
rpcPort int
rpcRegisterName string
etcdSchema string
etcdAddr [ ] string
friendModel * imdb . Friend
friendRequestModel * imdb . FriendRequest
blackModel * imdb . Black
}
func NewFriendServer ( port int ) * friendServer {
log . NewPrivateLog ( constant . LogFileName )
return & friendServer {
rpcPort : port ,
rpcRegisterName : config . Config . RpcRegisterName . OpenImFriendName ,
etcdSchema : config . Config . Etcd . EtcdSchema ,
etcdAddr : config . Config . Etcd . EtcdAddr ,
rpcPort : port ,
rpcRegisterName : config . Config . RpcRegisterName . OpenImFriendName ,
etcdSchema : config . Config . Etcd . EtcdSchema ,
etcdAddr : config . Config . Etcd . EtcdAddr ,
friendModel : imdb . NewFriend ( nil ) ,
friendRequestModel : imdb . NewFriendRequest ( nil ) ,
blackModel : imdb . NewBlack ( nil ) ,
}
}
@ -65,6 +70,7 @@ func (s *friendServer) Run() {
defer listener . Close ( )
//grpc server
var grpcOpts [ ] grpc . ServerOption
grpcOpts = append ( grpcOpts , grpc . UnaryInterceptor ( middleware . RpcServerInterceptor ) )
if config . Config . Prometheus . Enable {
promePkg . NewGrpcRequestCounter ( )
promePkg . NewGrpcRequestFailedCounter ( )
@ -100,67 +106,43 @@ func (s *friendServer) Run() {
}
func ( s * friendServer ) AddBlacklist ( ctx context . Context , req * pbFriend . AddBlacklistReq ) ( * pbFriend . AddBlacklistResp , error ) {
log . NewInfo ( req . CommID . OperationID , "AddBlacklist args " , req . String ( ) )
ok := token_verify . CheckAccess ( ctx , req . CommID . OpUserID , req . CommID . FromUserID )
if ! ok {
return & pbFriend . AddBlacklistResp { CommonResp : constant . Error2CommResp ( ctx , constant . ErrNoPermission , "accress" ) } , nil
resp := & pbFriend . AddBlacklistResp { }
if err := token_verify . CheckAccessV3 ( ctx , req . CommID . FromUserID ) ; err != nil {
return nil , err
}
black := imdb . Black { OwnerUserID : req . CommID . FromUserID , BlockUserID : req . CommID . ToUserID , OperatorUserID : req . CommID . OpUserID }
err := imdb . InsertInToUserBlackList ( ctx , black )
if err != nil {
return & pbFriend . AddBlacklistResp { CommonResp : constant . Error2CommResp ( ctx , constant . ErrDatabase , err . Error ( ) ) } , nil
if err := s . blackModel . Create ( ctx , [ ] * imdb . Black { & black } ) ; err != nil {
return nil , err
}
etcdConn := getcdv3 . GetConn ( config . Config . Etcd . EtcdSchema , strings . Join ( config . Config . Etcd . EtcdAddr , "," ) , config . Config . RpcRegisterName . OpenImCacheName , req . CommID . OperationID , config . Config . Etcd . UserName , config . Config . Etcd . Password )
if etcdConn == nil {
return & pbFriend . AddBlacklistResp { CommonResp : constant . Error2CommResp ( ctx , constant . ErrInternalServer , "conn is nil" ) } , nil
}
cacheClient := pbCache . NewCacheClient ( etcdConn )
cacheResp , err := cacheClient . DelBlackIDListFromCache ( ctx , & pbCache . DelBlackIDListFromCacheReq { UserID : req . CommID . FromUserID , OperationID : req . CommID . OperationID } )
etcdConn , err := getcdv3 . GetConn ( ctx , config . Config . RpcRegisterName . OpenImCacheName )
if err != nil {
return & pbFriend . AddBlacklistResp { CommonResp : constant . Error2CommResp ( ctx , constant . ErrInternalServer , err . Error ( ) ) } , nil
return nil , err
}
if cacheResp . CommonResp . ErrCode != 0 {
err = errors . New ( fmt . Sprintf ( "call DelBlackIDListFromCache rpc failed code is %d, err is %s, args is %s" , cacheResp . CommonResp . ErrCode , cacheResp . CommonResp . ErrMsg , req . CommID . FromUserID ) )
return & pbFriend . AddBlacklistResp { CommonResp : constant . Error2CommResp ( ctx , constant . ErrInternalServer , err . Error ( ) ) } , nil
_ , err = pbCache . NewCacheClient ( etcdConn ) . DelBlackIDListFromCache ( ctx , & pbCache . DelBlackIDListFromCacheReq { UserID : req . CommID . FromUserID , OperationID : req . CommID . OperationID } )
if err != nil {
return nil , err
}
chat . BlackAddedNotification ( req )
return & pbF riend. AddBlacklistR esp{ CommonResp : constant . Error2CommResp ( ctx , constant . ErrNone , "" ) } , nil
return resp, nil
}
func ( s * friendServer ) AddFriend ( ctx context . Context , req * pbFriend . AddFriendReq ) ( * pbFriend . AddFriendResp , error ) {
log . NewInfo ( req . CommID . OperationID , "AddFriend args " , req . String ( ) )
ok := token_verify . CheckAccess ( ctx , req . CommID . OpUserID , req . CommID . FromUserID )
if ! ok {
log . NewError ( req . CommID . OperationID , "CheckAccess false " , req . CommID . OpUserID , req . CommID . FromUserID )
return & pbFriend . AddFriendResp { CommonResp : & sdkws . CommonResp { ErrCode : constant . ErrNoPermission . ErrCode , ErrMsg : constant . ErrNoPermission . ErrMsg } } , nil
}
callbackResp := callbackBeforeAddFriend ( req )
if callbackResp . ErrCode != 0 {
log . NewError ( req . CommID . OperationID , utils . GetSelfFuncName ( ) , "callbackBeforeSendSingleMsg resp: " , callbackResp )
resp := & pbFriend . AddFriendResp { }
if err := token_verify . CheckAccessV3 ( ctx , req . CommID . FromUserID ) ; err != nil {
return nil , err
}
if callbackResp . ActionCode != constant . ActionAllow {
if callbackResp . ErrCode == 0 {
callbackResp . ErrCode = 201
}
log . NewDebug ( req . CommID . OperationID , utils . GetSelfFuncName ( ) , "callbackBeforeSendSingleMsg result" , "end rpc and return" , callbackResp )
return & pbFriend . AddFriendResp { CommonResp : & sdkws . CommonResp {
ErrCode : int32 ( callbackResp . ErrCode ) ,
ErrMsg : callbackResp . ErrMsg ,
} } , nil
if err := callbackBeforeAddFriendV1 ( req ) ; err != nil {
return nil , err
}
var isSend = true
userIDList , err := rocksCache . GetFriendIDListFromCache ( ctx , req . CommID . ToUserID )
if err != nil {
log . NewError ( req . CommID . OperationID , "GetFriendIDListFromCache failed " , err . Error ( ) , req . CommID . ToUserID )
return & pbFriend . AddFriendResp { CommonResp : & sdkws . CommonResp { ErrCode : constant . ErrDB . ErrCode , ErrMsg : err . Error ( ) } } , nil
return nil , err
}
userIDList2 , err := rocksCache . GetFriendIDListFromCache ( ctx , req . CommID . FromUserID )
if err != nil {
log . NewError ( req . CommID . OperationID , "GetUserByUserID failed " , err . Error ( ) , req . CommID . FromUserID )
return & pbFriend . AddFriendResp { CommonResp : & sdkws . CommonResp { ErrCode : constant . ErrDB . ErrCode , ErrMsg : err . Error ( ) } } , nil
return nil , err
}
log . NewDebug ( req . CommID . OperationID , "toUserID" , userIDList , "fromUserID" , userIDList2 )
var isSend = true
for _ , v := range userIDList {
if v == req . CommID . FromUserID {
for _ , v2 := range userIDList2 {
@ -176,36 +158,27 @@ func (s *friendServer) AddFriend(ctx context.Context, req *pbFriend.AddFriendReq
//Cannot add non-existent users
if isSend {
if _ , err := imdb . GetUserByUserID ( req . CommID . ToUserID ) ; err != nil {
log . NewError ( req . CommID . OperationID , "GetUserByUserID failed " , err . Error ( ) , req . CommID . ToUserID )
return & pbFriend . AddFriendResp { CommonResp : & sdkws . CommonResp { ErrCode : constant . ErrDB . ErrCode , ErrMsg : constant . ErrDB . ErrMsg } } , nil
if _ , err := GetUserInfo ( ctx , req . CommID . ToUserID ) ; err != nil {
return nil , err
}
friendRequest := imdb . FriendRequest {
HandleResult : 0 , ReqMsg : req . ReqMsg , CreateTime : time . Now ( ) }
utils . CopyStructFields ( & friendRequest , req . CommID )
// {openIM001 openIM002 0 test add friend 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC }]
log . NewDebug ( req . CommID . OperationID , "UpdateFriendApplication args " , friendRequest )
//err := imdb.InsertFriendApplication(&friendRequest)
err := imdb . InsertFriendApplication ( & friendRequest ,
map [ string ] interface { } { "handle_result" : 0 , "req_msg" : friendRequest . ReqMsg , "create_time" : friendRequest . CreateTime ,
"handler_user_id" : "" , "handle_msg" : "" , "handle_time" : utils . UnixSecondToTime ( 0 ) , "ex" : "" } )
if err != nil {
log . NewError ( req . CommID . OperationID , "UpdateFriendApplication failed " , err . Error ( ) , friendRequest )
return & pbFriend . AddFriendResp { CommonResp : & sdkws . CommonResp { ErrCode : constant . ErrDB . ErrCode , ErrMsg : constant . ErrDB . ErrMsg } } , nil
FromUserID : req . CommID . FromUserID ,
ToUserID : req . CommID . ToUserID ,
HandleResult : 0 ,
ReqMsg : req . ReqMsg ,
CreateTime : time . Now ( ) ,
}
if err := s . friendRequestModel . Create ( ctx , [ ] * imdb . FriendRequest { & friendRequest } ) ; err != nil {
return nil , err
}
chat . FriendApplicationNotification ( req )
}
//Establish a latest relationship in the friend request table
return & pbFriend . AddFriendResp { CommonResp : & sdkws . CommonResp { } } , nil
return resp , nil
}
func ( s * friendServer ) ImportFriend ( ctx context . Context , req * pbFriend . ImportFriendReq ) ( * pbFriend . ImportFriendResp , error ) {
log . NewInfo ( req . OperationID , "ImportFriend args " , req . String ( ) )
resp := pbFriend . ImportFriendResp { CommonResp : & sdkws . CommonResp { } }
var c sdkws . CommonResp
if ! utils . IsContain ( req . OpUserID , config . Config . Manager . AppManagerUid ) {
log . NewError ( req . OperationID , "not authorized" , req . OpUserID , config . Config . Manager . AppManagerUid )
c . ErrCode = constant . ErrNoPermission . ErrCode