/
mongoclient.go
94 lines (77 loc) · 2.74 KB
/
mongoclient.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Copyright 2021 Mia srl
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package mongoclient
import (
"context"
"fmt"
"time"
"github.com/rond-authz/rond/logging"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
"go.mongodb.org/mongo-driver/x/mongo/driver/connstring"
)
type MongoClient struct {
client *mongo.Client
databaseName string
}
const STATE string = "__STATE__"
const PUBLIC string = "PUBLIC"
type ConnectionOpts struct {
MaxIdleTimeMs int
}
// NewMongoClient tries to setup a new MongoClient instance.
// The function returns a `nil` client if the environment variable `MongoDBUrl` is not specified.
func NewMongoClient(logger logging.Logger, mongodbURL string, connectionOptions ConnectionOpts) (*MongoClient, error) {
if mongodbURL == "" {
logger.Info("No MongoDB configuration provided, skipping setup")
return nil, nil
}
logger.Trace("Start MongoDB client set up")
parsedConnectionString, err := connstring.ParseAndValidate(mongodbURL)
if err != nil {
return nil, fmt.Errorf("failed MongoDB connection string validation: %s", err.Error())
}
clientOpts := options.Client().ApplyURI(mongodbURL)
if connectionOptions.MaxIdleTimeMs != 0 {
clientOpts = clientOpts.SetMaxConnIdleTime(time.Duration(connectionOptions.MaxIdleTimeMs) * time.Millisecond)
}
client, err := mongo.Connect(context.Background(), clientOpts)
if err != nil {
return nil, fmt.Errorf("error connecting to MongoDB: %s", err.Error())
}
ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second)
defer cancelFn()
if err = client.Ping(ctx, readpref.Primary()); err != nil {
return nil, fmt.Errorf("error verifying MongoDB connection: %s", err.Error())
}
mongoClient := MongoClient{
client: client,
databaseName: parsedConnectionString.Database,
}
logger.Info("MongoDB client set up completed")
return &mongoClient, nil
}
func (m *MongoClient) Collection(collectionName string) *mongo.Collection {
if m != nil {
return m.client.Database(m.databaseName).Collection(collectionName)
}
return nil
}
func (mongoClient *MongoClient) Disconnect() error {
if mongoClient != nil {
return mongoClient.client.Disconnect(context.Background())
}
return nil
}