-
Notifications
You must be signed in to change notification settings - Fork 116
/
repository.go
91 lines (81 loc) · 2.44 KB
/
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
84
85
86
87
88
89
90
91
package orderqueryrepository
import (
"context"
"database/sql"
"github.com/shijuvar/go-distributed-sys/eventstream/order"
)
type repository struct {
db *sql.DB
}
// New returns a concrete repository backed by CockroachDB
func New(db *sql.DB) (order.QueryRepository, error) {
// return repository
return &repository{
db: db,
}, nil
}
// GetOrderByID query the Orders by given id
func (repo *repository) GetOrderByID(ctx context.Context, id string) (order.Order, error) {
var orderRow = order.Order{}
if err := repo.db.QueryRowContext(ctx,
"SELECT id, customerid, status, createdon, restaurantid FROM orders WHERE id = $1",
id).
Scan(
&orderRow.ID, &orderRow.CustomerID, &orderRow.Status, &orderRow.CreatedOn, &orderRow.RestaurantId,
); err != nil {
return orderRow, err
}
return orderRow, nil
}
// GetOrderItems query the order items by given order id
func (repo *repository) GetOrderItems(ctx context.Context, id string) ([]order.OrderItem, error) {
rows, err := repo.db.QueryContext(ctx,
"SELECT code, name, unitprice, quantity FROM orderitems WHERE orderid = $1", id)
if err != nil {
return nil, err
}
defer rows.Close()
// An OrderItem slice to hold data from returned rows.
var oitems []order.OrderItem
// Loop through rows, using Scan to assign column data to struct fields.
for rows.Next() {
var item order.OrderItem
if err := rows.Scan(&item.ProductCode, &item.Name, &item.UnitPrice,
&item.Quantity); err != nil {
return oitems, err
}
oitems = append(oitems, item)
}
if err = rows.Err(); err != nil {
return oitems, err
}
return oitems, nil
}
// GetOrdersByCustomer query the orders by given customer id
func (repo *repository) GetOrdersByCustomer(ctx context.Context, cid string) ([]order.Order, error) {
rows, err := repo.db.QueryContext(ctx,
"SELECT id, status, createdon, restaurantid, amount FROM orderitems WHERE orderid = $1", cid)
if err != nil {
return nil, err
}
defer rows.Close()
// An Order slice to hold data from returned rows.
var orders []order.Order
// Loop through rows, using Scan to assign column data to struct fields.
for rows.Next() {
var o order.Order
if err := rows.Scan(&o.ID, &o.Status, &o.CreatedOn,
&o.RestaurantId, o.Amount); err != nil {
return orders, err
}
orders = append(orders, o)
}
if err = rows.Err(); err != nil {
return orders, err
}
return orders, nil
}
// Close implements DB.Close
func (repo *repository) Close() error {
return repo.db.Close()
}