activity.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package orm
  2. import "github.com/jinzhu/gorm"
  3. type Activity struct {
  4. gorm.Model
  5. Name string
  6. Class Class
  7. Teacher Teacher
  8. Subject Subject
  9. ClassID uint `schema:"class_id"`
  10. TeacherID uint `schema:"teacher_id"`
  11. SubjectID uint `schema:"subject_id"`
  12. Hours int
  13. prevTeacherID uint
  14. }
  15. func (a *Activity) updateRelatedTeacher(tx *gorm.DB, teacherID uint) {
  16. var (
  17. teacher Teacher
  18. class Class
  19. subject Subject
  20. )
  21. if err := tx.Find(&teacher, teacherID).Error; err != nil {
  22. panic(err)
  23. }
  24. // Calculate teacher hours
  25. teacher.CalcHours(tx)
  26. // Teacher -> Classes association
  27. if err := tx.First(&class, a.ClassID).Error; err != nil {
  28. panic(err)
  29. }
  30. if err := tx.Model(&teacher).Association("Classes").Append(class).Error; err != nil {
  31. panic(err)
  32. }
  33. // Teacher -> Subjects association
  34. if err := tx.First(&subject, a.SubjectID).Error; err != nil {
  35. panic(err)
  36. }
  37. if err := tx.Model(&teacher).Association("Subjects").Append(subject).Error; err != nil {
  38. panic(err)
  39. }
  40. }
  41. func (a *Activity) deleteRelatedTeacherAssociations(tx *gorm.DB, teacherID uint) {
  42. var (
  43. teacher Teacher
  44. class Class
  45. subject Subject
  46. )
  47. if err := tx.Find(&teacher, teacherID).Error; err != nil {
  48. panic(err)
  49. }
  50. // Calculate teacher hours
  51. teacher.CalcHours(tx)
  52. // Teacher -> Classes association
  53. if err := tx.First(&class, a.ClassID).Error; err != nil {
  54. panic(err)
  55. }
  56. if err := tx.Preload("Classes").Find(&teacher, teacher.ID).Error; err != nil {
  57. panic(err)
  58. }
  59. if err := tx.Model(&teacher).Association("Classes").Delete(class).Error; err != nil {
  60. panic(err)
  61. }
  62. if err := tx.Preload("Classes").Find(&teacher, teacher.ID).Error; err != nil {
  63. panic(err)
  64. }
  65. // Teacher -> Subjects association
  66. if err := tx.First(&subject, a.SubjectID).Error; err != nil {
  67. panic(err)
  68. }
  69. if err := tx.Model(&teacher).Association("Subjects").Delete(subject).Error; err != nil {
  70. panic(err)
  71. }
  72. }
  73. func (a *Activity) createUpdateActivity(tx *gorm.DB) {
  74. if (a.TeacherID != a.prevTeacherID) && (a.prevTeacherID != 0) {
  75. a.deleteRelatedTeacherAssociations(tx, a.prevTeacherID)
  76. }
  77. if a.TeacherID != 0 {
  78. a.updateRelatedTeacher(tx, a.TeacherID)
  79. }
  80. }
  81. func (a *Activity) deleteActivity(tx *gorm.DB) {
  82. if a.TeacherID != 0 {
  83. var (
  84. teacher Teacher
  85. class Class
  86. subject Subject
  87. )
  88. if err := tx.Find(&teacher, a.TeacherID).Error; err != nil {
  89. panic(err)
  90. }
  91. // Calculate teacher hours
  92. teacher.CalcHours(tx)
  93. // Teacher -> Classes association
  94. if err := tx.First(&class, a.ClassID).Error; err != nil {
  95. panic(err)
  96. }
  97. if err := tx.Model(&teacher).Association("Classes").Delete(class).Error; err != nil {
  98. panic(err)
  99. }
  100. // Teacher -> Subjects association
  101. if err := tx.First(&subject, a.SubjectID).Error; err != nil {
  102. panic(err)
  103. }
  104. if err := tx.Model(&teacher).Association("Subjects").Delete(subject).Error; err != nil {
  105. panic(err)
  106. }
  107. }
  108. }
  109. func (a *Activity) AfterCreate(tx *gorm.DB) error {
  110. a.createUpdateActivity(tx)
  111. return nil
  112. }
  113. func (a *Activity) BeforeUpdate(tx *gorm.DB) error {
  114. var currActivity Activity
  115. if err := tx.First(&currActivity, a.ID).Error; err != nil {
  116. panic(err)
  117. }
  118. a.prevTeacherID = currActivity.TeacherID
  119. return nil
  120. }
  121. func (a *Activity) AfterSave(tx *gorm.DB) error {
  122. a.createUpdateActivity(tx)
  123. return nil
  124. }
  125. // func (a *Activity) AfterUpdate(tx *gorm.DB) error {
  126. // a.createUpdateActivity(tx)
  127. // return nil
  128. // }
  129. func (a *Activity) AfterDelete(tx *gorm.DB) error {
  130. a.deleteActivity(tx)
  131. return nil
  132. }