/
sql.go
80 lines (66 loc) · 1.63 KB
/
sql.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
package storage
import (
"time"
"github.com/samber/lo"
"gorm.io/gorm"
"github.com/ezquant/azbot/azbot/model"
)
type SQL struct {
db *gorm.DB
}
// FromSQL creates a new SQL connections for orders storage. Example of usage:
//
// import "github.com/glebarez/sqlite"
// storage, err := storage.FromSQL(sqlite.Open("sqlite.db"), &gorm.Config{})
// if err != nil {
// log.Fatal(err)
// }
func FromSQL(dialect gorm.Dialector, opts ...gorm.Option) (Storage, error) {
db, err := gorm.Open(dialect, opts...)
if err != nil {
return nil, err
}
sqlDB, err := db.DB()
if err != nil {
return nil, err
}
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Hour)
err = db.AutoMigrate(&model.Order{})
if err != nil {
return nil, err
}
return &SQL{
db: db,
}, nil
}
// CreateOrder creates a new order in a SQL database
func (s *SQL) CreateOrder(order *model.Order) error {
result := s.db.Create(order) // pass pointer of data to Create
return result.Error
}
// UpdateOrder updates a given order
func (s *SQL) UpdateOrder(order *model.Order) error {
o := model.Order{ID: order.ID}
s.db.First(&o)
o = *order
result := s.db.Save(&o)
return result.Error
}
// Orders filter a list of orders given a filter
func (s *SQL) Orders(filters ...OrderFilter) ([]*model.Order, error) {
orders := make([]*model.Order, 0)
result := s.db.Find(&orders)
if result.Error != nil && result.Error != gorm.ErrRecordNotFound {
return orders, nil
}
return lo.Filter(orders, func(order *model.Order, _ int) bool {
for _, filter := range filters {
if !filter(*order) {
return false
}
}
return true
}), nil
}