复制项目
This commit is contained in:
110
internal/rpc/admin/start.go
Normal file
110
internal/rpc/admin/start.go
Normal file
@@ -0,0 +1,110 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
||||
"git.imall.cloud/openim/chat/pkg/common/config"
|
||||
"git.imall.cloud/openim/chat/pkg/common/constant"
|
||||
"git.imall.cloud/openim/chat/pkg/common/db/database"
|
||||
"git.imall.cloud/openim/chat/pkg/common/db/dbutil"
|
||||
"git.imall.cloud/openim/chat/pkg/common/db/table/admin"
|
||||
"git.imall.cloud/openim/chat/pkg/common/imapi"
|
||||
"git.imall.cloud/openim/chat/pkg/common/tokenverify"
|
||||
adminpb "git.imall.cloud/openim/chat/pkg/protocol/admin"
|
||||
"git.imall.cloud/openim/chat/pkg/protocol/chat"
|
||||
chatClient "git.imall.cloud/openim/chat/pkg/rpclient/chat"
|
||||
"github.com/openimsdk/tools/db/mongoutil"
|
||||
"github.com/openimsdk/tools/db/redisutil"
|
||||
"github.com/openimsdk/tools/discovery"
|
||||
"github.com/openimsdk/tools/errs"
|
||||
"github.com/openimsdk/tools/mw"
|
||||
"github.com/openimsdk/tools/utils/runtimeenv"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials/insecure"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
RpcConfig config.Admin
|
||||
RedisConfig config.Redis
|
||||
MongodbConfig config.Mongo
|
||||
Discovery config.Discovery
|
||||
Share config.Share
|
||||
|
||||
RuntimeEnv string
|
||||
}
|
||||
|
||||
func Start(ctx context.Context, config *Config, client discovery.SvcDiscoveryRegistry, server *grpc.Server) error {
|
||||
config.RuntimeEnv = runtimeenv.PrintRuntimeEnvironment()
|
||||
|
||||
if len(config.Share.ChatAdmin) == 0 {
|
||||
return errs.New("share chat admin not configured")
|
||||
}
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
rdb, err := redisutil.NewRedisClient(ctx, config.RedisConfig.Build())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
mgocli, err := mongoutil.NewMongoDB(ctx, config.MongodbConfig.Build())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var srv adminServer
|
||||
srv.Database, err = database.NewAdminDatabase(mgocli, rdb)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
srv.ChatDatabase, err = database.NewChatDatabase(mgocli, rdb)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
conn, err := client.GetConn(ctx, config.Discovery.RpcService.Chat, grpc.WithTransportCredentials(insecure.NewCredentials()), mw.GrpcClient())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
srv.Chat = chatClient.NewChatClient(chat.NewChatClient(conn))
|
||||
srv.Token = &tokenverify.Token{
|
||||
Expires: time.Duration(config.RpcConfig.TokenPolicy.Expire) * time.Hour * 24,
|
||||
Secret: config.RpcConfig.Secret,
|
||||
}
|
||||
srv.ImApiCaller = imapi.New(config.Share.OpenIM.ApiURL, config.Share.OpenIM.Secret, config.Share.OpenIM.AdminUserID)
|
||||
if err := srv.initAdmin(ctx, config.Share.ChatAdmin, config.Share.OpenIM.AdminUserID); err != nil {
|
||||
return err
|
||||
}
|
||||
adminpb.RegisterAdminServer(server, &srv)
|
||||
return nil
|
||||
}
|
||||
|
||||
type adminServer struct {
|
||||
adminpb.UnimplementedAdminServer
|
||||
Database database.AdminDatabaseInterface
|
||||
ChatDatabase database.ChatDatabaseInterface
|
||||
Chat *chatClient.ChatClient
|
||||
Token *tokenverify.Token
|
||||
ImApiCaller imapi.CallerInterface
|
||||
}
|
||||
|
||||
func (o *adminServer) initAdmin(ctx context.Context, admins []string, imUserID string) error {
|
||||
for _, account := range admins {
|
||||
if _, err := o.Database.GetAdmin(ctx, account); err == nil {
|
||||
continue
|
||||
} else if !dbutil.IsDBNotFound(err) {
|
||||
return err
|
||||
}
|
||||
sum := md5.Sum([]byte(account))
|
||||
a := admin.Admin{
|
||||
Account: account,
|
||||
UserID: imUserID,
|
||||
Password: hex.EncodeToString(sum[:]),
|
||||
Level: constant.DefaultAdminLevel,
|
||||
CreateTime: time.Now(),
|
||||
}
|
||||
if err := o.Database.AddAdminAccount(ctx, []*admin.Admin{&a}); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user