Explorar o código

Working on handlers/orm refactoring

Andrea Fazzi %!s(int64=5) %!d(string=hai) anos
pai
achega
a38f6909e4
Modificáronse 4 ficheiros con 297 adicións e 227 borrados
  1. 7 7
      handlers/handlers.go
  2. 54 193
      orm/mappings.go
  3. 236 0
      orm/mappings.go.old
  4. 0 27
      orm/orm.go

+ 7 - 7
handlers/handlers.go

@@ -111,7 +111,7 @@ func generateHandler(r *mux.Router, model string) {
 		r.Handle(pattern.Path(model), jwtCookie.Handler(recoverHandler(modelHandler(model, pattern)))).Methods(pattern.Methods...)
 	}
 
-	// Install api paths
+	// Install API paths
 
 	for _, pattern := range apiPatterns {
 		r.Handle(pattern.Path(model), jwtHeader.Handler(recoverHandler(modelHandler(model, pattern)))).Methods(pattern.Methods...)
@@ -219,12 +219,6 @@ func get(w http.ResponseWriter, r *http.Request, model string, pattern PathPatte
 
 }
 
-func respondWithError(w http.ResponseWriter, r *http.Request, err error) {
-	respFormat := renderer.GetContentFormat(r)
-	w.WriteHeader(http.StatusInternalServerError)
-	renderer.Render[respFormat](w, r, err)
-}
-
 func post(w http.ResponseWriter, r *http.Request, model string, pattern PathPattern) {
 	var (
 		data orm.IDer
@@ -283,6 +277,12 @@ func delete(w http.ResponseWriter, r *http.Request, model string, pattern PathPa
 	}
 }
 
+func respondWithError(w http.ResponseWriter, r *http.Request, err error) {
+	respFormat := renderer.GetContentFormat(r)
+	w.WriteHeader(http.StatusInternalServerError)
+	renderer.Render[respFormat](w, r, err)
+}
+
 func modelHandler(model string, pattern PathPattern) http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
 		switch r.Method {

+ 54 - 193
orm/mappings.go

@@ -1,206 +1,67 @@
 package orm
 
-var (
-	Get map[string]GetFn = map[string]GetFn{
-		// Teacher
-		"/teachers":             GetTeachersFast,
-		"/teachers/{id}":        GetTeacherAll,
-		"/teachers/{id}/update": GetTeacher,
-		"/teachers/add/":        GetNothing,
-
-		"/api/teachers":             GetTeachersAll,
-		"/api/teachers/{id}":        GetTeacherAll,
-		"/api/teachers/{id}/update": GetTeacher,
-		"/api/teachers/add/":        GetNothing,
-
-		// Student
-		"/students":             GetStudentsFast,
-		"/students/{id}":        GetStudentAll,
-		"/students/{id}/update": GetStudentForUpdate,
-		"/students/add/":        GetStudentForAdd,
-
-		"/api/students":             GetStudentsAll,
-		"/api/students/{id}":        GetStudentAll,
-		"/api/students/{id}/update": GetStudentForUpdate,
-		"/api/students/add/":        GetStudentForAdd,
-
-		// Classes
-		"/classes":             GetClassesAll,
-		"/classes/{id}":        GetClassAll,
-		"/classes/{id}/update": GetClassForUpdate,
-		"/classes/add/":        GetClassForAdd,
-
-		"/api/classes":             GetClassesAll,
-		"/api/classes/{id}":        GetClassAll,
-		"/api/classes/{id}/update": GetClassForUpdate,
-		"/api/classes/add/":        GetClassForAdd,
-
-		// Subjects
-		"/subjects":             GetSubjectsAll,
-		"/subjects/{id}":        GetSubjectAll,
-		"/subjects/{id}/update": GetSubjectForUpdate,
-		"/subjects/add/":        GetSubjectForAdd,
-
-		"/api/subjects":             GetSubjectsAll,
-		"/api/subjects/{id}":        GetSubjectAll,
-		"/api/subjects/{id}/update": GetSubjectForUpdate,
-		"/api/subjects/add/":        GetSubjectForAdd,
-
-		// Departments
-		"/departments":             GetDepartmentsAll,
-		"/departments/{id}":        GetDepartmentAll,
-		"/departments/{id}/update": GetDepartmentForUpdate,
-		"/departments/add/":        GetDepartmentForAdd,
-
-		"/api/departments":             GetDepartmentsAll,
-		"/api/departments/{id}":        GetDepartmentAll,
-		"/api/departments/{id}/update": GetDepartment,
-		"/api/departments/add/":        GetNothing,
-
-		// Activity
-		"/activities":             GetActivitiesAll,
-		"/activities/{id}":        GetActivityAll,
-		"/activities/{id}/update": GetActivityForUpdate,
-		"/activities/add/":        GetActivityForAdd,
-
-		"/api/activities":             GetActivitiesAll,
-		"/api/activities/{id}":        GetActivityAll,
-		"/api/activities/{id}/update": GetActivityForUpdate,
-		"/api/activities/add/":        GetActivityForAdd,
-
-		// Offices
-		"/offices":             GetOfficesAll,
-		"/offices/{id}":        GetOfficeAll,
-		"/offices/{id}/update": GetOfficeForUpdate,
-		"/offices/add/":        GetOfficeForAdd,
-
-		"/api/offices":             GetOfficesAll,
-		"/api/offices/{id}":        GetOfficeAll,
-		"/api/offices/{id}/update": GetOffice,
-		"/api/offices/add/":        GetNothing,
-
-		// Administratives
-		"/administratives":             GetAdministrativesAll,
-		"/administratives/{id}":        GetAdministrativeAll,
-		"/administratives/{id}/update": GetAdministrativeForUpdate,
-		"/administratives/add/":        GetAdministrativeForAdd,
-
-		"/api/administratives":             GetAdministrativesAll,
-		"/api/administratives/{id}":        GetAdministrativeAll,
-		"/api/administratives/{id}/update": GetAdministrative,
-		"/api/administratives/add/":        GetNothing,
-
-		// Documents
-		"/documents":              GetDocumentsAll,
-		"/documents/{id}":         GetDocumentAll,
-		"/documents/{id}/update":  GetDocumentForUpdate,
-		"/documents/{id}/execute": GetDocumentExecute,
-		"/documents/add/":         GetDocumentForAdd,
-
-		"/api/documents":             GetDocumentsAll,
-		"/api/documents/{id}":        GetDocumentAll,
-		"/api/documents/{id}/update": GetDocument,
-		"/api/documents/add/":        GetNothing,
-
-		// Jobs
+import (
+	"fmt"
+	"net/http"
+	"path"
+	"reflect"
+	"strings"
+
+	"github.com/jinzhu/inflection"
+)
 
-		"/jobs":                       GetJobs,
-		"/jobs/{id}":                  GetJob,
-		"/jobs/{id}/files/{filename}": GetFile,
+var (
+	getFns map[string]func(args map[string]string) (interface{}, error)
+)
 
-		"/api/jobs/{id}": GetJob,
-		"/api/jobs/add/": GetNothing,
+func init() {
+	getFns = make(map[string]func(args map[string]string) (interface{}, error), 0)
+}
+
+func MapModels(models []interface{}, handlers map[string]string) {
+	for _, model := range models {
+		name := inflection.Plural(strings.ToLower(modelName(model)))
+		for p, action := range map[string]string{
+			"":            "GetAll",
+			"create":      "Create",
+			"{id}":        "Get",
+			"{id}/udpate": "Update",
+		} {
+			getFns[path.Join("/", name, p)] = reflect.ValueOf(model).MethodByName(action).Interface().(func(map[string]string) (interface{}, error))
+		}
 	}
+}
 
-	Post map[string]PostFn = map[string]PostFn{
-		// Teacher
-		"/teachers/{id}/update": UpdateTeacher,
-		"/teachers/{id}/delete": DeleteTeacher,
-		"/teachers/add/":        AddTeacher,
-
-		"/api/teachers/add":         AddTeacher,
-		"/api/teachers/{id}/update": UpdateTeacher,
-		"/api/teachers/{id}/delete": DeleteTeacher,
-		"/api/teachers/add/":        AddTeacher,
-
-		// Student
-		"/students/{id}/update": UpdateStudent,
-		"/students/{id}/delete": DeleteStudent,
-		"/students/add/":        AddStudent,
-
-		"/api/students/add":         AddStudent,
-		"/api/students/{id}/update": UpdateStudent,
-		"/api/students/{id}/delete": DeleteStudent,
-		"/api/students/add/":        AddStudent,
-
-		// Classes
-		"/classes/{id}/update": UpdateClass,
-		"/classes/{id}/delete": DeleteClass,
-		"/classes/add/":        AddClass,
-
-		"/api/classes/{id}/update": UpdateClass,
-		"/api/classes/{id}/delete": DeleteClass,
-		"/api/classes/add/":        AddClass,
-
-		// Subjects
-		"/subjects/{id}/update": UpdateSubject,
-		"/subjects/{id}/delete": DeleteSubject,
-		"/subjects/add/":        AddSubject,
-
-		"/api/subjects/{id}/update": UpdateSubject,
-		"/api/subjects/{id}/delete": DeleteSubject,
-		"/api/subjects/add/":        AddSubject,
-
-		// Departments
-		"/departments/{id}/update": UpdateDepartment,
-		"/departments/{id}/delete": DeleteDepartment,
-		"/departments/add/":        AddDepartment,
-
-		"/api/departments/{id}/update": UpdateDepartment,
-		"/api/departments/{id}/delete": DeleteDepartment,
-		"/api/departments/add/":        AddDepartment,
-
-		// Activity
-		"/activities/{id}/update": UpdateActivity,
-		"/activities/{id}/delete": DeleteActivity,
-		"/activities/add/":        AddActivity,
-
-		"/api/activities/{id}/update": UpdateActivity,
-		"/api/activities/{id}/delete": DeleteActivity,
-		"/api/activities/add/":        AddActivity,
-
-		// Offices
-		"/offices/{id}/update": UpdateOffice,
-		"/offices/{id}/delete": DeleteOffice,
-		"/offices/add/":        AddOffice,
-
-		"/api/offices/{id}/update": UpdateOffice,
-		"/api/offices/{id}/delete": DeleteOffice,
-		"/api/offices/add/":        AddOffice,
-
-		// Administratives
-		"/administratives/{id}/update": UpdateAdministrative,
-		"/administratives/{id}/delete": DeleteAdministrative,
-		"/administratives/add/":        AddAdministrative,
+func GetFunc(path string) (GetFn, error) {
+	fn, ok := getFns[path]
+	if !ok {
+		return nil, fmt.Errorf("Can't map path %s to any model methods.", path)
+	}
 
-		"/api/administratives/{id}/update": UpdateAdministrative,
-		"/api/administratives/{id}/delete": DeleteAdministrative,
-		"/api/administratives/add/":        AddAdministrative,
+	return fn, nil
+}
 
-		// Documents
-		"/documents/{id}/update": UpdateDocument,
-		"/documents/{id}/delete": DeleteDocument,
-		"/documents/add/":        AddDocument,
+// // func PostFunc(path string) (PostFn, error) {
+// // 	fn, ok := Post[path]
+// // 	if !ok {
+// // 		return nil, fmt.Errorf("Can't map %s!", path)
+// // 	}
 
-		"/api/documents/{id}/update": UpdateDocument,
-		"/api/documents/{id}/delete": DeleteDocument,
-		"/api/documents/add/":        AddDocument,
+// // 	return fn, nil
+// // }
 
-		// Jobs
+func GetNothing(args map[string]string) (interface{}, error) {
+	return nil, nil
+}
 
-		"/jobs/{id}/delete": DeleteJob,
+func PostNothing(args map[string]string, r *http.Request) (IDer, error) {
+	return nil, nil
+}
 
-		"/api/jobs/{id}/update": UpdateJob,
-		"/api/jobs/{id}/delete": DeleteJob,
+func modelName(s interface{}) string {
+	if t := reflect.TypeOf(s); t.Kind() == reflect.Ptr {
+		return t.Elem().Name()
+	} else {
+		return t.Name()
 	}
-)
+}

+ 236 - 0
orm/mappings.go.old

@@ -0,0 +1,236 @@
+package orm
+
+import (
+	"path"
+	"reflect"
+	"strings"
+
+	"github.com/jinzhu/inflection"
+)
+
+var (
+	Get map[string]GetFn = map[string]GetFn{
+		// Teacher
+		"/teachers":             GetTeachersFast,
+		"/teachers/{id}":        GetTeacherAll,
+		"/teachers/{id}/update": GetTeacher,
+		"/teachers/add/":        GetNothing,
+
+		"/api/teachers":             GetTeachersAll,
+		"/api/teachers/{id}":        GetTeacherAll,
+		"/api/teachers/{id}/update": GetTeacher,
+		"/api/teachers/add/":        GetNothing,
+
+		// Student
+		"/students":             GetStudentsFast,
+		"/students/{id}":        GetStudentAll,
+		"/students/{id}/update": GetStudentForUpdate,
+		"/students/add/":        GetStudentForAdd,
+
+		"/api/students":             GetStudentsAll,
+		"/api/students/{id}":        GetStudentAll,
+		"/api/students/{id}/update": GetStudentForUpdate,
+		"/api/students/add/":        GetStudentForAdd,
+
+		// Classes
+		"/classes":             GetClassesAll,
+		"/classes/{id}":        GetClassAll,
+		"/classes/{id}/update": GetClassForUpdate,
+		"/classes/add/":        GetClassForAdd,
+
+		"/api/classes":             GetClassesAll,
+		"/api/classes/{id}":        GetClassAll,
+		"/api/classes/{id}/update": GetClassForUpdate,
+		"/api/classes/add/":        GetClassForAdd,
+
+		// Subjects
+		"/subjects":             GetSubjectsAll,
+		"/subjects/{id}":        GetSubjectAll,
+		"/subjects/{id}/update": GetSubjectForUpdate,
+		"/subjects/add/":        GetSubjectForAdd,
+
+		"/api/subjects":             GetSubjectsAll,
+		"/api/subjects/{id}":        GetSubjectAll,
+		"/api/subjects/{id}/update": GetSubjectForUpdate,
+		"/api/subjects/add/":        GetSubjectForAdd,
+
+		// Departments
+		"/departments":             GetDepartmentsAll,
+		"/departments/{id}":        GetDepartmentAll,
+		"/departments/{id}/update": GetDepartmentForUpdate,
+		"/departments/add/":        GetDepartmentForAdd,
+
+		"/api/departments":             GetDepartmentsAll,
+		"/api/departments/{id}":        GetDepartmentAll,
+		"/api/departments/{id}/update": GetDepartment,
+		"/api/departments/add/":        GetNothing,
+
+		// Activity
+		"/activities":             GetActivitiesAll,
+		"/activities/{id}":        GetActivityAll,
+		"/activities/{id}/update": GetActivityForUpdate,
+		"/activities/add/":        GetActivityForAdd,
+
+		"/api/activities":             GetActivitiesAll,
+		"/api/activities/{id}":        GetActivityAll,
+		"/api/activities/{id}/update": GetActivityForUpdate,
+		"/api/activities/add/":        GetActivityForAdd,
+
+		// Offices
+		"/offices":             GetOfficesAll,
+		"/offices/{id}":        GetOfficeAll,
+		"/offices/{id}/update": GetOfficeForUpdate,
+		"/offices/add/":        GetOfficeForAdd,
+
+		"/api/offices":             GetOfficesAll,
+		"/api/offices/{id}":        GetOfficeAll,
+		"/api/offices/{id}/update": GetOffice,
+		"/api/offices/add/":        GetNothing,
+
+		// Administratives
+		"/administratives":             GetAdministrativesAll,
+		"/administratives/{id}":        GetAdministrativeAll,
+		"/administratives/{id}/update": GetAdministrativeForUpdate,
+		"/administratives/add/":        GetAdministrativeForAdd,
+
+		"/api/administratives":             GetAdministrativesAll,
+		"/api/administratives/{id}":        GetAdministrativeAll,
+		"/api/administratives/{id}/update": GetAdministrative,
+		"/api/administratives/add/":        GetNothing,
+
+		// Documents
+		"/documents":              GetDocumentsAll,
+		"/documents/{id}":         GetDocumentAll,
+		"/documents/{id}/update":  GetDocumentForUpdate,
+		"/documents/{id}/execute": GetDocumentExecute,
+		"/documents/add/":         GetDocumentForAdd,
+
+		"/api/documents":             GetDocumentsAll,
+		"/api/documents/{id}":        GetDocumentAll,
+		"/api/documents/{id}/update": GetDocument,
+		"/api/documents/add/":        GetNothing,
+
+		// Jobs
+
+		"/jobs":                       GetJobs,
+		"/jobs/{id}":                  GetJob,
+		"/jobs/{id}/files/{filename}": GetFile,
+
+		"/api/jobs/{id}": GetJob,
+		"/api/jobs/add/": GetNothing,
+	}
+
+	Post map[string]PostFn = map[string]PostFn{
+		// Teacher
+		"/teachers/{id}/update": UpdateTeacher,
+		"/teachers/{id}/delete": DeleteTeacher,
+		"/teachers/add/":        AddTeacher,
+
+		"/api/teachers/add":         AddTeacher,
+		"/api/teachers/{id}/update": UpdateTeacher,
+		"/api/teachers/{id}/delete": DeleteTeacher,
+		"/api/teachers/add/":        AddTeacher,
+
+		// Student
+		"/students/{id}/update": UpdateStudent,
+		"/students/{id}/delete": DeleteStudent,
+		"/students/add/":        AddStudent,
+
+		"/api/students/add":         AddStudent,
+		"/api/students/{id}/update": UpdateStudent,
+		"/api/students/{id}/delete": DeleteStudent,
+		"/api/students/add/":        AddStudent,
+
+		// Classes
+		"/classes/{id}/update": UpdateClass,
+		"/classes/{id}/delete": DeleteClass,
+		"/classes/add/":        AddClass,
+
+		"/api/classes/{id}/update": UpdateClass,
+		"/api/classes/{id}/delete": DeleteClass,
+		"/api/classes/add/":        AddClass,
+
+		// Subjects
+		"/subjects/{id}/update": UpdateSubject,
+		"/subjects/{id}/delete": DeleteSubject,
+		"/subjects/add/":        AddSubject,
+
+		"/api/subjects/{id}/update": UpdateSubject,
+		"/api/subjects/{id}/delete": DeleteSubject,
+		"/api/subjects/add/":        AddSubject,
+
+		// Departments
+		"/departments/{id}/update": UpdateDepartment,
+		"/departments/{id}/delete": DeleteDepartment,
+		"/departments/add/":        AddDepartment,
+
+		"/api/departments/{id}/update": UpdateDepartment,
+		"/api/departments/{id}/delete": DeleteDepartment,
+		"/api/departments/add/":        AddDepartment,
+
+		// Activity
+		"/activities/{id}/update": UpdateActivity,
+		"/activities/{id}/delete": DeleteActivity,
+		"/activities/add/":        AddActivity,
+
+		"/api/activities/{id}/update": UpdateActivity,
+		"/api/activities/{id}/delete": DeleteActivity,
+		"/api/activities/add/":        AddActivity,
+
+		// Offices
+		"/offices/{id}/update": UpdateOffice,
+		"/offices/{id}/delete": DeleteOffice,
+		"/offices/add/":        AddOffice,
+
+		"/api/offices/{id}/update": UpdateOffice,
+		"/api/offices/{id}/delete": DeleteOffice,
+		"/api/offices/add/":        AddOffice,
+
+		// Administratives
+		"/administratives/{id}/update": UpdateAdministrative,
+		"/administratives/{id}/delete": DeleteAdministrative,
+		"/administratives/add/":        AddAdministrative,
+
+		"/api/administratives/{id}/update": UpdateAdministrative,
+		"/api/administratives/{id}/delete": DeleteAdministrative,
+		"/api/administratives/add/":        AddAdministrative,
+
+		// Documents
+		"/documents/{id}/update": UpdateDocument,
+		"/documents/{id}/delete": DeleteDocument,
+		"/documents/add/":        AddDocument,
+
+		"/api/documents/{id}/update": UpdateDocument,
+		"/api/documents/{id}/delete": DeleteDocument,
+		"/api/documents/add/":        AddDocument,
+
+		// Jobs
+
+		"/jobs/{id}/delete": DeleteJob,
+
+		"/api/jobs/{id}/update": UpdateJob,
+		"/api/jobs/{id}/delete": DeleteJob,
+	}
+)
+
+func MapModels(models []interface{}, handlers map[string]string) {
+	for _, model := range models {
+		name := inflection.Plural(strings.ToLower(modelName(model)))
+		for p, action := range map[string]string{
+			"":            "GetAll",
+			"create":      "Create",
+			"{id}":        "Get",
+			"{id}/udpate": "Update",
+		} {
+			getFns[path.Join("/", name, p)] = reflect.ValueOf(model).MethodByName(action).Interface().(func(map[string]string) (interface{}, error))
+		}
+	}
+}
+
+func modelName(s interface{}) string {
+	if t := reflect.TypeOf(s); t.Kind() == reflect.Ptr {
+		return t.Elem().Name()
+	} else {
+		return t.Name()
+	}
+}

+ 0 - 27
orm/orm.go

@@ -1,7 +1,6 @@
 package orm
 
 import (
-	"fmt"
 	"net/http"
 
 	"github.com/jinzhu/gorm"
@@ -87,29 +86,3 @@ func AutoMigrate() {
 	}
 
 }
-
-func GetFunc(path string) (GetFn, error) {
-	fn, ok := Get[path]
-	if !ok {
-		return nil, fmt.Errorf("Can't map %s!", path)
-	}
-
-	return fn, nil
-}
-
-func PostFunc(path string) (PostFn, error) {
-	fn, ok := Post[path]
-	if !ok {
-		return nil, fmt.Errorf("Can't map %s!", path)
-	}
-
-	return fn, nil
-}
-
-func GetNothing(args map[string]string) (interface{}, error) {
-	return nil, nil
-}
-
-func PostNothing(args map[string]string, r *http.Request) (IDer, error) {
-	return nil, nil
-}