This repository has been archived by the owner on Jun 22, 2023. It is now read-only.
/
mongodb_client.go
107 lines (87 loc) · 3.29 KB
/
mongodb_client.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
95
96
97
98
99
100
101
102
103
104
105
106
107
package client
import (
"context"
"errors"
"log"
"github.com/jinwoo1225/random-dice/internal/config"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var (
ErrFailedToConvertToObjectID = errors.New("failed to convert to object id")
)
type MongoDBClient interface {
InsertOne(ctx context.Context, database string, collection string, data interface{}) (*primitive.ObjectID, error)
FindOne(ctx context.Context, database string, collection string, filter interface{}) *mongo.SingleResult
FindMany(ctx context.Context, database string, collection string, filter interface{}, orderBy interface{}, page int64, limit int64) (*mongo.Cursor, error)
UpdateOne(ctx context.Context, database string, collection string, filter interface{}, update interface{}) (*mongo.UpdateResult, error)
DeleteOne(ctx context.Context, database string, collection string, filter interface{}) (*mongo.DeleteResult, error)
}
type DefaultMongoDBClient struct {
client *mongo.Client
}
func NewMongoDBClient(ctx context.Context, conf *config.Config) (*DefaultMongoDBClient, func(), error) {
opts := options.Client()
opts.ApplyURI(conf.MongoDB.Host)
opts.SetAuth(options.Credential{
AuthMechanism: "",
AuthMechanismProperties: nil,
AuthSource: "",
Username: conf.MongoDB.Username,
Password: conf.MongoDB.Password,
PasswordSet: true,
})
client, err := mongo.Connect(ctx, opts)
if err != nil {
return nil, func() {}, err
}
if err := client.Ping(ctx, nil); err != nil {
return nil, func() {}, err
}
cleanUpFunc := func() {
if err = client.Disconnect(ctx); err != nil {
log.Println(err)
}
}
return &DefaultMongoDBClient{client: client}, cleanUpFunc, nil
}
func (c *DefaultMongoDBClient) InsertOne(ctx context.Context, database string, collection string, data interface{}) (*primitive.ObjectID, error) {
res, err := c.client.Database(database).Collection(collection).InsertOne(ctx, data)
if err != nil {
return nil, err
}
v, ok := res.InsertedID.(primitive.ObjectID)
if !ok {
return nil, ErrFailedToConvertToObjectID
}
return &v, nil
}
func (c *DefaultMongoDBClient) FindOne(ctx context.Context, database string, collection string, filter interface{}) *mongo.SingleResult {
return c.client.Database(database).Collection(collection).FindOne(ctx, filter, nil)
}
func (c *DefaultMongoDBClient) FindMany(
ctx context.Context,
database string,
collection string,
filter interface{},
orderBy interface{},
page int64,
limit int64,
) (*mongo.Cursor, error) {
opts := options.Find()
opts.Limit = &limit
opts.Skip = &page
opts.SetSort(orderBy)
res, err := c.client.Database(database).Collection(collection).Find(ctx, filter, opts)
if err != nil {
return nil, err
}
return res, nil
}
func (c *DefaultMongoDBClient) UpdateOne(ctx context.Context, database string, collection string, filter interface{}, update interface{}) (*mongo.UpdateResult, error) {
return c.client.Database(database).Collection(collection).UpdateOne(ctx, filter, update)
}
func (c *DefaultMongoDBClient) DeleteOne(ctx context.Context, database string, collection string, filter interface{}) (*mongo.DeleteResult, error) {
return c.client.Database(database).Collection(collection).DeleteOne(ctx, filter)
}