-
Notifications
You must be signed in to change notification settings - Fork 0
/
mongo_repository.go
83 lines (65 loc) · 1.78 KB
/
mongo_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
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
package repositories
import (
"errors"
"github.com/kamva/mgm/v3"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
)
type MongoRepository struct {
model string
}
func (r *MongoRepository) Model(model string) {
r.model = model
}
func (r *MongoRepository) Transaction(f Transaction) error {
return mgm.TransactionWithCtx(mgm.Ctx(), func(session mongo.Session, context mongo.SessionContext) error {
if err := f(r); err != nil {
return session.AbortTransaction(context)
}
return session.CommitTransaction(context)
})
}
func (r *MongoRepository) Create(v interface{}) error {
model, ok := v.(mgm.Model)
if !ok {
return errors.New("invalid model")
}
return mgm.Coll(model).Create(model)
}
func (r *MongoRepository) Update(v interface{}) error {
model, ok := v.(mgm.Model)
if !ok {
return errors.New("invalid model")
}
return mgm.Coll(model).Update(model)
}
func (r *MongoRepository) Bind(v interface{}, id string) error {
model, ok := v.(mgm.Model)
if !ok {
return errors.New("invalid model")
}
return mgm.Coll(model).FindByID(id, model)
}
func (r *MongoRepository) All(v interface{}) error {
return mgm.CollectionByName(r.model).SimpleFind(v, bson.D{})
}
func (r *MongoRepository) FindBy(v interface{}, filters ...Filter) error {
bFilters := make(bson.D, len(filters))
for k, f := range filters {
bFilters[k] = bson.E{
Key: f.Field,
Value: bson.M{f.Operator: f.Value},
}
}
return mgm.CollectionByName(r.model).SimpleFind(v, bFilters)
}
func (r *MongoRepository) Delete(v interface{}, id string) error {
model, ok := v.(mgm.Model)
if !ok {
return errors.New("invalid model")
}
objectID, _ := primitive.ObjectIDFromHex(id)
model.SetID(objectID)
return mgm.Coll(model).Delete(model)
}