You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
734 lines
31 KiB
734 lines
31 KiB
package office
|
|
|
|
import (
|
|
"Open_IM/internal/rpc/msg"
|
|
"Open_IM/pkg/common/config"
|
|
"Open_IM/pkg/common/constant"
|
|
"Open_IM/pkg/common/db"
|
|
"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
|
|
imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
|
|
rocksCache "Open_IM/pkg/common/db/rocks_cache"
|
|
"Open_IM/pkg/common/log"
|
|
promePkg "Open_IM/pkg/common/prometheus"
|
|
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
|
pbCache "Open_IM/pkg/proto/cache"
|
|
pbOffice "Open_IM/pkg/proto/office"
|
|
pbCommon "Open_IM/pkg/proto/sdk_ws"
|
|
"Open_IM/pkg/utils"
|
|
"context"
|
|
"net"
|
|
"strconv"
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
"unsafe"
|
|
|
|
grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
|
|
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
type officeServer struct {
|
|
rpcPort int
|
|
rpcRegisterName string
|
|
etcdSchema string
|
|
etcdAddr []string
|
|
ch chan tagSendStruct
|
|
}
|
|
|
|
func NewOfficeServer(port int) *officeServer {
|
|
log.NewPrivateLog(constant.LogFileName)
|
|
ch := make(chan tagSendStruct, 100000)
|
|
return &officeServer{
|
|
rpcPort: port,
|
|
rpcRegisterName: config.Config.RpcRegisterName.OpenImOfficeName,
|
|
etcdSchema: config.Config.Etcd.EtcdSchema,
|
|
etcdAddr: config.Config.Etcd.EtcdAddr,
|
|
ch: ch,
|
|
}
|
|
}
|
|
|
|
func (s *officeServer) Run() {
|
|
log.NewInfo("0", "officeServer rpc start ")
|
|
listenIP := ""
|
|
if config.Config.ListenIP == "" {
|
|
listenIP = "0.0.0.0"
|
|
} else {
|
|
listenIP = config.Config.ListenIP
|
|
}
|
|
address := listenIP + ":" + strconv.Itoa(s.rpcPort)
|
|
//listener network
|
|
listener, err := net.Listen("tcp", address)
|
|
if err != nil {
|
|
panic("listening err:" + err.Error() + s.rpcRegisterName)
|
|
}
|
|
log.NewInfo("0", "listen network success, ", address, listener)
|
|
defer listener.Close()
|
|
//grpc server
|
|
recvSize := 1024 * 1024 * 30
|
|
sendSize := 1024 * 1024 * 30
|
|
var grpcOpts = []grpc.ServerOption{
|
|
grpc.MaxRecvMsgSize(recvSize),
|
|
grpc.MaxSendMsgSize(sendSize),
|
|
}
|
|
if config.Config.Prometheus.Enable {
|
|
promePkg.NewGrpcRequestCounter()
|
|
promePkg.NewGrpcRequestFailedCounter()
|
|
promePkg.NewGrpcRequestSuccessCounter()
|
|
grpcOpts = append(grpcOpts, []grpc.ServerOption{
|
|
// grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme),
|
|
grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor),
|
|
grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor),
|
|
}...)
|
|
}
|
|
srv := grpc.NewServer(grpcOpts...)
|
|
defer srv.GracefulStop()
|
|
//Service registers with etcd
|
|
pbOffice.RegisterOfficeServiceServer(srv, s)
|
|
rpcRegisterIP := config.Config.RpcRegisterIP
|
|
if config.Config.RpcRegisterIP == "" {
|
|
rpcRegisterIP, err = utils.GetLocalIP()
|
|
if err != nil {
|
|
log.Error("", "GetLocalIP failed ", err.Error())
|
|
}
|
|
}
|
|
log.NewInfo("", "rpcRegisterIP", rpcRegisterIP)
|
|
err = getcdv3.RegisterEtcd(s.etcdSchema, strings.Join(s.etcdAddr, ","), rpcRegisterIP, s.rpcPort, s.rpcRegisterName, 10)
|
|
if err != nil {
|
|
log.NewError("0", "RegisterEtcd failed ", err.Error())
|
|
panic(utils.Wrap(err, "register office module rpc to etcd err"))
|
|
}
|
|
go s.sendTagMsgRoutine()
|
|
err = srv.Serve(listener)
|
|
if err != nil {
|
|
log.NewError("0", "Serve failed ", err.Error())
|
|
return
|
|
}
|
|
log.NewInfo("0", "message cms rpc success")
|
|
}
|
|
|
|
type tagSendStruct struct {
|
|
operationID string
|
|
user *db.User
|
|
userID string
|
|
content string
|
|
senderPlatformID int32
|
|
}
|
|
|
|
func (s *officeServer) sendTagMsgRoutine() {
|
|
log.NewInfo("", utils.GetSelfFuncName(), "start")
|
|
for {
|
|
select {
|
|
case v := <-s.ch:
|
|
msg.TagSendMessage(v.operationID, v.user, v.userID, v.content, v.senderPlatformID)
|
|
time.Sleep(time.Millisecond * 100)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *officeServer) GetUserTags(_ context.Context, req *pbOffice.GetUserTagsReq) (resp *pbOffice.GetUserTagsResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req ", req.String())
|
|
resp = &pbOffice.GetUserTagsResp{
|
|
CommonResp: &pbOffice.CommonResp{},
|
|
Tags: []*pbOffice.Tag{},
|
|
}
|
|
tags, err := db.DB.GetUserTags(req.UserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserTags failed", err.Error())
|
|
resp.CommonResp.ErrMsg = constant.ErrDB.ErrMsg
|
|
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
|
|
return resp, nil
|
|
}
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "tags: ", tags)
|
|
for _, v := range tags {
|
|
tag := &pbOffice.Tag{
|
|
TagID: v.TagID,
|
|
TagName: v.TagName,
|
|
}
|
|
for _, userID := range v.UserList {
|
|
UserName, err := im_mysql_model.GetUserNameByUserID(userID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserNameByUserID failed", err.Error())
|
|
continue
|
|
}
|
|
tag.UserList = append(tag.UserList, &pbOffice.TagUser{
|
|
UserID: userID,
|
|
UserName: UserName,
|
|
})
|
|
}
|
|
resp.Tags = append(resp.Tags, tag)
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) CreateTag(_ context.Context, req *pbOffice.CreateTagReq) (resp *pbOffice.CreateTagResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "CreateTag req", req.String())
|
|
userIDList := utils.RemoveRepeatedStringInList(req.UserIDList)
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "userIDList: ", userIDList)
|
|
resp = &pbOffice.CreateTagResp{CommonResp: &pbOffice.CommonResp{}}
|
|
if err := db.DB.CreateTag(req.UserID, req.TagName, userIDList); err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserTags failed", err.Error())
|
|
resp.CommonResp.ErrMsg = constant.ErrDB.ErrMsg
|
|
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
|
|
return resp, nil
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) DeleteTag(_ context.Context, req *pbOffice.DeleteTagReq) (resp *pbOffice.DeleteTagResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.DeleteTagResp{CommonResp: &pbOffice.CommonResp{}}
|
|
if err := db.DB.DeleteTag(req.UserID, req.TagID); err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "DeleteTag failed", err.Error())
|
|
resp.CommonResp.ErrMsg = constant.ErrDB.ErrMsg
|
|
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
|
|
return resp, nil
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) SetTag(_ context.Context, req *pbOffice.SetTagReq) (resp *pbOffice.SetTagResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.SetTagResp{CommonResp: &pbOffice.CommonResp{}}
|
|
increaseUserIDList := utils.RemoveRepeatedStringInList(req.IncreaseUserIDList)
|
|
reduceUserIDList := utils.RemoveRepeatedStringInList(req.ReduceUserIDList)
|
|
if err := db.DB.SetTag(req.UserID, req.TagID, req.NewName, increaseUserIDList, reduceUserIDList); err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetTag failed", increaseUserIDList, reduceUserIDList, err.Error())
|
|
resp.CommonResp.ErrMsg = constant.ErrDB.ErrMsg
|
|
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
|
|
return resp, nil
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) SendMsg2Tag(_ context.Context, req *pbOffice.SendMsg2TagReq) (resp *pbOffice.SendMsg2TagResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.SendMsg2TagResp{CommonResp: &pbOffice.CommonResp{}}
|
|
var tagUserIDList []string
|
|
for _, tagID := range req.TagList {
|
|
userIDList, err := db.DB.GetUserIDListByTagID(req.SendID, tagID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserIDListByTagID failed", err.Error())
|
|
continue
|
|
}
|
|
tagUserIDList = append(tagUserIDList, userIDList...)
|
|
}
|
|
var groupUserIDList []string
|
|
for _, groupID := range req.GroupList {
|
|
etcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImCacheName, req.OperationID)
|
|
if etcdConn == nil {
|
|
errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil"
|
|
log.NewError(req.OperationID, errMsg)
|
|
resp.CommonResp.ErrCode = constant.ErrInternal.ErrCode
|
|
resp.CommonResp.ErrMsg = errMsg
|
|
return resp, nil
|
|
}
|
|
|
|
cacheClient := pbCache.NewCacheClient(etcdConn)
|
|
req := pbCache.GetGroupMemberIDListFromCacheReq{
|
|
OperationID: req.OperationID,
|
|
GroupID: groupID,
|
|
}
|
|
getGroupMemberIDListFromCacheResp, err := cacheClient.GetGroupMemberIDListFromCache(context.Background(), &req)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, "GetGroupMemberIDListFromCache rpc call failed ", err.Error(), req.String())
|
|
resp.CommonResp.ErrCode = constant.ErrServer.ErrCode
|
|
resp.CommonResp.ErrMsg = err.Error()
|
|
return resp, nil
|
|
}
|
|
if getGroupMemberIDListFromCacheResp.CommonResp.ErrCode != 0 {
|
|
log.NewError(req.OperationID, "GetGroupMemberIDListFromCache rpc logic call failed ", getGroupMemberIDListFromCacheResp.CommonResp.ErrCode)
|
|
resp.CommonResp.ErrCode = getGroupMemberIDListFromCacheResp.CommonResp.ErrCode
|
|
resp.CommonResp.ErrMsg = getGroupMemberIDListFromCacheResp.CommonResp.ErrMsg
|
|
return resp, nil
|
|
}
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), getGroupMemberIDListFromCacheResp.UserIDList)
|
|
groupUserIDList = append(groupUserIDList, getGroupMemberIDListFromCacheResp.UserIDList...)
|
|
}
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), groupUserIDList, req.GroupList)
|
|
var userIDList []string
|
|
userIDList = append(userIDList, tagUserIDList...)
|
|
userIDList = append(userIDList, groupUserIDList...)
|
|
userIDList = append(userIDList, req.UserList...)
|
|
userIDList = utils.RemoveRepeatedStringInList(userIDList)
|
|
for i, userID := range userIDList {
|
|
if userID == req.SendID || userID == "" {
|
|
userIDList = append(userIDList[:i], userIDList[i+1:]...)
|
|
}
|
|
}
|
|
if unsafe.Sizeof(userIDList) > 1024*1024 {
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "size", unsafe.Sizeof(userIDList))
|
|
resp.CommonResp.ErrMsg = constant.ErrSendLimit.ErrMsg
|
|
resp.CommonResp.ErrCode = constant.ErrSendLimit.ErrCode
|
|
return
|
|
}
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "total userIDList result: ", userIDList)
|
|
user, err := imdb.GetUserByUserID(req.SendID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), req.SendID)
|
|
resp.CommonResp.ErrMsg = err.Error()
|
|
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
|
|
return resp, nil
|
|
}
|
|
var successUserIDList []string
|
|
for _, userID := range userIDList {
|
|
t := tagSendStruct{
|
|
operationID: req.OperationID,
|
|
user: user,
|
|
userID: userID,
|
|
content: req.Content,
|
|
senderPlatformID: req.SenderPlatformID,
|
|
}
|
|
select {
|
|
case s.ch <- t:
|
|
log.NewDebug(t.operationID, utils.GetSelfFuncName(), "msg: ", t, "send success")
|
|
successUserIDList = append(successUserIDList, userID)
|
|
// if channel is full, return grpc req
|
|
case <-time.After(1 * time.Second):
|
|
log.NewError(t.operationID, utils.GetSelfFuncName(), s.ch, "channel is full")
|
|
resp.CommonResp.ErrCode = constant.ErrSendLimit.ErrCode
|
|
resp.CommonResp.ErrMsg = constant.ErrSendLimit.ErrMsg
|
|
return resp, nil
|
|
}
|
|
}
|
|
|
|
var tagSendLogs db.TagSendLog
|
|
var wg sync.WaitGroup
|
|
wg.Add(len(successUserIDList))
|
|
var lock sync.Mutex
|
|
for _, userID := range successUserIDList {
|
|
go func(userID string) {
|
|
defer wg.Done()
|
|
userName, err := im_mysql_model.GetUserNameByUserID(userID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserNameByUserID failed", err.Error(), userID)
|
|
return
|
|
}
|
|
lock.Lock()
|
|
tagSendLogs.UserList = append(tagSendLogs.UserList, db.TagUser{
|
|
UserID: userID,
|
|
UserName: userName,
|
|
})
|
|
lock.Unlock()
|
|
}(userID)
|
|
}
|
|
wg.Wait()
|
|
tagSendLogs.SendID = req.SendID
|
|
tagSendLogs.Content = req.Content
|
|
tagSendLogs.SenderPlatformID = req.SenderPlatformID
|
|
tagSendLogs.SendTime = time.Now().Unix()
|
|
if err := db.DB.SaveTagSendLog(&tagSendLogs); err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SaveTagSendLog failed", tagSendLogs, err.Error())
|
|
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
|
|
resp.CommonResp.ErrMsg = constant.ErrDB.ErrMsg
|
|
return resp, nil
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) GetTagSendLogs(_ context.Context, req *pbOffice.GetTagSendLogsReq) (resp *pbOffice.GetTagSendLogsResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.GetTagSendLogsResp{
|
|
CommonResp: &pbOffice.CommonResp{},
|
|
Pagination: &pbCommon.ResponsePagination{
|
|
CurrentPage: req.Pagination.PageNumber,
|
|
ShowNumber: req.Pagination.ShowNumber,
|
|
},
|
|
TagSendLogs: []*pbOffice.TagSendLog{},
|
|
}
|
|
tagSendLogs, err := db.DB.GetTagSendLogs(req.UserID, req.Pagination.ShowNumber, req.Pagination.PageNumber)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetTagSendLogs", err.Error())
|
|
resp.CommonResp.ErrMsg = constant.ErrDB.ErrMsg
|
|
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
|
|
return resp, nil
|
|
}
|
|
if err := utils.CopyStructFields(&resp.TagSendLogs, tagSendLogs); err != nil {
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), err.Error())
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) GetUserTagByID(_ context.Context, req *pbOffice.GetUserTagByIDReq) (resp *pbOffice.GetUserTagByIDResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.GetUserTagByIDResp{
|
|
CommonResp: &pbOffice.CommonResp{},
|
|
Tag: &pbOffice.Tag{},
|
|
}
|
|
tag, err := db.DB.GetTagByID(req.UserID, req.TagID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetTagByID failed", err.Error())
|
|
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
|
|
resp.CommonResp.ErrMsg = constant.ErrDB.ErrMsg
|
|
return resp, nil
|
|
}
|
|
for _, userID := range tag.UserList {
|
|
userName, err := im_mysql_model.GetUserNameByUserID(userID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserNameByUserID failed", err.Error())
|
|
continue
|
|
}
|
|
resp.Tag.UserList = append(resp.Tag.UserList, &pbOffice.TagUser{
|
|
UserID: userID,
|
|
UserName: userName,
|
|
})
|
|
}
|
|
resp.Tag.TagID = tag.TagID
|
|
resp.Tag.TagName = tag.TagName
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) CreateOneWorkMoment(_ context.Context, req *pbOffice.CreateOneWorkMomentReq) (resp *pbOffice.CreateOneWorkMomentResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.CreateOneWorkMomentResp{CommonResp: &pbOffice.CommonResp{}}
|
|
workMoment := db.WorkMoment{
|
|
Comments: []*db.Comment{},
|
|
LikeUserList: []*db.WorkMomentUser{},
|
|
PermissionUserList: []*db.WorkMomentUser{},
|
|
}
|
|
createUser, err := imdb.GetUserByUserID(req.WorkMoment.UserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserByUserID", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
if err := utils.CopyStructFields(&workMoment, req.WorkMoment); err != nil {
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
|
}
|
|
workMoment.UserName = createUser.Nickname
|
|
workMoment.FaceURL = createUser.FaceURL
|
|
workMoment.PermissionUserIDList = s.getPermissionUserIDList(req.OperationID, req.WorkMoment.PermissionGroupList, req.WorkMoment.PermissionUserList)
|
|
workMoment.PermissionUserList = []*db.WorkMomentUser{}
|
|
for _, userID := range workMoment.PermissionUserIDList {
|
|
userName, err := imdb.GetUserNameByUserID(userID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserNameByUserID failed", err.Error())
|
|
continue
|
|
}
|
|
workMoment.PermissionUserList = append(workMoment.PermissionUserList, &db.WorkMomentUser{
|
|
UserID: userID,
|
|
UserName: userName,
|
|
})
|
|
}
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "workMoment to create", workMoment)
|
|
err = db.DB.CreateOneWorkMoment(&workMoment)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "CreateOneWorkMoment", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
|
|
// send notification to at users
|
|
for _, atUser := range req.WorkMoment.AtUserList {
|
|
workMomentNotificationMsg := &pbOffice.WorkMomentNotificationMsg{
|
|
NotificationMsgType: constant.WorkMomentAtUserNotification,
|
|
WorkMomentID: workMoment.WorkMomentID,
|
|
WorkMomentContent: workMoment.Content,
|
|
UserID: workMoment.UserID,
|
|
FaceURL: createUser.FaceURL,
|
|
UserName: createUser.Nickname,
|
|
CreateTime: workMoment.CreateTime,
|
|
}
|
|
msg.WorkMomentSendNotification(req.OperationID, atUser.UserID, workMomentNotificationMsg)
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) DeleteComment(_ context.Context, req *pbOffice.DeleteCommentReq) (resp *pbOffice.DeleteCommentResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.DeleteCommentResp{CommonResp: &pbOffice.CommonResp{}}
|
|
err = db.DB.DeleteComment(req.WorkMomentID, req.ContentID, req.OpUserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetWorkMomentByID failed", err.Error())
|
|
resp.CommonResp.ErrMsg = constant.ErrDB.ErrMsg
|
|
resp.CommonResp.ErrCode = constant.ErrDB.ErrCode
|
|
return resp, nil
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
// count and distinct permission users
|
|
func (s *officeServer) getPermissionUserIDList(operationID string, groupList []*pbOffice.PermissionGroup, userList []*pbOffice.WorkMomentUser) []string {
|
|
var permissionUserIDList []string
|
|
for _, group := range groupList {
|
|
groupMemberIDList, err := imdb.GetGroupMemberIDListByGroupID(group.GroupID)
|
|
if err != nil {
|
|
log.NewError(operationID, utils.GetSelfFuncName(), "GetGroupMemberIDListByGroupID failed", group, err.Error())
|
|
continue
|
|
}
|
|
log.NewDebug(operationID, utils.GetSelfFuncName(), "groupMemberIDList: ", groupMemberIDList)
|
|
permissionUserIDList = append(permissionUserIDList, groupMemberIDList...)
|
|
}
|
|
var userIDList []string
|
|
for _, user := range userList {
|
|
userIDList = append(userIDList, user.UserID)
|
|
}
|
|
permissionUserIDList = append(permissionUserIDList, userIDList...)
|
|
permissionUserIDList = utils.RemoveRepeatedStringInList(permissionUserIDList)
|
|
return permissionUserIDList
|
|
}
|
|
|
|
func (s *officeServer) DeleteOneWorkMoment(_ context.Context, req *pbOffice.DeleteOneWorkMomentReq) (resp *pbOffice.DeleteOneWorkMomentResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.DeleteOneWorkMomentResp{CommonResp: &pbOffice.CommonResp{}}
|
|
workMoment, err := db.DB.GetWorkMomentByID(req.WorkMomentID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetWorkMomentByID failed", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "workMoment", workMoment)
|
|
if workMoment.UserID != req.UserID {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "workMoment.UserID != req.WorkMomentID, delete failed", workMoment, req.WorkMomentID)
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
err = db.DB.DeleteOneWorkMoment(req.WorkMomentID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "DeleteOneWorkMoment", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func isUserCanSeeWorkMoment(userID string, workMoment db.WorkMoment) bool {
|
|
if userID != workMoment.UserID {
|
|
switch workMoment.Permission {
|
|
case constant.WorkMomentPublic:
|
|
return true
|
|
case constant.WorkMomentPrivate:
|
|
return false
|
|
case constant.WorkMomentPermissionCanSee:
|
|
return utils.IsContain(userID, workMoment.PermissionUserIDList)
|
|
case constant.WorkMomentPermissionCantSee:
|
|
return !utils.IsContain(userID, workMoment.PermissionUserIDList)
|
|
}
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (s *officeServer) LikeOneWorkMoment(_ context.Context, req *pbOffice.LikeOneWorkMomentReq) (resp *pbOffice.LikeOneWorkMomentResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.LikeOneWorkMomentResp{CommonResp: &pbOffice.CommonResp{}}
|
|
user, err := imdb.GetUserByUserID(req.UserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserNameByUserID failed", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
workMoment, like, err := db.DB.LikeOneWorkMoment(req.UserID, user.Nickname, req.WorkMomentID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "LikeOneWorkMoment failed ", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
workMomentNotificationMsg := &pbOffice.WorkMomentNotificationMsg{
|
|
NotificationMsgType: constant.WorkMomentLikeNotification,
|
|
WorkMomentID: workMoment.WorkMomentID,
|
|
WorkMomentContent: workMoment.Content,
|
|
UserID: user.UserID,
|
|
FaceURL: user.FaceURL,
|
|
UserName: user.Nickname,
|
|
CreateTime: int32(time.Now().Unix()),
|
|
}
|
|
// send notification
|
|
if like && workMoment.UserID != req.UserID {
|
|
msg.WorkMomentSendNotification(req.OperationID, workMoment.UserID, workMomentNotificationMsg)
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) CommentOneWorkMoment(_ context.Context, req *pbOffice.CommentOneWorkMomentReq) (resp *pbOffice.CommentOneWorkMomentResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.CommentOneWorkMomentResp{CommonResp: &pbOffice.CommonResp{}}
|
|
commentUser, err := imdb.GetUserByUserID(req.UserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserNameByUserID commentUserName failed", req.UserID, err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
var replyUserName string
|
|
if req.ReplyUserID != "" {
|
|
replyUserName, err = imdb.GetUserNameByUserID(req.ReplyUserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserNameByUserID get replyUserName failed", req.ReplyUserID, err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
}
|
|
comment := &db.Comment{
|
|
UserID: req.UserID,
|
|
UserName: commentUser.Nickname,
|
|
ReplyUserID: req.ReplyUserID,
|
|
ReplyUserName: replyUserName,
|
|
Content: req.Content,
|
|
CreateTime: int32(time.Now().Unix()),
|
|
}
|
|
workMoment, err := db.DB.CommentOneWorkMoment(comment, req.WorkMomentID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "CommentOneWorkMoment failed", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
workMomentNotificationMsg := &pbOffice.WorkMomentNotificationMsg{
|
|
NotificationMsgType: constant.WorkMomentCommentNotification,
|
|
WorkMomentID: workMoment.WorkMomentID,
|
|
WorkMomentContent: workMoment.Content,
|
|
UserID: commentUser.UserID,
|
|
FaceURL: commentUser.FaceURL,
|
|
UserName: commentUser.Nickname,
|
|
ReplyUserID: comment.ReplyUserID,
|
|
ReplyUserName: comment.ReplyUserName,
|
|
ContentID: comment.ContentID,
|
|
Content: comment.Content,
|
|
CreateTime: comment.CreateTime,
|
|
}
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "msg: ", *workMomentNotificationMsg)
|
|
if req.UserID != workMoment.UserID {
|
|
msg.WorkMomentSendNotification(req.OperationID, workMoment.UserID, workMomentNotificationMsg)
|
|
}
|
|
if req.ReplyUserID != "" && req.ReplyUserID != workMoment.UserID && req.ReplyUserID != req.UserID {
|
|
msg.WorkMomentSendNotification(req.OperationID, req.ReplyUserID, workMomentNotificationMsg)
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) GetWorkMomentByID(_ context.Context, req *pbOffice.GetWorkMomentByIDReq) (resp *pbOffice.GetWorkMomentByIDResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.GetWorkMomentByIDResp{
|
|
WorkMoment: &pbOffice.WorkMoment{},
|
|
CommonResp: &pbOffice.CommonResp{},
|
|
}
|
|
workMoment, err := db.DB.GetWorkMomentByID(req.WorkMomentID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetWorkMomentByID failed", err.Error())
|
|
return resp, nil
|
|
}
|
|
canSee := isUserCanSeeWorkMoment(req.OpUserID, *workMoment)
|
|
log.Debug(req.OperationID, utils.GetSelfFuncName(), canSee, req.OpUserID, *workMoment)
|
|
if !canSee {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "workMoments not access to user", canSee, workMoment, req.OpUserID)
|
|
}
|
|
|
|
if err := utils.CopyStructFields(resp.WorkMoment, workMoment); err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields", err.Error())
|
|
}
|
|
user, err := imdb.GetUserByUserID(workMoment.UserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserByUserID failed", err.Error())
|
|
}
|
|
if user != nil {
|
|
resp.WorkMoment.FaceURL = user.FaceURL
|
|
resp.WorkMoment.UserName = user.Nickname
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) GetUserWorkMoments(_ context.Context, req *pbOffice.GetUserWorkMomentsReq) (resp *pbOffice.GetUserWorkMomentsResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.GetUserWorkMomentsResp{CommonResp: &pbOffice.CommonResp{}, WorkMoments: []*pbOffice.WorkMoment{}}
|
|
resp.Pagination = &pbCommon.ResponsePagination{CurrentPage: req.Pagination.PageNumber, ShowNumber: req.Pagination.ShowNumber}
|
|
var workMoments []db.WorkMoment
|
|
if req.UserID == req.OpUserID {
|
|
workMoments, err = db.DB.GetUserSelfWorkMoments(req.UserID, req.Pagination.ShowNumber, req.Pagination.PageNumber)
|
|
} else {
|
|
friendIDList, err := rocksCache.GetFriendIDListFromCache(req.UserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserFriendWorkMoments", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}
|
|
return resp, nil
|
|
}
|
|
workMoments, err = db.DB.GetUserWorkMoments(req.OpUserID, req.UserID, req.Pagination.ShowNumber, req.Pagination.PageNumber, friendIDList)
|
|
}
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserWorkMoments failed", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
if err := utils.CopyStructFields(&resp.WorkMoments, workMoments); err != nil {
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
|
}
|
|
for _, v := range resp.WorkMoments {
|
|
user, err := imdb.GetUserByUserID(v.UserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error())
|
|
}
|
|
if user != nil {
|
|
v.UserName = user.Nickname
|
|
v.FaceURL = user.FaceURL
|
|
}
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) GetUserFriendWorkMoments(_ context.Context, req *pbOffice.GetUserFriendWorkMomentsReq) (resp *pbOffice.GetUserFriendWorkMomentsResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.GetUserFriendWorkMomentsResp{CommonResp: &pbOffice.CommonResp{}, WorkMoments: []*pbOffice.WorkMoment{}}
|
|
resp.Pagination = &pbCommon.ResponsePagination{CurrentPage: req.Pagination.PageNumber, ShowNumber: req.Pagination.ShowNumber}
|
|
var friendIDList []string
|
|
if config.Config.WorkMoment.OnlyFriendCanSee {
|
|
friendIDList, err = rocksCache.GetFriendIDListFromCache(req.UserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserFriendWorkMoments", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}
|
|
return resp, nil
|
|
}
|
|
}
|
|
workMoments, err := db.DB.GetUserFriendWorkMoments(req.Pagination.ShowNumber, req.Pagination.PageNumber, req.UserID, friendIDList)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetUserFriendWorkMoments", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
if err := utils.CopyStructFields(&resp.WorkMoments, workMoments); err != nil {
|
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
|
}
|
|
for _, v := range resp.WorkMoments {
|
|
user, err := rocksCache.GetUserInfoFromCache(v.UserID)
|
|
if err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error())
|
|
}
|
|
if user != nil {
|
|
v.UserName = user.Nickname
|
|
v.FaceURL = user.FaceURL
|
|
}
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) SetUserWorkMomentsLevel(_ context.Context, req *pbOffice.SetUserWorkMomentsLevelReq) (resp *pbOffice.SetUserWorkMomentsLevelResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.SetUserWorkMomentsLevelResp{CommonResp: &pbOffice.CommonResp{}}
|
|
if err := db.DB.SetUserWorkMomentsLevel(req.UserID, req.Level); err != nil {
|
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetUserWorkMomentsLevel failed", err.Error())
|
|
resp.CommonResp = &pbOffice.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}
|
|
return resp, nil
|
|
}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *officeServer) ChangeWorkMomentPermission(_ context.Context, req *pbOffice.ChangeWorkMomentPermissionReq) (resp *pbOffice.ChangeWorkMomentPermissionResp, err error) {
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req.String())
|
|
resp = &pbOffice.ChangeWorkMomentPermissionResp{CommonResp: &pbOffice.CommonResp{}}
|
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp.String())
|
|
return resp, nil
|
|
}
|