|
@@ -1,6 +1,7 @@
|
|
|
package api
|
|
|
|
|
|
import (
|
|
|
+ "encoding/json"
|
|
|
"fmt"
|
|
|
"io/ioutil"
|
|
|
"log"
|
|
@@ -17,6 +18,17 @@ import (
|
|
|
"github.com/gorilla/sessions"
|
|
|
)
|
|
|
|
|
|
+type User struct {
|
|
|
+ Name string
|
|
|
+ Admin bool
|
|
|
+}
|
|
|
+
|
|
|
+type PathPattern struct {
|
|
|
+ Path string
|
|
|
+ RedirectPath string
|
|
|
+ Methods []string
|
|
|
+}
|
|
|
+
|
|
|
var (
|
|
|
signingKey = []byte("secret")
|
|
|
store = sessions.NewCookieStore([]byte("something-very-secret"))
|
|
@@ -29,21 +41,20 @@ var (
|
|
|
ErrorHandler: onError,
|
|
|
})
|
|
|
|
|
|
- crud []string = []string{"add", "show", "update", "delete"}
|
|
|
+ patterns []PathPattern = []PathPattern{
|
|
|
+ PathPattern{"/%s", "", []string{"GET"}},
|
|
|
+ PathPattern{"/%s/{id}", "", []string{"GET"}},
|
|
|
+ PathPattern{"/%s/add/", "/%s/%d?format=html&tpl_layout=base&tpl_content=%s_show", []string{"GET", "POST"}},
|
|
|
+ PathPattern{"/%s/{id}/update", "/%s/%d?format=html&tpl_layout=base&tpl_content=%s_show", []string{"GET", "POST"}},
|
|
|
+ PathPattern{"/%s/{id}/delete", "/%s?format=html&tpl_layout=base&tpl_content=%s", []string{"DELETE"}},
|
|
|
+ }
|
|
|
)
|
|
|
|
|
|
-type User struct {
|
|
|
- Name string
|
|
|
- Admin bool
|
|
|
-}
|
|
|
-
|
|
|
// Generate CRUD handlers
|
|
|
func generateHandler(r *mux.Router, base string) {
|
|
|
- r.Handle(fmt.Sprintf("/%s", base), jwtMiddleware.Handler(recoverHandler(generalHandler(base, fmt.Sprintf("/%s", base))))).Methods("GET")
|
|
|
- r.Handle(fmt.Sprintf("/%s/{id}", base), jwtMiddleware.Handler(recoverHandler(generalHandler(base, fmt.Sprintf("/%s/{id}", base))))).Methods("GET")
|
|
|
- r.Handle(fmt.Sprintf("/%s/add/", base), jwtMiddleware.Handler(recoverHandler(generalHandler(base, fmt.Sprintf("/%s/add/", base))))).Methods("GET", "POST")
|
|
|
- r.Handle(fmt.Sprintf("/%s/{id}/update", base), jwtMiddleware.Handler(recoverHandler(generalHandler(base, fmt.Sprintf("/%s/{id}/update", base))))).Methods("GET", "POST")
|
|
|
- r.Handle(fmt.Sprintf("/%s/{id}/delete", base), jwtMiddleware.Handler(recoverHandler(generalHandler(base, fmt.Sprintf("/%s/{id}/delete", base))))).Methods("POST")
|
|
|
+ for _, pattern := range patterns {
|
|
|
+ r.Handle(fmt.Sprintf(pattern.Path, base), jwtMiddleware.Handler(recoverHandler(modelHandler(base, fmt.Sprintf(pattern.Path, base), pattern.RedirectPath)))).Methods(pattern.Methods...)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
func Handlers() *mux.Router {
|
|
@@ -58,7 +69,7 @@ func Handlers() *mux.Router {
|
|
|
|
|
|
r.Handle("/", jwtMiddleware.Handler(recoverHandler(dashboardHandler())))
|
|
|
|
|
|
- // Generate handlers
|
|
|
+ // Generate model handlers
|
|
|
|
|
|
for _, model := range []string{"teachers", "activities"} {
|
|
|
generateHandler(r, model)
|
|
@@ -113,57 +124,79 @@ func recoverHandler(next http.Handler) http.Handler {
|
|
|
return http.HandlerFunc(fn)
|
|
|
}
|
|
|
|
|
|
-func generalHandler(base, path string) http.Handler {
|
|
|
+func modelHandler(base, path, redirectPath string) http.Handler {
|
|
|
fn := func(w http.ResponseWriter, r *http.Request) {
|
|
|
var (
|
|
|
ok bool
|
|
|
getFn orm.GetFn
|
|
|
postFn orm.PostFn
|
|
|
)
|
|
|
- if r.Method == "GET" {
|
|
|
+
|
|
|
+ switch r.Method {
|
|
|
+
|
|
|
+ case "GET":
|
|
|
getFn, ok = orm.Get[path]
|
|
|
- } else {
|
|
|
+ if !ok {
|
|
|
+ renderer.Render[r.URL.Query()["format"][0]](w, r, fmt.Errorf("Can't find ORM function for path %s!", path))
|
|
|
+ }
|
|
|
+ data, err := getFn(mux.Vars(r))
|
|
|
+ if err != nil {
|
|
|
+ renderer.Render[r.URL.Query()["format"][0]](w, r, err)
|
|
|
+ } else {
|
|
|
+ renderer.Render[r.URL.Query()["format"][0]](w, r, data, r.URL.Query())
|
|
|
+ }
|
|
|
+
|
|
|
+ case "POST":
|
|
|
postFn, ok = orm.Post[path]
|
|
|
- }
|
|
|
- if !ok {
|
|
|
- renderer.Render[r.URL.Query()["format"][0]](w, r, fmt.Errorf("Can't find ORM function for path %s!", path))
|
|
|
- } else {
|
|
|
- if r.Method == "GET" {
|
|
|
- data, err := getFn(mux.Vars(r))
|
|
|
- if err != nil {
|
|
|
- renderer.Render[r.URL.Query()["format"][0]](w, r, err)
|
|
|
- } else {
|
|
|
- renderer.Render[r.URL.Query()["format"][0]](w, r, data, r.URL.Query())
|
|
|
- }
|
|
|
+ if !ok {
|
|
|
+ renderer.Render[r.URL.Query()["format"][0]](w, r, fmt.Errorf("Can't find ORM function for path %s!", path))
|
|
|
+ }
|
|
|
+ data, err := postFn(mux.Vars(r), r)
|
|
|
+ if err != nil {
|
|
|
+ renderer.Render["html"](w, r, err)
|
|
|
} else {
|
|
|
- data, err := postFn(mux.Vars(r), r)
|
|
|
- if err != nil {
|
|
|
- renderer.Render["html"](w, r, err)
|
|
|
+ if mux.Vars(r)["id"] != "" {
|
|
|
+ http.Redirect(w, r,
|
|
|
+ fmt.Sprintf(
|
|
|
+ "/%s/%s?format=html&tpl_layout=base&tpl_content=%s_show",
|
|
|
+ base,
|
|
|
+ mux.Vars(r)["id"],
|
|
|
+ base,
|
|
|
+ ),
|
|
|
+ http.StatusSeeOther,
|
|
|
+ )
|
|
|
} else {
|
|
|
- if mux.Vars(r)["id"] != "" {
|
|
|
- http.Redirect(w, r,
|
|
|
- fmt.Sprintf(
|
|
|
- "/%s/%s?format=html&tpl_layout=base&tpl_content=%s_show",
|
|
|
- base,
|
|
|
- mux.Vars(r)["id"],
|
|
|
- base,
|
|
|
- ),
|
|
|
- http.StatusSeeOther,
|
|
|
- )
|
|
|
- } else {
|
|
|
- http.Redirect(w, r,
|
|
|
- fmt.Sprintf(
|
|
|
- "/%s/%d?format=html&tpl_layout=base&tpl_content=%s_show",
|
|
|
- base,
|
|
|
- data.GetID(),
|
|
|
- base,
|
|
|
- ),
|
|
|
- http.StatusSeeOther,
|
|
|
- )
|
|
|
- }
|
|
|
+ http.Redirect(w, r,
|
|
|
+ fmt.Sprintf(
|
|
|
+ "/%s/%d?format=html&tpl_layout=base&tpl_content=%s_show",
|
|
|
+ base,
|
|
|
+ data.GetID(),
|
|
|
+ base,
|
|
|
+ ),
|
|
|
+ http.StatusSeeOther,
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
+ case "DELETE":
|
|
|
+ postFn, ok = orm.Post[path]
|
|
|
+ if !ok {
|
|
|
+ renderer.Render[r.URL.Query().Get("format")](w, r, fmt.Errorf("Can't find ORM function for path %s!", path))
|
|
|
+ }
|
|
|
+ _, err := postFn(mux.Vars(r), r)
|
|
|
+ if err != nil {
|
|
|
+ renderer.Render["html"](w, r, err)
|
|
|
+ } else {
|
|
|
+ var data struct {
|
|
|
+ RedirectUrl string `json:"redirect_url"`
|
|
|
}
|
|
|
+ data.RedirectUrl = fmt.Sprintf(redirectPath, base, base)
|
|
|
+
|
|
|
+ w.Header().Set("Content-Type", "application/json")
|
|
|
+ json.NewEncoder(w).Encode(data)
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|