package orm import ( "fmt" "net/http" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) const ( ADMINISTRATIVE_ROLE_PERSONAL = iota ADMINISTRATIVE_ROLE_TEACHING ADMINISTRATIVE_ROLE_DSGA ADMINISTRATIVE_ROLE_SCHOOL_CARETAKER ADMINISTRATIVE_ROLE_TECHNICAL_ASSISTANT ADMINISTRATIVE_ROLE_LIBRARIAN ADMINISTRATIVE_ROLE_UNDEFINED IssueTeacherHours = iota ) type Timetable [][]Activity type Person interface { GetCredential() *Credential } type TheBoss struct { gorm.Model Credential Teachers []Teacher } type Address struct { City string Street string ZipCode string Country string } type Location struct { Id string Name string Address *Address } type Room struct { Id string Name string Capacity int Location *Location } type Desk struct { Id string Name string Students []*Student Teacher *Teacher } type Student struct { gorm.Model Credential Class *Class } type Director struct { gorm.Model Credential } type Administrative struct { gorm.Model Credential Role int } type Office struct { gorm.Model Credential Persons []Person } type Department struct { gorm.Model Name string Subjects []Subject Teachers []Teacher } type GetFn func(map[string]string) (interface{}, error) type PostFn func(map[string]string, *http.Request) (IDer, error) var ( currDB *gorm.DB Get map[string]GetFn = map[string]GetFn{ // Teacher "/teachers": GetTeachersAll, "/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, // 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, // 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, } 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}/delete": DeleteTeacher, "/api//teachers/add/": AddTeacher, // 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, // 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, } ) func New(connection string) (*gorm.DB, error) { db, err := gorm.Open("mysql", connection) if err != nil { return nil, err } return db, nil } func Use(db *gorm.DB) { currDB = db } func DB() *gorm.DB { return currDB } func AutoMigrate() { if err := currDB.AutoMigrate( &School{}, &Subject{}, &Teacher{}, &Class{}, &Activity{}, &Department{}, &TheBoss{}, &Administrative{}, &Student{}, &Director{}, &Issue{}, ).Error; err != nil { panic(err) } } func GetResultFunc(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 }