orm.go 4.2 KB

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