Skip to content

Commit d2deda5

Browse files
authored
✨ feat: add actions hook (#99)
1 parent a7aa661 commit d2deda5

File tree

7 files changed

+205
-59
lines changed

7 files changed

+205
-59
lines changed

pkg/response/actions/gorm/control.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,14 @@ func (e *Control) Handler() gin.HandlersChain {
5656
response.Make(c).Err(http.StatusNotImplemented, "not implemented")
5757
}
5858
}
59+
chain := gin.HandlersChain{h}
60+
if e.opts.controlHandlers != nil {
61+
chain = append(e.opts.controlHandlers, chain...)
62+
}
5963
if e.opts.Handlers != nil {
60-
return append(e.opts.Handlers, h)
64+
chain = append(e.opts.handlers, chain...)
6165
}
62-
return gin.HandlersChain{h}
66+
return chain
6367
}
6468

6569
func (e *Control) create(c *gin.Context) {

pkg/response/actions/gorm/delete.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,14 @@ func (e *Delete) Handler() gin.HandlersChain {
5252
}
5353
e.delete(c, v)
5454
}
55+
chain := gin.HandlersChain{h}
56+
if e.opts.deleteHandlers != nil {
57+
chain = append(e.opts.deleteHandlers, chain...)
58+
}
5559
if e.opts.Handlers != nil {
56-
return append(e.opts.Handlers, h)
60+
chain = append(e.opts.handlers, chain...)
5761
}
58-
return gin.HandlersChain{h}
62+
return chain
5963
}
6064

6165
// String action name

pkg/response/actions/gorm/get.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,14 @@ func (e *Get) Handler() gin.HandlersChain {
4848
}
4949
e.get(c, e.opts.Key)
5050
}
51+
chain := gin.HandlersChain{h}
52+
if e.opts.getHandlers != nil {
53+
chain = append(e.opts.getHandlers, chain...)
54+
}
5155
if e.opts.Handlers != nil {
52-
return append(e.opts.Handlers, h)
56+
chain = append(e.opts.handlers, chain...)
5357
}
54-
return gin.HandlersChain{h}
58+
return chain
5559
}
5660

5761
// get one record by id

pkg/response/actions/gorm/options.go

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,28 @@ type ActionHook func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
1919
type Option func(*Options)
2020

2121
type Options struct {
22-
Model schema.Tabler
23-
Scope func(ctx *gin.Context, table schema.Tabler) func(db *gorm.DB) *gorm.DB
24-
Handlers gin.HandlersChain
25-
TreeField string
26-
Depth int
27-
Key string
28-
Search response.Searcher
29-
BeforeCreate ActionHook
30-
AfterCreate ActionHook
31-
BeforeUpdate ActionHook
32-
AfterUpdate ActionHook
33-
BeforeGet ActionHook
34-
AfterGet ActionHook
35-
BeforeDelete ActionHook
36-
AfterDelete ActionHook
37-
BeforeSearch ActionHook
38-
AfterSearch ActionHook
22+
Model schema.Tabler
23+
Scope func(ctx *gin.Context, table schema.Tabler) func(db *gorm.DB) *gorm.DB
24+
Handlers gin.HandlersChain
25+
TreeField string
26+
Depth int
27+
Key string
28+
Search response.Searcher
29+
BeforeCreate ActionHook
30+
AfterCreate ActionHook
31+
BeforeUpdate ActionHook
32+
AfterUpdate ActionHook
33+
BeforeGet ActionHook
34+
AfterGet ActionHook
35+
BeforeDelete ActionHook
36+
AfterDelete ActionHook
37+
BeforeSearch ActionHook
38+
AfterSearch ActionHook
39+
handlers gin.HandlersChain
40+
controlHandlers gin.HandlersChain
41+
getHandlers gin.HandlersChain
42+
deleteHandlers gin.HandlersChain
43+
searchHandlers gin.HandlersChain
3944
}
4045

4146
func WithModel(m schema.Tabler) Option {
@@ -139,3 +144,27 @@ func WithAfterSearch(hook ActionHook) Option {
139144
o.AfterSearch = hook
140145
}
141146
}
147+
148+
func WithControlHandlers(handlers gin.HandlersChain) Option {
149+
return func(o *Options) {
150+
o.controlHandlers = handlers
151+
}
152+
}
153+
154+
func WithGetHandlers(handlers gin.HandlersChain) Option {
155+
return func(o *Options) {
156+
o.getHandlers = handlers
157+
}
158+
}
159+
160+
func WithDeleteHandlers(handlers gin.HandlersChain) Option {
161+
return func(o *Options) {
162+
o.deleteHandlers = handlers
163+
}
164+
}
165+
166+
func WithSearchHandlers(handlers gin.HandlersChain) Option {
167+
return func(o *Options) {
168+
o.searchHandlers = handlers
169+
}
170+
}

pkg/response/actions/gorm/search.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,14 @@ func (e *Search) Handler() gin.HandlersChain {
5151
}
5252
e.search(c)
5353
}
54+
chain := gin.HandlersChain{h}
55+
if e.opts.searchHandlers != nil {
56+
chain = append(e.opts.searchHandlers, chain...)
57+
}
5458
if e.opts.Handlers != nil {
55-
return append(e.opts.Handlers, h)
59+
chain = append(e.opts.handlers, chain...)
5660
}
57-
return gin.HandlersChain{h}
61+
return chain
5862
}
5963

6064
func (e *Search) search(c *gin.Context) {

pkg/response/controller/options.go

Lines changed: 118 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,31 @@ type Option func(*Options)
2020

2121
// Options options
2222
type Options struct {
23-
actions []response.Action
24-
search response.Searcher
25-
model actions.Model
26-
auth bool
27-
noAuthAction []string
28-
depth int
29-
treeField string
30-
modelProvider actions.ModelProvider
31-
scope func(ctx *gin.Context, table schema.Tabler) func(db *gorm.DB) *gorm.DB
32-
beforeCreate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
33-
beforeUpdate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
34-
afterCreate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
35-
afterUpdate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
36-
beforeGet func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
37-
afterGet func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
38-
beforeDelete func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
39-
afterDelete func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
40-
beforeSearch func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
41-
afterSearch func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
23+
actions []response.Action
24+
search response.Searcher
25+
model actions.Model
26+
auth bool
27+
noAuthAction []string
28+
depth int
29+
treeField string
30+
modelProvider actions.ModelProvider
31+
scope func(ctx *gin.Context, table schema.Tabler) func(db *gorm.DB) *gorm.DB
32+
beforeCreate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
33+
beforeUpdate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
34+
afterCreate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
35+
afterUpdate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
36+
beforeGet func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
37+
afterGet func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
38+
beforeDelete func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
39+
afterDelete func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
40+
beforeSearch func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
41+
afterSearch func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error
42+
handlers gin.HandlersChain
43+
createHandlers gin.HandlersChain
44+
updateHandlers gin.HandlersChain
45+
getHandlers gin.HandlersChain
46+
deleteHandlers gin.HandlersChain
47+
searchHandlers gin.HandlersChain
4248
}
4349

4450
func (o *Options) needAuth(name string) bool {
@@ -136,6 +142,98 @@ func WithTreeField(treeField string) Option {
136142
}
137143
}
138144

139-
func WithBeforeControl() {
145+
func WithBeforeCreate(beforeCreate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error) Option {
146+
return func(o *Options) {
147+
o.beforeCreate = beforeCreate
148+
}
149+
}
150+
151+
func WithAfterCreate(afterCreate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error) Option {
152+
return func(o *Options) {
153+
o.afterCreate = afterCreate
154+
}
155+
}
156+
157+
func WithBeforeUpdate(beforeUpdate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error) Option {
158+
return func(o *Options) {
159+
o.beforeUpdate = beforeUpdate
160+
}
161+
}
162+
163+
func WithAfterUpdate(afterUpdate func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error) Option {
164+
return func(o *Options) {
165+
o.afterUpdate = afterUpdate
166+
}
167+
}
168+
169+
func WithBeforeGet(beforeGet func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error) Option {
170+
return func(o *Options) {
171+
o.beforeGet = beforeGet
172+
}
173+
}
174+
175+
func WithAfterGet(afterGet func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error) Option {
176+
return func(o *Options) {
177+
o.afterGet = afterGet
178+
}
179+
}
180+
181+
func WithBeforeDelete(beforeDelete func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error) Option {
182+
return func(o *Options) {
183+
o.beforeDelete = beforeDelete
184+
}
185+
}
186+
187+
func WithAfterDelete(afterDelete func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error) Option {
188+
return func(o *Options) {
189+
o.afterDelete = afterDelete
190+
}
191+
}
140192

193+
func WithBeforeSearch(beforeSearch func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error) Option {
194+
return func(o *Options) {
195+
o.beforeSearch = beforeSearch
196+
}
197+
}
198+
199+
func WithAfterSearch(afterSearch func(ctx *gin.Context, db *gorm.DB, m schema.Tabler) error) Option {
200+
return func(o *Options) {
201+
o.afterSearch = afterSearch
202+
}
203+
}
204+
205+
func WithHandlers(handlers gin.HandlersChain) Option {
206+
return func(o *Options) {
207+
o.handlers = handlers
208+
}
209+
}
210+
211+
func WithCreateHandlers(handlers gin.HandlersChain) Option {
212+
return func(o *Options) {
213+
o.createHandlers = handlers
214+
}
215+
}
216+
217+
func WithUpdateHandlers(handlers gin.HandlersChain) Option {
218+
return func(o *Options) {
219+
o.updateHandlers = handlers
220+
}
221+
}
222+
223+
func WithGetHandlers(handlers gin.HandlersChain) Option {
224+
return func(o *Options) {
225+
o.getHandlers = handlers
226+
}
227+
}
228+
229+
func WithDeleteHandlers(handlers gin.HandlersChain) Option {
230+
return func(o *Options) {
231+
o.deleteHandlers = handlers
232+
}
233+
}
234+
235+
func WithSearchHandlers(handlers gin.HandlersChain) Option {
236+
return func(o *Options) {
237+
o.searchHandlers = handlers
238+
}
141239
}

pkg/response/controller/simple.go

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,32 +88,35 @@ func (e *Simple) getActionGorm(key string) response.Action {
8888
gorm.WithScope(e.options.scope),
8989
gorm.WithTreeField(e.options.treeField),
9090
gorm.WithDepth(e.options.depth),
91+
gorm.WithHandlers(e.options.handlers),
92+
gorm.WithControlHandlers(e.options.createHandlers),
93+
gorm.WithGetHandlers(e.options.getHandlers),
94+
gorm.WithDeleteHandlers(e.options.deleteHandlers),
95+
gorm.WithSearchHandlers(e.options.searchHandlers),
96+
gorm.WithBeforeGet(e.options.beforeGet),
97+
gorm.WithAfterGet(e.options.afterGet),
98+
gorm.WithBeforeCreate(e.options.beforeCreate),
99+
gorm.WithAfterCreate(e.options.afterCreate),
100+
gorm.WithBeforeUpdate(e.options.beforeUpdate),
101+
gorm.WithAfterUpdate(e.options.afterUpdate),
102+
gorm.WithBeforeDelete(e.options.beforeDelete),
103+
gorm.WithAfterDelete(e.options.afterDelete),
104+
gorm.WithBeforeSearch(e.options.beforeSearch),
105+
gorm.WithAfterSearch(e.options.afterSearch),
106+
gorm.WithKey(e.GetKey()),
107+
gorm.WithSearch(e.options.search),
91108
}
92109
if e.options.needAuth(key) {
93110
opts = append(opts, gorm.WithHandlers(gin.HandlersChain{response.AuthHandler}))
94111
}
95112
switch key {
96113
case response.Get:
97-
opts = append(opts, gorm.WithKey(e.GetKey()),
98-
gorm.WithBeforeGet(e.options.beforeGet),
99-
gorm.WithAfterGet(e.options.afterGet))
100114
return gorm.NewGet(opts...)
101115
case response.Control:
102-
opts = append(opts, gorm.WithKey(e.GetKey()),
103-
gorm.WithBeforeCreate(e.options.beforeCreate),
104-
gorm.WithAfterCreate(e.options.afterCreate),
105-
gorm.WithBeforeUpdate(e.options.beforeUpdate),
106-
gorm.WithAfterUpdate(e.options.afterUpdate))
107116
return gorm.NewControl(opts...)
108117
case response.Delete:
109-
opts = append(opts, gorm.WithKey(e.GetKey()),
110-
gorm.WithBeforeDelete(e.options.beforeDelete),
111-
gorm.WithAfterDelete(e.options.afterDelete))
112118
return gorm.NewDelete(opts...)
113119
case response.Search:
114-
opts = append(opts, gorm.WithSearch(e.options.search),
115-
gorm.WithBeforeSearch(e.options.beforeSearch),
116-
gorm.WithAfterSearch(e.options.afterSearch))
117120
return gorm.NewSearch(opts...)
118121
default:
119122
return nil

0 commit comments

Comments
 (0)