/
todomongo.go
113 lines (86 loc) · 2.47 KB
/
todomongo.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
108
109
110
111
112
113
package repository
import (
"context"
"github.com/shandysiswandi/echo-service/internal/domain"
"github.com/shandysiswandi/echo-service/internal/domain/port"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
)
type todoMongo struct {
db *mongo.Database
}
func NewTodoMongo(dbm *mongo.Database) port.TodoRepository {
return &todoMongo{dbm}
}
func (tdm *todoMongo) Fetch(ctx context.Context) ([]*domain.Todo, error) {
table := domain.Todo{}.TableName()
results := make([]*domain.Todo, 0)
filter := bson.D{}
cur, err := tdm.db.Collection(table).Find(ctx, filter)
if err != nil {
return nil, err
}
defer cur.Close(ctx)
err = cur.All(ctx, &results)
if err != nil {
return nil, err
}
return results, nil
}
func (tdm *todoMongo) GetByID(ctx context.Context, id string) (*domain.Todo, error) {
result := &domain.Todo{}
table := result.TableName()
filter := bson.M{"id": id}
err := tdm.db.Collection(table).FindOne(ctx, filter).Decode(result)
if err != nil && err != mongo.ErrNoDocuments {
return nil, err
}
if err == mongo.ErrNoDocuments {
return nil, domain.ErrTodoNotFound
}
return result, nil
}
func (tdm *todoMongo) Create(ctx context.Context, data domain.Todo) error {
table := data.TableName()
if _, err := tdm.db.Collection(table).InsertOne(ctx, &data); err != nil {
return err
}
return nil
}
func (tdm *todoMongo) UpdateByID(ctx context.Context, data domain.Todo) error {
table := data.TableName()
filter := bson.M{"id": data.ID}
update := bson.M{"$set": data}
sr := tdm.db.Collection(table).FindOneAndUpdate(ctx, filter, update)
if sr.Err() != nil && sr.Err() != mongo.ErrNoDocuments {
return sr.Err()
}
if sr.Err() == mongo.ErrNoDocuments {
return domain.ErrTodoNotFound
}
return nil
}
func (tdm *todoMongo) ReplaceByID(ctx context.Context, data domain.Todo) error {
table := data.TableName()
filter := bson.M{"id": data.ID}
sr := tdm.db.Collection(table).FindOneAndReplace(ctx, filter, data)
if sr.Err() != nil && sr.Err() != mongo.ErrNoDocuments {
return sr.Err()
}
if sr.Err() == mongo.ErrNoDocuments {
return domain.ErrTodoNotFound
}
return nil
}
func (tdm *todoMongo) DeleteByID(ctx context.Context, id string) error {
table := domain.Todo{}.TableName()
filter := bson.M{"id": id}
sr := tdm.db.Collection(table).FindOneAndDelete(ctx, filter)
if sr.Err() != nil && sr.Err() != mongo.ErrNoDocuments {
return sr.Err()
}
if sr.Err() == mongo.ErrNoDocuments {
return domain.ErrTodoNotFound
}
return nil
}