-
Notifications
You must be signed in to change notification settings - Fork 0
/
reporegistry.go
88 lines (72 loc) · 1.83 KB
/
reporegistry.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
package repository
import (
"context"
"database/sql"
"github.com/vadiminshakov/dddgo/core/domain/aggregates"
"github.com/vadiminshakov/dddgo/core/domain/vos"
)
// driven port
type BasketRepository interface {
// GetByID returns basket by ID
GetByID(id int64) (*aggregates.Basket, error)
// Save сохраняет корзину
Save(basket *aggregates.Basket) error
}
// driven port
type ItemsRepository interface {
// GetBasketItems returns items in basket
GetByBasketID(id int64) (*vos.BasketItem, error)
// Save saves one item in basket
Save(basket *vos.BasketItem) error
}
type Outbox interface {
Save(key string, value []byte) error
}
type RepositoryRegistry interface {
Basket() BasketRepository
Items() ItemsRepository
Outbox() Outbox
Transaction(ctx context.Context, fn func(repo RepositoryRegistry) error) error
TxManager() TxManagerRepository
}
type RepoRegistry struct {
db *sql.DB
tx Tx
}
func New(db *sql.DB, tx Tx) (*RepoRegistry, error) {
if tx == nil {
return &RepoRegistry{tx: db, db: db}, nil
}
return &RepoRegistry{db: db, tx: tx}, nil
}
func (r *RepoRegistry) Basket() BasketRepository {
return NewBasketRepo(r.db, r.tx)
}
func (r *RepoRegistry) Items() ItemsRepository {
return NewItemsRepo(r.db, r.tx)
}
func (r *RepoRegistry) Transaction(ctx context.Context, fn func(repo *RepoRegistry) error) error {
tx, err := r.db.BeginTx(ctx, nil)
if err != nil {
return err
}
newrepo, err := New(r.db, tx)
if err != nil {
return err
}
if err := fn(newrepo); err != nil {
if err := tx.Rollback(); err != nil {
return err
}
return err
}
if err := tx.Commit(); err != nil {
return err
}
return err
}
type Tx interface {
Exec(query string, args ...interface{}) (sql.Result, error)
Query(query string, args ...interface{}) (*sql.Rows, error)
QueryRow(query string, args ...interface{}) *sql.Row
}