@@ -17,6 +17,7 @@ type Route struct {
1717 Action string
1818 Method string
1919 Description string
20+ Validation interface {}
2021 Middleware []Middleware
2122}
2223
@@ -62,16 +63,31 @@ func HandleSingleRoute(routes []Route, router *mux.Router) {
6263 for _ , route := range routes {
6364 hasMiddleware := len (route .Middleware ) > 0
6465 directive := strings .Split (route .Action , "@" )
66+ validation := route .Validation
6567 if hasMiddleware {
6668 subRouter := mux .NewRouter ()
6769 subRouter .HandleFunc (route .Path , func (writer http.ResponseWriter , request * http.Request ) {
70+ if err := validateRequest (validation , request ); err != nil {
71+ writer .WriteHeader (http .StatusUnprocessableEntity )
72+ _ , _ = writer .Write ([]byte (err .Error ()))
73+
74+ return
75+ }
76+
6877 executeControllerDirective (directive , writer , request )
6978 }).Methods (route .Method )
7079
7180 subRouter .Use (parseMiddleware (route .Middleware )... )
7281 router .Handle (route .Path , subRouter ).Methods (route .Method )
7382 } else {
7483 router .HandleFunc (route .Path , func (writer http.ResponseWriter , request * http.Request ) {
84+ if err := validateRequest (validation , request ); err != nil {
85+ writer .WriteHeader (http .StatusUnprocessableEntity )
86+ _ , _ = writer .Write ([]byte (err .Error ()))
87+
88+ return
89+ }
90+
7591 executeControllerDirective (directive , writer , request )
7692 }).Methods (route .Method )
7793 }
@@ -85,17 +101,32 @@ func HandleGroups(groups []Group, router *mux.Router) {
85101
86102 for _ , route := range group .Routes {
87103 directive := strings .Split (route .Action , "@" )
104+ validation := route .Validation
88105 if len (route .Middleware ) > 0 {
89106 nestedRouter := mux .NewRouter ()
90107 fullPath := fmt .Sprintf ("%s%s" , group .Prefix , route .Path )
91108 nestedRouter .HandleFunc (fullPath , func (writer http.ResponseWriter , request * http.Request ) {
109+ if err := validateRequest (validation , request ); err != nil {
110+ writer .WriteHeader (http .StatusUnprocessableEntity )
111+ _ , _ = writer .Write ([]byte (err .Error ()))
112+
113+ return
114+ }
115+
92116 executeControllerDirective (directive , writer , request )
93117 }).Methods (route .Method )
94118
95119 nestedRouter .Use (parseMiddleware (route .Middleware )... )
96120 subRouter .Handle (route .Path , nestedRouter ).Methods (route .Method )
97121 } else {
98122 subRouter .HandleFunc (route .Path , func (writer http.ResponseWriter , request * http.Request ) {
123+ if err := validateRequest (validation , request ); err != nil {
124+ writer .WriteHeader (http .StatusUnprocessableEntity )
125+ _ , _ = writer .Write ([]byte (err .Error ()))
126+
127+ return
128+ }
129+
99130 executeControllerDirective (directive , writer , request )
100131 }).Methods (route .Method )
101132 }
@@ -132,12 +163,26 @@ func GetControllerInterface(directive []string, w http.ResponseWriter, r *http.R
132163// Example: MainController@main
133164// executes the main method from MainController
134165// It build the CUSTOM SERVICE CONTAINER and invoke the selected directive inside them.
135- func executeControllerDirective (directive []string , w http.ResponseWriter , r * http.Request ) {
166+ func executeControllerDirective (d []string , w http.ResponseWriter , r * http.Request ) {
136167 container := BuildCustomContainer ()
137- cc := GetControllerInterface (directive , w , r )
138- method := reflect .ValueOf (cc ).MethodByName (directive [1 ])
168+ cc := GetControllerInterface (d , w , r )
169+ method := reflect .ValueOf (cc ).MethodByName (d [1 ])
139170
140171 if err := dig .GroupInvoke (method .Interface (), container , SingletonIOC ); err != nil {
141172 log .Fatal (err )
142173 }
143174}
175+
176+ func validateRequest (data interface {}, r * http.Request ) error {
177+ if data != nil {
178+ if err := tool .DecodeJsonRequest (r , & data ); err != nil {
179+ return err
180+ }
181+
182+ if err := tool .ValidateRequest (data ); err != nil {
183+ return err
184+ }
185+ }
186+
187+ return nil
188+ }
0 commit comments