Skip to content

Commit 0ca196b

Browse files
authored
Merge pull request #14 from RobyFerro/fix-middleware
Changed middlware structure
2 parents 0fce5bd + dc5a841 commit 0ca196b

File tree

9 files changed

+55
-21
lines changed

9 files changed

+55
-21
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to the "Go-Web Framework" will be documented in this file.
44

55
## [Unreleased]
66

7+
## [v0.6-2-beta] - 2021-08-27
8+
### Changed
9+
- Changed middleware architecture. Now every middleware consists in an isolated structure.
10+
711
## [v0.6-1-beta] - 2021-08-27
812
### Fix
913
- Resolved command service container issue

application.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type BaseEntities struct {
1717
Services register.ServiceRegister
1818
SingletonServices register.ServiceRegister
1919
CommandServices register.ServiceRegister
20-
Middlewares interface{}
20+
Middlewares register.MiddlewareRegister
2121
Models register.ModelRegister
2222
}
2323

@@ -60,11 +60,13 @@ func startup(e BaseEntities) {
6060
// This method will register: Controllers, Models, CLI commands, Services and middleware
6161
func RegisterBaseEntities(entities BaseEntities) {
6262
kernel.Controllers = entities.Controllers
63-
kernel.Middleware = entities.Middlewares
63+
kernel.Middlewares = entities.Middlewares
6464
kernel.Models = entities.Models
6565

6666
mergeCommands(entities.Commands)
6767
mergeServices(entities.Services.List)
68+
mergeMiddleware(entities.Middlewares)
69+
6870
mergeSingletonServices(entities.SingletonServices.List)
6971
mergeCommandServices(entities.CommandServices.List)
7072
}
@@ -90,6 +92,13 @@ func mergeCommands(commands register.CommandRegister) {
9092
}
9193
}
9294

95+
// MergeCommands will merge system command with customs
96+
func mergeMiddleware(mw register.MiddlewareRegister) {
97+
for i, c := range mw.List {
98+
kernel.Middlewares.List[i] = c
99+
}
100+
}
101+
93102
// MergeCommands will merge system command with customs
94103
func mergeCommandServices(services []interface{}) {
95104
for _, s := range services {

cli/middleware_create.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ func (c *MiddlewareCreate) Run() {
4545
}
4646

4747
fmt.Printf("\nSUCCESS: Your %s middleware has been created at %s\n", cName, cFile)
48+
fmt.Println("Do not forget to register your new middleware!")
4849
}

cli/raw/middleware.raw

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@ import (
44
"net/http"
55
)
66

7-
// Your custom middleware
8-
func (Middleware) @@TMP@@(next http.Handler) http.Handler {
7+
type @@TMP@@Middleware struct {
8+
Name string
9+
Description string
10+
}
11+
12+
// Handle description
13+
func (@@TMP@@Middleware) Handle(next http.Handler) http.Handler {
914
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
1015
// Do stuff here
1116
})

ioc.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@ import (
77
"log"
88
)
99

10-
var singletonIOC *dig.Container
11-
1210
// RetrieveSingletonContainer returns a IOC container that contains every IOC singleton services.
1311
func RetrieveSingletonContainer() *dig.Container {
14-
return singletonIOC
12+
return kernel.SingletonIOC
1513
}
1614

1715
// RetrieveConfig provides a shortcut to retrieve the global configuration.

kernel/middleware.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,23 @@ import (
66
"reflect"
77
)
88

9-
var Middleware interface{}
10-
119
// Parse list of middleware and get an array of []mux.Middleware func
1210
// Required by Gorilla Mux
13-
func parseMiddleware(mwList []string, middleware interface{}) []mux.MiddlewareFunc {
11+
func parseMiddleware(mwList []string) []mux.MiddlewareFunc {
1412
var midFunc []mux.MiddlewareFunc
1513

16-
for _, mw := range mwList {
17-
m := reflect.ValueOf(middleware)
18-
method := m.MethodByName(mw)
14+
for _, name := range mwList {
15+
for _, mw := range Middlewares.List {
16+
rName := reflect.ValueOf(mw).Elem().FieldByName("Name").String()
17+
18+
if name == rName {
19+
m := reflect.ValueOf(mw)
20+
method := m.MethodByName("Handle")
1921

20-
callable := method.Interface().(func(handler http.Handler) http.Handler)
21-
midFunc = append(midFunc, callable)
22+
callable := method.Interface().(func(handler http.Handler) http.Handler)
23+
midFunc = append(midFunc, callable)
24+
}
25+
}
2226
}
2327

2428
return midFunc

kernel/register.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,7 @@ var (
4444
Controllers = register.ControllerRegister{
4545
List: []interface{}{},
4646
}
47+
Middlewares = register.MiddlewareRegister{
48+
List: []interface{}{},
49+
}
4750
)

kernel/router.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ type Router struct {
3535
Groups map[string]Group `yaml:"groups"`
3636
}
3737

38-
var singletonIOC *dig.Container
38+
var SingletonIOC *dig.Container
3939

4040
// WebRouter parses routing structures and set every route.
4141
// Return a Gorilla Mux router instance with all routes indicated in router.yml file.
4242
func WebRouter() *mux.Router {
4343
var wg sync.WaitGroup
44-
singletonIOC = BuildSingletonContainer()
44+
SingletonIOC = BuildSingletonContainer()
4545

4646
wg.Add(3)
4747

@@ -85,7 +85,7 @@ func HandleSingleRoute(routes map[string]Route, router *mux.Router) {
8585
executeControllerDirective(directive, writer, request)
8686
}).Methods(route.Method)
8787

88-
subRouter.Use(parseMiddleware(route.Middleware, Middleware)...)
88+
subRouter.Use(parseMiddleware(route.Middleware)...)
8989
router.Handle(route.Path, subRouter).Methods(route.Method)
9090
} else {
9191
router.HandleFunc(route.Path, func(writer http.ResponseWriter, request *http.Request) {
@@ -109,7 +109,7 @@ func HandleGroups(groups map[string]Group, router *mux.Router) {
109109
executeControllerDirective(directive, writer, request)
110110
}).Methods(route.Method)
111111

112-
nestedRouter.Use(parseMiddleware(route.Middleware, Middleware)...)
112+
nestedRouter.Use(parseMiddleware(route.Middleware)...)
113113
subRouter.Handle(route.Path, nestedRouter).Methods(route.Method)
114114
} else {
115115
subRouter.HandleFunc(route.Path, func(writer http.ResponseWriter, request *http.Request) {
@@ -118,7 +118,7 @@ func HandleGroups(groups map[string]Group, router *mux.Router) {
118118
}
119119
}
120120

121-
subRouter.Use(parseMiddleware(group.Middleware, Middleware)...)
121+
subRouter.Use(parseMiddleware(group.Middleware)...)
122122
}
123123
}
124124

@@ -154,7 +154,7 @@ func executeControllerDirective(directive []string, w http.ResponseWriter, r *ht
154154
cc := GetControllerInterface(directive, w, r)
155155
method := reflect.ValueOf(cc).MethodByName(directive[1])
156156

157-
if err := dig.GroupInvoke(method.Interface(), container, singletonIOC); err != nil {
157+
if err := dig.GroupInvoke(method.Interface(), container, SingletonIOC); err != nil {
158158
log.Fatal(err)
159159
}
160160
}

register/types.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package register
22

3+
import "net/http"
4+
35
// CommandRegister defines all registered commands
46
type CommandRegister struct {
57
List map[string]interface{}
@@ -22,3 +24,11 @@ type ModelRegister struct {
2224
type ServiceRegister struct {
2325
List []interface{}
2426
}
27+
28+
type Middleware interface {
29+
Handle(next http.Handler) http.Handler
30+
}
31+
32+
type MiddlewareRegister struct {
33+
List []interface{}
34+
}

0 commit comments

Comments
 (0)