| 
					
				 | 
			
			
				@@ -1,164 +1,67 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package api 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	"encoding/json" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"fmt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	"io/ioutil" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"net/http" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/gorilla/mux" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"gogs.carducci-dante.gov.it/karmen/core/orm" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"gogs.carducci-dante.gov.it/karmen/core/renderer" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	"gogs.carducci-dante.gov.it/karmen/datasource/edt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func teachersHandler() http.Handler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func generalHandler(base, path string) http.Handler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	fn := func(w http.ResponseWriter, r *http.Request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		teachers, err := orm.GetTeachersAll() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			renderer.Render[r.URL.Query()["format"][0]](w, r, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			ok     bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			getFn  orm.GetFn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			postFn orm.PostFn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if r.Method == "GET" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			getFn, ok = orm.Get[path] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			renderer.Render[r.URL.Query()["format"][0]](w, r, teachers, r.URL.Query()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			postFn, ok = orm.Post[path] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return http.HandlerFunc(fn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func teacherShowHandler() http.Handler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	fn := func(w http.ResponseWriter, r *http.Request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		teacher, err := orm.GetTeacherAll(mux.Vars(r)["id"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			renderer.Render[r.URL.Query()["format"][0]](w, r, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if !ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			renderer.Render[r.URL.Query()["format"][0]](w, r, fmt.Errorf("Can't find ORM function for path %s!", path)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			renderer.Render[r.URL.Query()["format"][0]](w, r, teacher, r.URL.Query()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return http.HandlerFunc(fn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func teachersAddHandler() http.Handler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	fn := func(w http.ResponseWriter, r *http.Request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if r.Method == "GET" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			teacher, err := orm.GetTeacher(mux.Vars(r)["id"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				renderer.Render[r.URL.Query()["format"][0]](w, r, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				renderer.Render[r.URL.Query()["format"][0]](w, r, teacher, r.URL.Query()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} else if r.Method == "POST" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			teacher := new(orm.Teacher) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			err := renderer.Decode(teacher, r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			_, err = orm.CreateTeacher(teacher) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			http.Redirect(w, r, fmt.Sprintf("/teachers/%d?format=html&tpl_layout=base&tpl_content=teachers_show", teacher.ID), http.StatusSeeOther) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return http.HandlerFunc(fn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func teachersDeleteHandler() http.Handler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	fn := func(w http.ResponseWriter, r *http.Request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		teacher, err := orm.GetTeacher(mux.Vars(r)["id"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err := orm.DeleteTeacher(teacher); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var data struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			RedirectUrl string `json:"redirect_url"` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		data.RedirectUrl = "/teachers?format=html&tpl_layout=base&tpl_content=teachers" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		w.Header().Set("Content-Type", "application/json") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		json.NewEncoder(w).Encode(data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return http.HandlerFunc(fn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func teacherUpdateHandler() http.Handler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	fn := func(w http.ResponseWriter, r *http.Request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if r.Method == "GET" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			teacher, err := orm.GetTeacher(mux.Vars(r)["id"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				renderer.Render[r.URL.Query()["format"][0]](w, r, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			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()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				renderer.Render[r.URL.Query()["format"][0]](w, r, teacher, r.URL.Query()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} else if r.Method == "POST" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			teacher, err := orm.GetTeacher(mux.Vars(r)["id"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			err = renderer.Decode(teacher, r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				data, err := postFn(mux.Vars(r), r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					renderer.Render["html"](w, r, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 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, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			_, err = orm.SaveTeacher(teacher) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			http.Redirect(w, r, fmt.Sprintf("/teachers/%d?format=html&tpl_layout=base&tpl_content=teachers_show", teacher.ID), http.StatusSeeOther) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return http.HandlerFunc(fn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func teachersCheckUsernameHandler() http.Handler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	fn := func(w http.ResponseWriter, r *http.Request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var teacher orm.Teacher 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var data struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Exists bool `json:"exists"` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if orm.DB().Where("username = ?", mux.Vars(r)["username"]).Find(&teacher).RecordNotFound() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			data.Exists = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			data.Exists = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		w.Header().Set("Content-Type", "application/json") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		json.NewEncoder(w).Encode(data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return http.HandlerFunc(fn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func teachersImportHandler() http.Handler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	fn := func(w http.ResponseWriter, r *http.Request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		r.ParseMultipartForm(32 << 20) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		file, _, err := r.FormFile("teachers_import") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		defer file.Close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		data, err := ioutil.ReadAll(file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if importer, err := edt.NewImporter( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			string(data), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			map[string]string{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				"COGNOME": "surname", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				"NOME":    "name", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err := orm.Import(&orm.Teacher{}, importer); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			http.Redirect(w, r, "/teachers", http.StatusSeeOther) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return http.HandlerFunc(fn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |