orm.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package orm
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/jinzhu/gorm"
  6. _ "github.com/jinzhu/gorm/dialects/mysql"
  7. )
  8. const (
  9. ADMINISTRATIVE_ROLE_PERSONAL = iota
  10. ADMINISTRATIVE_ROLE_TEACHING
  11. ADMINISTRATIVE_ROLE_DSGA
  12. ADMINISTRATIVE_ROLE_SCHOOL_CARETAKER
  13. ADMINISTRATIVE_ROLE_TECHNICAL_ASSISTANT
  14. ADMINISTRATIVE_ROLE_LIBRARIAN
  15. ADMINISTRATIVE_ROLE_UNDEFINED
  16. IssueTeacherHours = iota
  17. )
  18. type Timetable [][]Activity
  19. type Person interface {
  20. GetCredential() *Credential
  21. }
  22. type TheBoss struct {
  23. gorm.Model
  24. Credential
  25. Teachers []Teacher
  26. }
  27. type Address struct {
  28. City string
  29. Street string
  30. ZipCode string
  31. Country string
  32. }
  33. type Location struct {
  34. Id string
  35. Name string
  36. Address *Address
  37. }
  38. type Room struct {
  39. Id string
  40. Name string
  41. Capacity int
  42. Location *Location
  43. }
  44. type Desk struct {
  45. Id string
  46. Name string
  47. Students []*Student
  48. Teacher *Teacher
  49. }
  50. type Student struct {
  51. gorm.Model
  52. Credential
  53. Class *Class
  54. }
  55. type Director struct {
  56. gorm.Model
  57. Credential
  58. }
  59. type Administrative struct {
  60. gorm.Model
  61. Credential
  62. Role int
  63. }
  64. type Office struct {
  65. gorm.Model
  66. Credential
  67. Persons []Person
  68. }
  69. type Department struct {
  70. gorm.Model
  71. Name string
  72. Subjects []Subject
  73. Teachers []Teacher `gorm:"many2many:department_teachers;"`
  74. }
  75. type GetFn func(map[string]string) (interface{}, error)
  76. type PostFn func(map[string]string, *http.Request) (IDer, error)
  77. var (
  78. currDB *gorm.DB
  79. Get map[string]GetFn = map[string]GetFn{
  80. // Teacher
  81. "/teachers": GetTeachersAll,
  82. "/teachers/{id}": GetTeacherAll,
  83. "/teachers/{id}/update": GetTeacher,
  84. "/teachers/add/": GetNothing,
  85. "/api/teachers": GetTeachersAll,
  86. // Classes
  87. /// HTML
  88. "/classes": GetClassesAll,
  89. "/classes/{id}": GetClassAll,
  90. "/classes/{id}/update": GetClassForUpdate,
  91. "/classes/add/": GetClassForAdd,
  92. /// JSON
  93. "/api/classes": GetClassesAll,
  94. // Subjects
  95. "/subjects": GetSubjectsAll,
  96. "/subjects/{id}": GetSubjectAll,
  97. "/subjects/{id}/update": GetSubjectForUpdate,
  98. "/subjects/add/": GetSubjectForAdd,
  99. "/api/subjects": GetSubjectsAll,
  100. // Activity
  101. "/activities": GetActivitiesAll,
  102. "/activities/{id}": GetActivityAll,
  103. "/activities/{id}/update": GetActivityForUpdate,
  104. "/activities/add/": GetActivityForAdd,
  105. "/api/activities": GetActivitiesAll,
  106. }
  107. Post map[string]PostFn = map[string]PostFn{
  108. // Teacher
  109. /// HTML
  110. "/teachers/{id}/update": UpdateTeacher,
  111. "/teachers/{id}/delete": DeleteTeacher,
  112. "/teachers/add/": AddTeacher,
  113. /// JSON
  114. "/teachers/add": AddTeacher,
  115. // Classes
  116. "/classes/{id}/update": UpdateClass,
  117. "/classes/{id}/delete": DeleteClass,
  118. "/classes/add/": AddClass,
  119. // Subjects
  120. "/subjects/{id}/update": UpdateSubject,
  121. "/subjects/{id}/delete": DeleteSubject,
  122. "/subjects/add/": AddSubject,
  123. // Activity
  124. "/activities/{id}/update": UpdateActivity,
  125. "/activities/{id}/delete": DeleteActivity,
  126. "/activities/add/": AddActivity,
  127. }
  128. )
  129. func New(connection string) (*gorm.DB, error) {
  130. db, err := gorm.Open("mysql", connection)
  131. if err != nil {
  132. return nil, err
  133. }
  134. return db, nil
  135. }
  136. func Use(db *gorm.DB) {
  137. currDB = db
  138. }
  139. func DB() *gorm.DB {
  140. return currDB
  141. }
  142. func AutoMigrate() {
  143. if err := currDB.AutoMigrate(
  144. &School{},
  145. &Subject{},
  146. &Teacher{},
  147. &Class{},
  148. &Activity{},
  149. &Department{},
  150. &TheBoss{},
  151. &Administrative{},
  152. &Student{},
  153. &Director{},
  154. &Issue{},
  155. ).Error; err != nil {
  156. panic(err)
  157. }
  158. }
  159. func GetResultFunc(path string) (GetFn, error) {
  160. fn, ok := Get[path]
  161. if !ok {
  162. return nil, fmt.Errorf("Can't map %s!", path)
  163. }
  164. return fn, nil
  165. }
  166. func PostFunc(path string) (PostFn, error) {
  167. fn, ok := Post[path]
  168. if !ok {
  169. return nil, fmt.Errorf("Can't map %s!", path)
  170. }
  171. return fn, nil
  172. }