orm.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. package orm
  2. import (
  3. "errors"
  4. "fmt"
  5. "strings"
  6. "github.com/jinzhu/gorm"
  7. _ "github.com/jinzhu/gorm/dialects/mysql"
  8. "gogs.carducci-dante.gov.it/karmen/datasource"
  9. )
  10. const (
  11. ADMINISTRATIVE_ROLE_PERSONAL = iota
  12. ADMINISTRATIVE_ROLE_TEACHING
  13. ADMINISTRATIVE_ROLE_DSGA
  14. ADMINISTRATIVE_ROLE_SCHOOL_CARETAKER
  15. ADMINISTRATIVE_ROLE_TECHNICAL_ASSISTANT
  16. ADMINISTRATIVE_ROLE_LIBRARIAN
  17. ADMINISTRATIVE_ROLE_UNDEFINED
  18. IssueTeacherHours = iota
  19. )
  20. var currDB *gorm.DB
  21. type Timetable [][]Activity
  22. type Person interface {
  23. GetCredential() *Credential
  24. }
  25. type TheBoss struct {
  26. gorm.Model
  27. Credential
  28. Teachers []Teacher
  29. }
  30. type Address struct {
  31. City string
  32. Street string
  33. ZipCode string
  34. Country string
  35. }
  36. type Location struct {
  37. Id string
  38. Name string
  39. Address *Address
  40. }
  41. type Room struct {
  42. Id string
  43. Name string
  44. Capacity int
  45. Location *Location
  46. }
  47. type Desk struct {
  48. Id string
  49. Name string
  50. Students []*Student
  51. Teacher *Teacher
  52. }
  53. type Student struct {
  54. gorm.Model
  55. Credential
  56. Class *Class
  57. }
  58. type Director struct {
  59. gorm.Model
  60. Credential
  61. }
  62. type Administrative struct {
  63. gorm.Model
  64. Credential
  65. Role int
  66. }
  67. type Office struct {
  68. gorm.Model
  69. Credential
  70. Persons []Person
  71. }
  72. type Department struct {
  73. gorm.Model
  74. Name string
  75. Subjects []Subject
  76. Teachers []Teacher `gorm:"many2many:department_teachers;"`
  77. }
  78. func (b *TheBoss) Create(db *gorm.DB, record map[string]interface{}) error {
  79. if record["role"] == "boss" {
  80. result := new(TheBoss)
  81. result.Name = record["name"].(string)
  82. result.Surname = record["surname"].(string)
  83. result.Username = result.GenerateUsername()
  84. result.Password = result.GenerateSaltedPassword(result.Username)
  85. db.Create(result)
  86. } else {
  87. boss := TheBoss{}
  88. teacher := Teacher{}
  89. db.Model(TheBoss{}).First(&boss)
  90. db.Where("username=?", record["username"]).First(&teacher)
  91. db.Model(&boss).Association("Teachers").Append(&teacher)
  92. }
  93. return nil
  94. }
  95. func (a *Administrative) Create(db *gorm.DB, record map[string]interface{}) error {
  96. result := Administrative{}
  97. result.Name = record["name"].(string)
  98. result.Surname = record["surname"].(string)
  99. result.Username = result.GenerateUsername()
  100. result.Password = result.GenerateSaltedPassword(result.Username)
  101. switch record["role"] {
  102. case "personal_administrator":
  103. result.Role = ADMINISTRATIVE_ROLE_PERSONAL
  104. case "teaching_administrator":
  105. result.Role = ADMINISTRATIVE_ROLE_TEACHING
  106. case "school_caretaker":
  107. result.Role = ADMINISTRATIVE_ROLE_SCHOOL_CARETAKER
  108. case "technical_assistant":
  109. result.Role = ADMINISTRATIVE_ROLE_TECHNICAL_ASSISTANT
  110. case "librarian":
  111. result.Role = ADMINISTRATIVE_ROLE_LIBRARIAN
  112. case "dsga":
  113. result.Role = ADMINISTRATIVE_ROLE_DSGA
  114. default:
  115. result.Role = ADMINISTRATIVE_ROLE_UNDEFINED
  116. }
  117. db.Create(&result)
  118. return nil
  119. }
  120. func (d *Director) Create(db *gorm.DB, record map[string]interface{}) error {
  121. result := new(Director)
  122. if name := record["name"]; name == nil {
  123. return errors.New("Error in creating director: field name is empty")
  124. } else {
  125. result.Name = name.(string)
  126. }
  127. if surname := record["surname"]; surname == nil {
  128. return errors.New("Error in creating director: field surname is empty")
  129. } else {
  130. result.Surname = surname.(string)
  131. }
  132. // Generate username and initial password
  133. result.Username = result.GenerateUsername()
  134. result.Password = result.GenerateSaltedPassword(result.Username)
  135. db.Set("gorm:save_associations", false).Create(result)
  136. return nil
  137. }
  138. func (t *Student) Create(db *gorm.DB, record map[string]interface{}) error {
  139. result := new(Student)
  140. if name := record["name"]; name == nil {
  141. return errors.New("Error in creating student: field name is empty")
  142. } else {
  143. result.Name = name.(string)
  144. }
  145. if surname := record["surname"]; surname == nil {
  146. return errors.New("Error in creating student: field surname is empty")
  147. } else {
  148. result.Surname = surname.(string)
  149. }
  150. // Generate username and initial password
  151. result.Username = result.GenerateUsername()
  152. result.Password = result.GenerateSaltedPassword(result.Username)
  153. db.Set("gorm:save_associations", false).Create(result)
  154. return nil
  155. }
  156. func (d *Department) Create(db *gorm.DB, record map[string]interface{}) error {
  157. result := new(Department)
  158. if name := record["name"]; name == nil {
  159. return errors.New("Error in updating subject: field name is empty")
  160. } else {
  161. result.Name = name.(string)
  162. }
  163. db.Set("gorm:save_associations", false).Create(result)
  164. // Handle department-subjects relationship
  165. for _, s := range record["subjects"].([]interface{}) {
  166. subject := Subject{}
  167. db.Where("name=?", strings.TrimSpace(s.(string))).Find(&subject)
  168. db.Model(result).Association("Subjects").Append(subject)
  169. }
  170. // Handle department-teachers relationship
  171. allTeachers := make([]Teacher, 0)
  172. db.Find(&allTeachers)
  173. for _, t := range allTeachers {
  174. db.Model(&t).Related(&t.Subjects, "Subjects")
  175. for _, s := range t.Subjects {
  176. for _, depS := range result.Subjects {
  177. if s.Name == depS.Name {
  178. db.Model(result).Association("Teachers").Append(t)
  179. }
  180. }
  181. }
  182. }
  183. return nil
  184. }
  185. func Import(importable datasource.Importable, importer datasource.Importer) error {
  186. for _, record := range importer.Records() {
  187. err := importable.Create(currDB, record)
  188. if err != nil {
  189. return err
  190. }
  191. }
  192. return nil
  193. }
  194. func New(connection string) (*gorm.DB, error) {
  195. db, err := gorm.Open("mysql", connection)
  196. if err != nil {
  197. return nil, err
  198. }
  199. return db, nil
  200. }
  201. func Use(db *gorm.DB) {
  202. currDB = db
  203. }
  204. func DB() *gorm.DB {
  205. return currDB
  206. }
  207. func Reset() {
  208. currDB.DropTableIfExists(
  209. &School{},
  210. &Subject{},
  211. &Teacher{},
  212. &Class{},
  213. &Activity{},
  214. &Student{},
  215. &Department{},
  216. &TheBoss{},
  217. &Administrative{},
  218. &Director{},
  219. &Issue{},
  220. )
  221. currDB.Exec("TRUNCATE teacher_subjects;")
  222. // currDB.Exec("TRUNCATE teacher_classes;")
  223. currDB.Exec("TRUNCATE department_teachers;")
  224. }
  225. func AutoMigrate() {
  226. if err := currDB.AutoMigrate(
  227. &School{},
  228. &Subject{},
  229. &Teacher{},
  230. &Class{},
  231. &Activity{},
  232. &Department{},
  233. &TheBoss{},
  234. &Administrative{},
  235. &Student{},
  236. &Director{},
  237. &Issue{},
  238. ).Error; err != nil {
  239. panic(err)
  240. }
  241. }
  242. func GetTeacher(username string) (*Teacher, error) {
  243. teacher := Teacher{}
  244. currDB.Where(fmt.Sprintf("username='%s'", username)).Find(&teacher)
  245. return &teacher, nil
  246. }