Skip to content

Commit

Permalink
Merge pull request #14 from RobyFerro/fix-middleware
Browse files Browse the repository at this point in the history
Changed middlware structure
  • Loading branch information
RobyFerro committed Aug 27, 2021
2 parents 0fce5bd + dc5a841 commit 0ca196b
Show file tree
Hide file tree
Showing 9 changed files with 55 additions and 21 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Expand Up @@ -4,6 +4,10 @@ All notable changes to the "Go-Web Framework" will be documented in this file.

## [Unreleased]

## [v0.6-2-beta] - 2021-08-27
### Changed
- Changed middleware architecture. Now every middleware consists in an isolated structure.

## [v0.6-1-beta] - 2021-08-27
### Fix
- Resolved command service container issue
Expand Down
13 changes: 11 additions & 2 deletions application.go
Expand Up @@ -17,7 +17,7 @@ type BaseEntities struct {
Services register.ServiceRegister
SingletonServices register.ServiceRegister
CommandServices register.ServiceRegister
Middlewares interface{}
Middlewares register.MiddlewareRegister
Models register.ModelRegister
}

Expand Down Expand Up @@ -60,11 +60,13 @@ func startup(e BaseEntities) {
// This method will register: Controllers, Models, CLI commands, Services and middleware
func RegisterBaseEntities(entities BaseEntities) {
kernel.Controllers = entities.Controllers
kernel.Middleware = entities.Middlewares
kernel.Middlewares = entities.Middlewares
kernel.Models = entities.Models

mergeCommands(entities.Commands)
mergeServices(entities.Services.List)
mergeMiddleware(entities.Middlewares)

mergeSingletonServices(entities.SingletonServices.List)
mergeCommandServices(entities.CommandServices.List)
}
Expand All @@ -90,6 +92,13 @@ func mergeCommands(commands register.CommandRegister) {
}
}

// MergeCommands will merge system command with customs
func mergeMiddleware(mw register.MiddlewareRegister) {
for i, c := range mw.List {
kernel.Middlewares.List[i] = c
}
}

// MergeCommands will merge system command with customs
func mergeCommandServices(services []interface{}) {
for _, s := range services {
Expand Down
1 change: 1 addition & 0 deletions cli/middleware_create.go
Expand Up @@ -45,4 +45,5 @@ func (c *MiddlewareCreate) Run() {
}

fmt.Printf("\nSUCCESS: Your %s middleware has been created at %s\n", cName, cFile)
fmt.Println("Do not forget to register your new middleware!")
}
9 changes: 7 additions & 2 deletions cli/raw/middleware.raw
Expand Up @@ -4,8 +4,13 @@ import (
"net/http"
)

// Your custom middleware
func (Middleware) @@TMP@@(next http.Handler) http.Handler {
type @@TMP@@Middleware struct {
Name string
Description string
}

// Handle description
func (@@TMP@@Middleware) Handle(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Do stuff here
})
Expand Down
4 changes: 1 addition & 3 deletions ioc.go
Expand Up @@ -7,11 +7,9 @@ import (
"log"
)

var singletonIOC *dig.Container

// RetrieveSingletonContainer returns a IOC container that contains every IOC singleton services.
func RetrieveSingletonContainer() *dig.Container {
return singletonIOC
return kernel.SingletonIOC
}

// RetrieveConfig provides a shortcut to retrieve the global configuration.
Expand Down
20 changes: 12 additions & 8 deletions kernel/middleware.go
Expand Up @@ -6,19 +6,23 @@ import (
"reflect"
)

var Middleware interface{}

// Parse list of middleware and get an array of []mux.Middleware func
// Required by Gorilla Mux
func parseMiddleware(mwList []string, middleware interface{}) []mux.MiddlewareFunc {
func parseMiddleware(mwList []string) []mux.MiddlewareFunc {
var midFunc []mux.MiddlewareFunc

for _, mw := range mwList {
m := reflect.ValueOf(middleware)
method := m.MethodByName(mw)
for _, name := range mwList {
for _, mw := range Middlewares.List {
rName := reflect.ValueOf(mw).Elem().FieldByName("Name").String()

if name == rName {
m := reflect.ValueOf(mw)
method := m.MethodByName("Handle")

callable := method.Interface().(func(handler http.Handler) http.Handler)
midFunc = append(midFunc, callable)
callable := method.Interface().(func(handler http.Handler) http.Handler)
midFunc = append(midFunc, callable)
}
}
}

return midFunc
Expand Down
3 changes: 3 additions & 0 deletions kernel/register.go
Expand Up @@ -44,4 +44,7 @@ var (
Controllers = register.ControllerRegister{
List: []interface{}{},
}
Middlewares = register.MiddlewareRegister{
List: []interface{}{},
}
)
12 changes: 6 additions & 6 deletions kernel/router.go
Expand Up @@ -35,13 +35,13 @@ type Router struct {
Groups map[string]Group `yaml:"groups"`
}

var singletonIOC *dig.Container
var SingletonIOC *dig.Container

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

wg.Add(3)

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

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

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

subRouter.Use(parseMiddleware(group.Middleware, Middleware)...)
subRouter.Use(parseMiddleware(group.Middleware)...)
}
}

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

if err := dig.GroupInvoke(method.Interface(), container, singletonIOC); err != nil {
if err := dig.GroupInvoke(method.Interface(), container, SingletonIOC); err != nil {
log.Fatal(err)
}
}
10 changes: 10 additions & 0 deletions register/types.go
@@ -1,5 +1,7 @@
package register

import "net/http"

// CommandRegister defines all registered commands
type CommandRegister struct {
List map[string]interface{}
Expand All @@ -22,3 +24,11 @@ type ModelRegister struct {
type ServiceRegister struct {
List []interface{}
}

type Middleware interface {
Handle(next http.Handler) http.Handler
}

type MiddlewareRegister struct {
List []interface{}
}

0 comments on commit 0ca196b

Please sign in to comment.