/
create_transfer.go
75 lines (62 loc) · 1.79 KB
/
create_transfer.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
package repository
import (
"context"
"github.com/GSabadini/golang-clean-architecture/domain/entity"
"github.com/GSabadini/golang-clean-architecture/infrastructure/database"
"github.com/pkg/errors"
"go.mongodb.org/mongo-driver/mongo"
)
type (
// Bson Data
createTransferBSON struct {
ID string `bson:"id"`
PayerID string `bson:"payer"`
PayeeID string `bson:"payee"`
Value int64 `bson:"value"`
CreatedAt string `bson:"created_at"`
}
createTransferRepository struct {
handler *database.MongoHandler
collection string
}
)
// NewCreateTransferRepository creates new createTransferRepository with its dependencies
func NewCreateTransferRepository(handler *database.MongoHandler) entity.TransferRepositoryCreator {
return createTransferRepository{
handler: handler,
collection: "transfers",
}
}
// Create performs insertOne into the database
func (c createTransferRepository) Create(ctx context.Context, t entity.Transfer) error {
var bson = createTransferBSON{
ID: t.ID().Value(),
PayerID: t.Payer().Value(),
PayeeID: t.Payee().Value(),
Value: t.Value().Amount().Value(),
CreatedAt: t.CreatedAt().String(),
}
if _, err := c.handler.Db().Collection(c.collection).InsertOne(ctx, bson); err != nil {
return errors.Wrap(err, entity.ErrCreateTransfer.Error())
}
return nil
}
func (c createTransferRepository) WithTransaction(ctx context.Context, fn func(context.Context) error) error {
callback := func(sessCtx mongo.SessionContext) (interface{}, error) {
err := fn(sessCtx)
if err != nil {
return nil, err
}
return nil, nil
}
session, err := c.handler.Client().StartSession()
if err != nil {
return err
}
defer session.EndSession(ctx)
_, err = session.WithTransaction(ctx, callback)
if err != nil {
return err
}
return nil
}