Skip to content

Commit 7b678ec

Browse files
committed
Added support for middleware functions (#5)
1 parent 878802b commit 7b678ec

4 files changed

Lines changed: 45 additions & 0 deletions

File tree

handle.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ import (
1313

1414
// handleProcedureCall handles a procedure call, calling the procedure and returning the result from the handler
1515
func (r *Robin) handleProcedureCall(ctx *Context, procedure Procedure) error {
16+
// Call the procedure middleware functions before we proceed to to any work
17+
for _, middleware := range procedure.MiddlewareFns() {
18+
if err := middleware(ctx); err != nil {
19+
return err
20+
}
21+
}
22+
1623
var (
1724
data = struct {
1825
Payload any `json:"d"`

mutation.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55

66
"go.trulyao.dev/robin/internal/guarded"
7+
"go.trulyao.dev/robin/types"
78
)
89

910
type (
@@ -24,6 +25,9 @@ type (
2425
// WARNING: This never really has a value, it's just used for "type inference/reflection" during runtime
2526
out ReturnType
2627

28+
// Middleware functions to be executed before the mutation is called
29+
middlewareFns []types.Middleware
30+
2731
// Whether the mutation expects a payload or not
2832
expectsPayload bool
2933
}
@@ -88,6 +92,17 @@ func (m *mutation[_, _]) Validate() error {
8892
return nil
8993
}
9094

95+
// MiddlewareFns returns the middleware functions that should be executed before the mutation is called
96+
func (m *mutation[_, _]) MiddlewareFns() []types.Middleware {
97+
return m.middlewareFns
98+
}
99+
100+
// WithMiddleware sets the middleware functions for the mutation
101+
func (m *mutation[_, _]) WithMiddleware(fns ...types.Middleware) Procedure {
102+
m.middlewareFns = append(m.middlewareFns, fns...)
103+
return m
104+
}
105+
91106
// Creates a new mutation with the given name and handler function
92107
func Mutation[R any, B any](name string, fn MutationFn[R, B]) *mutation[R, B] {
93108
var body B

query.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55

66
"go.trulyao.dev/robin/internal/guarded"
7+
"go.trulyao.dev/robin/types"
78
)
89

910
type (
@@ -24,6 +25,9 @@ type (
2425
// WARNING: This never really has a value, it's just used for "type inference/reflection" during runtime
2526
out ReturnType
2627

28+
// Middleware functions to be executed before the mutation is called
29+
middlewareFns []types.Middleware
30+
2731
// Whether the query expects a payload or not
2832
expectsPayload bool
2933
}
@@ -88,6 +92,17 @@ func (q *query[_, _]) Validate() error {
8892
return nil
8993
}
9094

95+
// MiddlewareFns returns the middleware functions to be executed before the query is called
96+
func (q *query[_, _]) MiddlewareFns() []types.Middleware {
97+
return q.middlewareFns
98+
}
99+
100+
// Add the middleware functions for the query
101+
func (q *query[_, _]) WithMiddleware(fns ...types.Middleware) Procedure {
102+
q.middlewareFns = append(q.middlewareFns, fns...)
103+
return q
104+
}
105+
91106
// Creates a new query with the given name and handler function
92107
func Query[R any, B any](name string, fn QueryFn[R, B]) *query[R, B] {
93108
var body B

types/procedure.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,16 @@ type Procedure interface {
4141

4242
// Validate the procedure
4343
Validate() error
44+
45+
// Middleware to be executed before the procedure is called
46+
MiddlewareFns() []Middleware
47+
48+
// Set the middleware functions for the procedure
49+
WithMiddleware(...Middleware) Procedure
4450
}
4551

52+
type Middleware func(*Context) error
53+
4654
// No-op type to represent a procedure that doesn't return any response or take any payload
4755
type (
4856
_RobinVoid struct{} // Used for identification of robin's special void type

0 commit comments

Comments
 (0)