Ver Fonte

Add draft JSON renderer

Andrea Fazzi há 6 anos atrás
pai
commit
b2b90f68f4
4 ficheiros alterados com 47 adições e 4 exclusões
  1. 21 0
      handlers/handlers.go
  2. 2 0
      orm/orm.go
  3. 10 1
      orm/teacher.go
  4. 14 3
      renderer/renderer.go

+ 21 - 0
handlers/handlers.go

@@ -48,6 +48,14 @@ var (
 		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"}},
 	}
+
+	jsonPatterns []PathPattern = []PathPattern{
+		PathPattern{"/api/%s", "", []string{"GET"}},
+		PathPattern{"/api/%s/{id}", "", []string{"GET"}},
+		PathPattern{"/api/%s/add/", "/%s/%d?format=json&tpl_layout=base&tpl_content=%s_show", []string{"GET", "POST"}},
+		PathPattern{"/api/%s/{id}/update", "/%s/%d?format=json&tpl_layout=base&tpl_content=%s_show", []string{"GET", "POST"}},
+		PathPattern{"/api/%s/{id}/delete", "/%s?format=json&tpl_layout=base&tpl_content=%s", []string{"DELETE"}},
+	}
 )
 
 // Generate CRUD handlers
@@ -57,6 +65,12 @@ func generateHandler(r *mux.Router, base string) {
 	}
 }
 
+func generateAPIHandler(r *mux.Router, base string) {
+	for _, pattern := range jsonPatterns {
+		r.Handle(fmt.Sprintf(pattern.Path, base), recoverHandler(modelHandler(base, fmt.Sprintf(pattern.Path, base), pattern.RedirectPath))).Methods(pattern.Methods...)
+	}
+}
+
 func Handlers() *mux.Router {
 	r := mux.NewRouter()
 
@@ -75,6 +89,13 @@ func Handlers() *mux.Router {
 		generateHandler(r, model)
 	}
 
+	for _, model := range []string{"teachers"} {
+		generateAPIHandler(r, model)
+	}
+
+	// // Token handling
+	// r.Handle("/get_token", getToken(db))
+
 	// Static file server
 
 	r.PathPrefix("/").Handler(http.FileServer(http.Dir("./dist/")))

+ 2 - 0
orm/orm.go

@@ -105,6 +105,8 @@ var (
 		"/teachers/{id}/update": GetTeacher,
 		"/teachers/add/":        GetNothing,
 
+		"/api/teachers": GetTeachersAll,
+
 		// Classes
 		"/classes":             GetClassesAll,
 		"/classes/{id}":        GetClassAll,

+ 10 - 1
orm/teacher.go

@@ -101,7 +101,9 @@ func GetTeachersAll(args map[string]string) (interface{}, error) {
 	for _, teacher := range teachers {
 		teacher.GetSubjects()
 	}
-
+	for _, teacher := range teachers {
+		teacher.GetActivities()
+	}
 	return teachers, nil
 }
 
@@ -177,6 +179,13 @@ func (t *Teacher) GetSubjects() ([]*Subject, error) {
 	return t.Subjects, nil
 }
 
+func (t *Teacher) GetActivities() ([]*Activity, error) {
+	if err := DB().Preload("Teacher").Preload("Subject").Preload("Class").Where("teacher_id=?", t.ID).Find(&t.Activities).Error; err != nil {
+		return nil, err
+	}
+	return t.Activities, nil
+}
+
 func (t *Teacher) GetActivitiesByClass(id string) ([]*Activity, error) {
 	if err := DB().Preload("Teacher").Where("class_id=? AND teacher_id=?", id, t.ID).Find(&t.Activities).Error; err != nil {
 		return nil, err

+ 14 - 3
renderer/renderer.go

@@ -40,10 +40,21 @@ func init() {
 		panic(err)
 	}
 
+	jsonRenderer, err := NewJSONRenderer()
+	if err != nil {
+		panic(err)
+	}
+
 	Render = make(map[string]func(http.ResponseWriter, *http.Request, interface{}, ...url.Values))
+
 	Render["html"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
 		htmlRenderer.Render(w, r, data, options...)
 	}
+
+	Render["json"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
+		jsonRenderer.Render(w, r, data, options...)
+	}
+
 }
 
 func query(values ...string) template.URL {
@@ -63,11 +74,11 @@ func isErrorType(data interface{}) bool {
 	return strings.Contains(strings.ToLower(reflect.TypeOf(data).String()), "error")
 }
 
-func NewJSONRenderer() *JSONRenderer {
-	return &JSONRenderer{}
+func NewJSONRenderer() (*JSONRenderer, error) {
+	return &JSONRenderer{}, nil
 }
 
-func (r *JSONRenderer) Render(w http.ResponseWriter, layout string, name string, data interface{}) error {
+func (rend *JSONRenderer) Render(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) error {
 	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 	j, err := json.Marshal(data)
 	if err != nil {