forked from EwanValentine/shippy-consignment-service
-
Notifications
You must be signed in to change notification settings - Fork 0
/
repository.go
54 lines (46 loc) · 1.9 KB
/
repository.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
package main
import (
pb "github.com/EwanValentine/shippy-consignment-service/proto/consignment"
"gopkg.in/mgo.v2"
)
const (
dbName = "shippy"
consignmentCollection = "consignments"
)
type Repository interface {
Create(*pb.Consignment) error
GetAll() ([]*pb.Consignment, error)
Close()
}
type ConsignmentRepository struct {
session *mgo.Session
}
// Create a new consignment
func (repo *ConsignmentRepository) Create(consignment *pb.Consignment) error {
return repo.collection().Insert(consignment)
}
// GetAll consignments
func (repo *ConsignmentRepository) GetAll() ([]*pb.Consignment, error) {
var consignments []*pb.Consignment
// Find normally takes a query, but as we want everything, we can nil this.
// We then bind our consignments variable by passing it as an argument to .All().
// That sets consignments to the result of the find query.
// There's also a `One()` function for single results.
err := repo.collection().Find(nil).All(&consignments)
return consignments, err
}
// Close closes the database session after each query has ran.
// Mgo creates a 'master' session on start-up, it's then good practice
// to clone a new session for each request that's made. This means that
// each request has its own database session. This is safer and more efficient,
// as under the hood each session has its own database socket and error handling.
// Using one main database socket means requests having to wait for that session.
// I.e this approach avoids locking and allows for requests to be processed concurrently. Nice!
// But... it does mean we need to ensure each session is closed on completion. Otherwise
// you'll likely build up loads of dud connections and hit a connection limit. Not nice!
func (repo *ConsignmentRepository) Close() {
repo.session.Close()
}
func (repo *ConsignmentRepository) collection() *mgo.Collection {
return repo.session.DB(dbName).C(consignmentCollection)
}