orm.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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
  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. "/api/teachers/{id}": GetTeacherAll,
  87. "/api/teachers/{id}/update": GetTeacher,
  88. "/api/teachers/add/": GetNothing,
  89. // Classes
  90. "/classes": GetClassesAll,
  91. "/classes/{id}": GetClassAll,
  92. "/classes/{id}/update": GetClassForUpdate,
  93. "/classes/add/": GetClassForAdd,
  94. "/api/classes": GetClassesAll,
  95. "/api/classes/{id}": GetClassAll,
  96. "/api/classes/{id}/update": GetClassForUpdate,
  97. "/api/classes/add/": GetClassForAdd,
  98. // Subjects
  99. "/subjects": GetSubjectsAll,
  100. "/subjects/{id}": GetSubjectAll,
  101. "/subjects/{id}/update": GetSubjectForUpdate,
  102. "/subjects/add/": GetSubjectForAdd,
  103. "/api/subjects": GetSubjectsAll,
  104. "/api/subjects/{id}": GetSubjectAll,
  105. "/api/subjects/{id}/update": GetSubjectForUpdate,
  106. "/api/subjects/add/": GetSubjectForAdd,
  107. // Activity
  108. "/activities": GetActivitiesAll,
  109. "/activities/{id}": GetActivityAll,
  110. "/activities/{id}/update": GetActivityForUpdate,
  111. "/activities/add/": GetActivityForAdd,
  112. "/api/activities": GetActivitiesAll,
  113. "/api/activities/{id}": GetActivityAll,
  114. "/api/activities/{id}/update": GetActivityForUpdate,
  115. "/api/activities/add/": GetActivityForAdd,
  116. }
  117. Post map[string]PostFn = map[string]PostFn{
  118. // Teacher
  119. "/teachers/{id}/update": UpdateTeacher,
  120. "/teachers/{id}/delete": DeleteTeacher,
  121. "/teachers/add/": AddTeacher,
  122. "/api/teachers/add": AddTeacher,
  123. "/api//teachers/{id}/delete": DeleteTeacher,
  124. "/api//teachers/add/": AddTeacher,
  125. // Classes
  126. "/classes/{id}/update": UpdateClass,
  127. "/classes/{id}/delete": DeleteClass,
  128. "/classes/add/": AddClass,
  129. "/api//classes/{id}/update": UpdateClass,
  130. "/api//classes/{id}/delete": DeleteClass,
  131. "/api//classes/add/": AddClass,
  132. // Subjects
  133. "/subjects/{id}/update": UpdateSubject,
  134. "/subjects/{id}/delete": DeleteSubject,
  135. "/subjects/add/": AddSubject,
  136. "/api//subjects/{id}/update": UpdateSubject,
  137. "/api//subjects/{id}/delete": DeleteSubject,
  138. "/api//subjects/add/": AddSubject,
  139. // Activity
  140. "/activities/{id}/update": UpdateActivity,
  141. "/activities/{id}/delete": DeleteActivity,
  142. "/activities/add/": AddActivity,
  143. "/api//activities/{id}/update": UpdateActivity,
  144. "/api//activities/{id}/delete": DeleteActivity,
  145. "/api//activities/add/": AddActivity,
  146. }
  147. )
  148. func New(connection string) (*gorm.DB, error) {
  149. db, err := gorm.Open("mysql", connection)
  150. if err != nil {
  151. return nil, err
  152. }
  153. return db, nil
  154. }
  155. func Use(db *gorm.DB) {
  156. currDB = db
  157. }
  158. func DB() *gorm.DB {
  159. return currDB
  160. }
  161. func AutoMigrate() {
  162. if err := currDB.AutoMigrate(
  163. &School{},
  164. &Subject{},
  165. &Teacher{},
  166. &Class{},
  167. &Activity{},
  168. &Department{},
  169. &TheBoss{},
  170. &Administrative{},
  171. &Student{},
  172. &Director{},
  173. &Issue{},
  174. ).Error; err != nil {
  175. panic(err)
  176. }
  177. }
  178. func GetResultFunc(path string) (GetFn, error) {
  179. fn, ok := Get[path]
  180. if !ok {
  181. return nil, fmt.Errorf("Can't map %s!", path)
  182. }
  183. return fn, nil
  184. }
  185. func PostFunc(path string) (PostFn, error) {
  186. fn, ok := Post[path]
  187. if !ok {
  188. return nil, fmt.Errorf("Can't map %s!", path)
  189. }
  190. return fn, nil
  191. }