178 lines
4.4 KiB
Go
178 lines
4.4 KiB
Go
package mongox
|
|
|
|
import (
|
|
"errors"
|
|
"reflect"
|
|
"strings"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
"mongo.games.com/goserver/core/logger"
|
|
)
|
|
|
|
type DatabaseType string
|
|
|
|
const (
|
|
Global = "global"
|
|
|
|
DatabaseUser DatabaseType = "user"
|
|
DatabaseLog DatabaseType = "log"
|
|
DatabaseMonitor DatabaseType = "monitor"
|
|
)
|
|
|
|
// GetClient 获取数据库连接
|
|
// 默认获取的是 Global, log 的数据库连接
|
|
func GetClient() (*mongo.Client, error) {
|
|
if _manager == nil {
|
|
return nil, NotInitError
|
|
}
|
|
|
|
c, err := _manager.GetCollection(Global, string(DatabaseLog), "empty")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return c.Database.Client, nil
|
|
}
|
|
|
|
// GetDatabase 获取数据库
|
|
// platform: 平台id
|
|
// database: 数据库名称
|
|
func GetDatabase(platform string, database DatabaseType) (*Database, error) {
|
|
if _manager == nil {
|
|
return nil, NotInitError
|
|
}
|
|
|
|
return _manager.GetDatabase(platform, string(database))
|
|
}
|
|
|
|
func GetUserDatabase(platform string) (*Database, error) {
|
|
return GetDatabase(platform, DatabaseUser)
|
|
}
|
|
|
|
func GetLogDatabase(platform string) (*Database, error) {
|
|
return GetDatabase(platform, DatabaseLog)
|
|
}
|
|
|
|
// GetGlobalDatabase 获取全局库
|
|
// database: 数据库名称
|
|
func GetGlobalDatabase(database DatabaseType) (*Database, error) {
|
|
if _manager == nil {
|
|
return nil, NotInitError
|
|
}
|
|
|
|
return _manager.GetDatabase(Global, string(database))
|
|
}
|
|
|
|
func GetGlobalUserDatabase() (*Database, error) {
|
|
return GetGlobalDatabase(DatabaseUser)
|
|
}
|
|
|
|
func GetGlobalLogDatabase() (*Database, error) {
|
|
return GetGlobalDatabase(DatabaseLog)
|
|
}
|
|
|
|
func GetGlobalMonitorDatabase() (*Database, error) {
|
|
return GetGlobalDatabase(DatabaseMonitor)
|
|
}
|
|
|
|
// GetGlobalCollection 获取全局库
|
|
// database: 数据库名称
|
|
// collection: 集合名称
|
|
func GetGlobalCollection(database DatabaseType, collection string) (*Collection, error) {
|
|
if _manager == nil {
|
|
return nil, NotInitError
|
|
}
|
|
|
|
return _manager.GetCollection(Global, string(database), collection)
|
|
}
|
|
|
|
func GetGlobalUserCollection(collection string) (*Collection, error) {
|
|
return GetGlobalCollection(DatabaseUser, collection)
|
|
}
|
|
|
|
func GetGlobalLogCollection(collection string) (*Collection, error) {
|
|
return GetGlobalCollection(DatabaseLog, collection)
|
|
}
|
|
|
|
func GetGlobalMonitorCollection(collection string) (*Collection, error) {
|
|
return GetGlobalCollection(DatabaseMonitor, collection)
|
|
}
|
|
|
|
// GetCollection 获取平台库
|
|
// platform: 平台id
|
|
// database: 数据库名称
|
|
// collection: 集合名称
|
|
func GetCollection(platform string, database DatabaseType, collection string) (*Collection, error) {
|
|
if _manager == nil {
|
|
return nil, NotInitError
|
|
}
|
|
|
|
return _manager.GetCollection(platform, string(database), collection)
|
|
}
|
|
|
|
func GetUserCollection(platform string, collection string) (*Collection, error) {
|
|
return GetCollection(platform, DatabaseUser, collection)
|
|
}
|
|
|
|
func GetLogCollection(platform string, collection string) (*Collection, error) {
|
|
return GetCollection(platform, DatabaseLog, collection)
|
|
}
|
|
|
|
// ICollectionName 文档名称接口
|
|
type ICollectionName interface {
|
|
CollectionName() string
|
|
}
|
|
|
|
// GetCollectionName 获取文档名
|
|
func GetCollectionName(model any) string {
|
|
if m, ok := model.(ICollectionName); ok {
|
|
return m.CollectionName()
|
|
}
|
|
|
|
t := reflect.TypeOf(model)
|
|
if t.Kind() == reflect.Ptr {
|
|
t = t.Elem()
|
|
}
|
|
if t.Kind() != reflect.Struct {
|
|
panic("model must be a struct or a pointer to a struct")
|
|
}
|
|
|
|
return strings.ToLower(t.Name())
|
|
}
|
|
|
|
// IDatabaseName 数据库名称接口
|
|
type IDatabaseName interface {
|
|
DatabaseName() string
|
|
}
|
|
|
|
func GetDatabaseName(model any) (string, error) {
|
|
if m, ok := model.(IDatabaseName); ok {
|
|
return m.DatabaseName(), nil
|
|
}
|
|
|
|
return "", errors.New("not set database name")
|
|
}
|
|
|
|
// GetDao 获取文档操作接口
|
|
// key: 平台id 或 KeyGlobal
|
|
// database: 数据库类型 DatabaseType
|
|
// f: 文档接口创建函数; 结合 tools/mongoctl 使用
|
|
func GetDao[T, M any](key string, f func(database *mongo.Database, c *mongo.Collection) (T, M)) (T, error) {
|
|
var z T
|
|
t, m := f(nil, nil)
|
|
databaseName, err := GetDatabaseName(m)
|
|
if err != nil {
|
|
logger.Logger.Errorf("GetDao error: %v", err)
|
|
return z, err
|
|
}
|
|
collectionName := GetCollectionName(m)
|
|
c, err := GetCollection(key, DatabaseType(databaseName), collectionName)
|
|
if err != nil {
|
|
logger.Logger.Errorf("GetDao key:%v database:%v model:%v error: %v", key, databaseName, collectionName, err)
|
|
return z, err
|
|
}
|
|
t, _ = f(c.Database.Database, c.Collection)
|
|
return t, nil
|
|
}
|