treasurer/dal/mongo.go
2023-05-16 19:21:56 +03:00

140 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package dal
import (
//"bitbucket.org/skeris/bbfoundation/sse"
"context"
"strings"
"time"
"github.com/themakers/hlog"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
//#region ======== Data Access Layer structs ========
// MongoConnection - Constructor LayerMongoDb
type MongoConnection struct {
conn *mongo.Client // Mongo connected pairCache
hl hlog.Logger // HLogger for Data Access Layer
opts MongoDbOptions // Database options
db *mongo.Database // Database
coll map[string]*mongo.Collection // Collections map
}
// MongoDbOptions - Connect params
type MongoDbOptions struct {
DalName string // Name of the Data Access Layer
URI string // MongoDB URI
DbTable string // MongoDB name
Collections string // MongoDB list collection names
}
//#endregion
//#region ======== Data Access Layer Constructor ========
// CreateMongo подключается к MongoDB.
//
// Input:
// ctx - Application context
// hlogger - Application logger
// opts - Application options for MongoDB
//
// Return: MongoConnection, error
//
// Logger:
// ErrorDalNewClient - mongo.NewClient return error
// ErrorDalUnableToConnect - Unable to connect to MongoDB
// InfoDalConnected - Successfully connected to MongoDB
func CreateMongo(ctx context.Context, hlogger hlog.Logger, opts MongoDbOptions) (*MongoConnection, error) {
hlogger = hlogger.With(opts)
conn, err := mongo.NewClient(options.Client().ApplyURI(opts.URI))
if err != nil {
hlogger.Emit(ErrorDalNewClient{err})
return nil, err
}
ctxTO, cancel := context.WithTimeout(ctx, 10*time.Second)
defer cancel()
err = conn.Connect(ctxTO)
if err != nil {
hlogger.Emit(ErrorDalUnableToConnect{err})
}
collections := map[string]*mongo.Collection{}
for _, name := range strings.Split(opts.Collections, ",") {
collections[name] = conn.Database(opts.DbTable).Collection(name)
}
mongoConn := &MongoConnection{
conn: conn,
hl: hlogger,
opts: opts,
db: conn.Database(opts.DbTable),
coll: collections,
}
_, err = mongoConn.Ping(ctx)
if err == nil {
hlogger.Emit(InfoDalConnected{})
}
return mongoConn, err
}
//#endregion
//#region ======== Data Access Layer functions ========
// DisconnectFromDb разрывает соединение с MongoDB
//
// Return: error
//
// Logger:
// ErrorDalDisconnectFailure - Something is wrong
// InfoDalDisconnected - Successfully disconnected from MongoDB
func (mc *MongoConnection) DisconnectFromDb() error {
err := mc.conn.Disconnect(context.TODO())
if err != nil {
mc.hl.Emit(ErrorDalDisconnectFailure{err})
}
mc.hl.Emit(InfoDalDisconnected{})
return err
}
// Ping пингует соединение MongoDB.
//
// Return:
// int64 - ping delay in milliseconds
// error
//
// Logger:
// ErrorDalPingFailed - Ping received an error
// InfoDalPing - Ping delay in milliseconds
func (mc *MongoConnection) Ping(ctx context.Context) (int64, error) {
start := time.Now()
err := mc.conn.Ping(ctx, readpref.Primary())
delay := time.Since(start).Milliseconds()
if err != nil {
mc.hl.Emit(ErrorDalPingFailed{err})
} else {
mc.hl.Emit(InfoDalPing{delay})
}
return delay, err
}
//#endregion