-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathwidget_test.go
More file actions
125 lines (106 loc) · 2.96 KB
/
Copy pathwidget_test.go
File metadata and controls
125 lines (106 loc) · 2.96 KB
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
114
115
116
117
118
119
120
121
122
123
124
125
package sqx_test
import (
"context"
"database/sql"
"fmt"
"github.com/stytchauth/sqx"
)
type Widget struct {
ID string `db:"widget_id"`
Status string `db:"status"`
Enabled bool `db:"enabled"`
OwnerID *string `db:"owner_id"`
}
func (w Widget) toSetMap() (map[string]any, error) {
if w.ID == "" {
return nil, fmt.Errorf("missing ID")
}
if w.Status == "" {
return nil, fmt.Errorf("missing Status")
}
return sqx.ToSetMap(&w)
}
type dbWidget struct{}
func newDBWidget() dbWidget {
return dbWidget{}
}
func (d *dbWidget) Create(ctx context.Context, tx sqx.Queryable, w *Widget) error {
return sqx.Write(ctx).
WithQueryable(tx).
Insert("sqx_widgets_test").
SetMap(w.toSetMap()).
Do()
}
func (d *dbWidget) CreateMany(ctx context.Context, tx sqx.Queryable, ws []Widget) error {
return sqx.TypedWrite[Widget](ctx).
WithQueryable(tx).
InsertMany("sqx_widgets_test").
FromItems(ws).
Do()
}
func (d *dbWidget) Delete(ctx context.Context, tx sqx.Queryable, widgetID string) error {
return sqx.Write(ctx).
WithQueryable(tx).
Delete("sqx_widgets_test").
Where(sqx.Eq{"widget_id": widgetID}).
Do()
}
type widgetUpdateFilter struct {
Status *string `db:"status"`
Enabled *bool `db:"enabled"`
OwnerID sqx.Nullable[string] `db:"owner_id"`
}
func (w *widgetUpdateFilter) toSetMap() (map[string]any, error) {
if w.Status != nil && *w.Status == "Greasy" {
return nil, fmt.Errorf("widgets cannot be greasy")
}
return sqx.ToSetMap(w)
}
func (d *dbWidget) Update(ctx context.Context, tx sqx.Queryable, widgetID string, f *widgetUpdateFilter) error {
_, err := d.UpdateResult(ctx, tx, widgetID, f)
return err
}
func (d *dbWidget) UpdateResult(ctx context.Context, tx sqx.Queryable, widgetID string, f *widgetUpdateFilter) (sql.Result, error) {
return sqx.Write(ctx).
WithQueryable(tx).
Update("sqx_widgets_test").
Where(sqx.Eq{"widget_id": widgetID}).
SetMap(f.toSetMap()).
DoResult()
}
func (d *dbWidget) GetByID(ctx context.Context, tx sqx.Queryable, widgetID string) (*Widget, error) {
return sqx.Read[Widget](ctx).
WithQueryable(tx).
Select("*").
From("sqx_widgets_test").
Where(sqx.Eq{"widget_id": widgetID}).
OneStrict()
}
type widgetGetFilter struct {
WidgetID *[]string `db:"widget_id"`
Status *string `db:"status"`
}
func (d *dbWidget) Get(ctx context.Context, tx sqx.Queryable, f *widgetGetFilter) ([]Widget, error) {
return sqx.Read[Widget](ctx).
WithQueryable(tx).
Select("*").
From("sqx_widgets_test").
Where(sqx.ToClause(f)).
All()
}
func (d *dbWidget) First(ctx context.Context, tx sqx.Queryable, f *widgetGetFilter) (*Widget, error) {
return sqx.Read[Widget](ctx).
WithQueryable(tx).
Select("*").
From("sqx_widgets_test").
Where(sqx.ToClause(f)).
First()
}
func (d *dbWidget) GetAll(ctx context.Context, tx sqx.Queryable) ([]Widget, error) {
return sqx.Read[Widget](ctx).
WithQueryable(tx).
Select("*").
From("sqx_widgets_test").
OrderBy("widget_id DESC").
All()
}