浏览代码

Work in progress

Andrea Fazzi 6 年之前
父节点
当前提交
151101cc92
共有 4 个文件被更改,包括 78 次插入43 次删除
  1. 5 1
      handlers/teachers.go
  2. 30 1
      orm/orm_test.go
  3. 30 39
      orm/teacher.go
  4. 13 2
      renderer/renderer.go

+ 5 - 1
handlers/teachers.go

@@ -127,7 +127,11 @@ func teacherUpdateHandler() http.Handler {
 			if err != nil {
 				panic(err)
 			}
-			_, err = teacher.Save(renderer.Decode(r).(*orm.Teacher))
+			newTeacher, err := renderer.Decode(&orm.Teacher{}, r)
+			if err != nil {
+				panic(err)
+			}
+			_, err = teacher.Save(newTeacher.(*orm.Teacher))
 			if err != nil {
 				panic(err)
 			}

+ 30 - 1
orm/orm_test.go

@@ -44,6 +44,17 @@ func (t *testSuite) TestDB() {
 	t.Not(t.Nil(DB()))
 }
 
+func (t *testSuite) TestGetTeacher() {
+	var teacher Teacher
+	err := GetTeacher(&teacher, "1")
+	t.Nil(err)
+	if !t.Failed() {
+		t.Equal("Amilcare", teacher.Name)
+		t.Equal("AGOSTINO", teacher.Surname)
+	}
+
+}
+
 func (t *testSuite) TestGetTeachers() {
 	teachers, err := GetTeachers()
 	t.Nil(err)
@@ -69,7 +80,8 @@ func (t *testSuite) TestGetTeachersAll() {
 }
 
 func (t *testSuite) TestGetTeacherActivitiesByClass() {
-	teacher, err := GetTeacher("1")
+	var teacher Teacher
+	err := GetTeacher(&teacher, "1")
 	t.Nil(err)
 	if !t.Failed() {
 		_, err := teacher.GetActivitiesByClass("1")
@@ -128,6 +140,23 @@ func (t *testSuite) TestGetClass() {
 
 }
 
+func (t *testSuite) TestSaveTeacher() {
+	var teacher Teacher
+
+	err := DB().First(&teacher, "1").Error
+	t.Nil(err)
+	teacher.Name = "Roberto"
+
+	err = DB().Debug().Save(&teacher).Error
+	t.Nil(err)
+	if !t.Failed() {
+		DB().Debug().First(&teacher, "1")
+
+		// teacher, _ = GetTeacher("1")
+		t.Equal("Roberto", teacher.Name)
+	}
+}
+
 // func (t *testSuite) Before() {
 // 	var activities []Activity
 // 	if err := DB().Find(&activities).Error; err != nil {

+ 30 - 39
orm/teacher.go

@@ -35,25 +35,24 @@ INNER JOIN subjects on subjects.id=activities.subject_id
 WHERE activities.teacher_id=?`
 )
 
-func GetTeacher(id string) (*Teacher, error) {
-	var teacher Teacher
-	if err := DB().Find(&teacher, id).Error; err != nil {
-		return nil, err
+func GetTeacher(teacher *Teacher, id string) error {
+	if err := DB().First(teacher, id).Error; err != nil {
+		return err
 	}
 
 	if err := DB().Raw(selectUniqueTeacherClasses, id).Scan(&teacher.Classes).Error; err != nil {
-		return nil, err
+		return err
 	}
 
 	if err := DB().Raw(selectUniqueTeacherSubjects, id).Scan(&teacher.Subjects).Error; err != nil {
-		return nil, err
+		return err
 	}
 
 	if err := DB().Preload("Teacher").Preload("Subject").Where("teacher_id=?", id).Find(&teacher.Activities).Error; err != nil {
-		return nil, err
+		return err
 	}
 
-	return &teacher, nil
+	return nil
 }
 
 func GetTeachers() ([]*Teacher, error) {
@@ -79,11 +78,11 @@ func GetTeachersAll() ([]*Teacher, error) {
 	return teachers, nil
 }
 
-func (t *Teacher) Save(teacher *Teacher) (*Teacher, error) {
+func SaveTeacher(teacher *Teacher) error {
 	if err := DB().Save(teacher).Error; err != nil {
-		return nil, err
+		return nil
 	}
-	return t, nil
+	return nil
 }
 
 func (t *Teacher) GetClasses() ([]*Class, error) {
@@ -126,14 +125,12 @@ func (t *Teacher) Create(db *gorm.DB, record map[string]interface{}) error {
 	return nil
 }
 
-func (t Teacher) IsCoordinator() []Class {
-	var (
-		classes []Class
-		output  []Class
-	)
+func (t *Teacher) IsCoordinator() ([]*Class, error) {
+	var output []*Class
 
-	if err := DB().Model(t).Related(&classes, "Classes").Error; err != nil {
-		panic(err)
+	classes, err := t.GetClasses()
+	if err != nil {
+		return nil, err
 	}
 
 	for _, class := range classes {
@@ -141,44 +138,38 @@ func (t Teacher) IsCoordinator() []Class {
 			output = append(output, class)
 		}
 	}
-
-	return output
-
+	return output, nil
 }
 
-func (t Teacher) IsCoordinatorInClass(className string) bool {
-	var classes []Class
+func (t *Teacher) IsMinuter() ([]*Class, error) {
+	var output []*Class
 
-	if err := DB().Model(t).Where("name = ?", className).Related(&classes, "Classes").Error; err != nil {
-		panic(err)
+	classes, err := t.GetClasses()
+	if err != nil {
+		return nil, err
 	}
 
 	for _, class := range classes {
-		if class.CoordinatorID == t.ID {
-			return true
+		if class.MinuterID == t.ID {
+			output = append(output, class)
 		}
 	}
-
-	return false
-
+	return output, nil
 }
 
-func (t Teacher) IsMinuter() []Class {
-	var (
-		classes []Class
-		output  []Class
-	)
+func (t Teacher) IsCoordinatorInClass(className string) bool {
+	var classes []Class
 
-	if err := DB().Model(t).Related(&classes, "Classes").Error; err != nil {
+	if err := DB().Model(t).Where("name = ?", className).Related(&classes, "Classes").Error; err != nil {
 		panic(err)
 	}
 
 	for _, class := range classes {
-		if class.MinuterID == t.ID {
-			output = append(output, class)
+		if class.CoordinatorID == t.ID {
+			return true
 		}
 	}
 
-	return output
+	return false
 
 }

+ 13 - 2
renderer/renderer.go

@@ -10,6 +10,8 @@ import (
 	"path/filepath"
 	"reflect"
 	"strings"
+
+	"github.com/gorilla/schema"
 )
 
 type Renderer interface {
@@ -148,10 +150,19 @@ func (rend *HTMLRenderer) Render(w http.ResponseWriter, r *http.Request, data in
 	}
 }
 
-func Decode(r *http.Request) interface{} {
+func Decode(dst interface{}, r *http.Request) (interface{}, error) {
 	switch r.Header.Get("Content-type") {
+
 	case "application/x-www-form-urlencoded":
+		if err := r.ParseForm(); err != nil {
+			return nil, err
+		}
 
+		decoder := schema.NewDecoder()
+		if err := decoder.Decode(dst, r.PostForm); err != nil {
+			return nil, err
+		}
 	}
-	return nil
+
+	return dst, nil
 }