-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathdatabase.go
More file actions
65 lines (49 loc) · 2.06 KB
/
database.go
File metadata and controls
65 lines (49 loc) · 2.06 KB
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
package database
import (
"context"
"os"
"strings"
"testing"
"time"
"github.com/computersciencehouse/vote/logging"
"github.com/sirupsen/logrus"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
type UpsertResult int
const (
New UpsertResult = 0
Updated UpsertResult = 1
)
var Client *mongo.Client = Connect()
var db = ""
func Connect() *mongo.Client {
// This always gets invoked on initialisation. bad! it'd be nice if we only did this setup in main rather than components under test. for now we just skip if testing
if testing.Testing() {
logging.Logger.WithFields(logrus.Fields{"module": "database", "method": "Connect"}).Info("testing, not doing db connection, someone should mock this someday")
return nil
}
logging.Logger.WithFields(logrus.Fields{"module": "database", "method": "Connect"}).Info("beginning database connection")
ctx, cancel := context.WithTimeout(context.TODO(), 10*time.Second)
defer cancel()
uri := os.Getenv("VOTE_MONGODB_URI")
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
if err != nil {
logging.Logger.WithFields(logrus.Fields{"error": err, "module": "database", "method": "Connect"}).Fatal("error connecting to database")
}
if err = client.Ping(ctx, readpref.Primary()); err != nil {
logging.Logger.WithFields(logrus.Fields{"error": err, "module": "database", "method": "Connect"}).Fatal("error pinging database")
}
logging.Logger.WithFields(logrus.Fields{"module": "database", "method": "Connect"}).Info("connected to mongodb")
db = strings.Split(strings.Split(uri, "/")[3], "?")[0]
return client
}
func Disconnect() {
ctx, cancel := context.WithTimeout(context.TODO(), 10*time.Second)
defer cancel()
if err := Client.Disconnect(ctx); err != nil {
logging.Logger.WithFields(logrus.Fields{"error": err, "module": "database", "method": "Disconnect"}).Fatal("error disconnecting from database")
}
logging.Logger.WithFields(logrus.Fields{"module": "database", "method": "Disconnect"}).Info("disconnected from database")
}