class.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package orm
  2. import (
  3. "errors"
  4. "strconv"
  5. "github.com/jinzhu/gorm"
  6. )
  7. var (
  8. selectClassActivities = "SELECT * FROM activities WHERE class_id=?"
  9. // SELECT activities.id AS activity_id,teachers.name,teachers.surname,subjects.name AS subject,activities.hours FROM activities
  10. // INNER JOIN teachers ON teachers.id=activities.teacher_id
  11. // INNER JOIN subjects ON subjects.id=activities.subject_id
  12. // WHERE class_id=? AND activities.deleted_at IS NULL `
  13. selectUniqueClassTeachers = `
  14. SELECT surname FROM (SELECT activities.id as activity_id,teachers.name,teachers.surname,subjects.name as subject,activities.hours from activities
  15. inner join teachers on teachers.id=activities.teacher_id
  16. inner join subjects on subjects.id=activities.subject_id
  17. where class_id=?) as activities GROUP BY surname`
  18. )
  19. type Class struct {
  20. gorm.Model
  21. Name string
  22. CoordinatorID uint `schema:"coordinator_id"`
  23. MinuterID uint `schema:"minuter_id"`
  24. Coordinator Teacher
  25. Minuter Teacher
  26. Teachers []*Teacher
  27. Activities []*Activity
  28. Students []*Student
  29. }
  30. func GetClasses() ([]*Class, error) {
  31. var classes []*Class
  32. if err := DB().Order("name").Find(&classes).Error; err != nil {
  33. return nil, err
  34. }
  35. return classes, nil
  36. }
  37. func (c *Class) GetTeachers() ([]*Teacher, error) {
  38. if err := DB().Raw(selectUniqueClassTeachers, c.ID).Scan(&c.Teachers).Error; err != nil {
  39. return nil, err
  40. }
  41. return c.Teachers, nil
  42. }
  43. func GetClassesAll() ([]*Class, error) {
  44. var classes []*Class
  45. if err := DB().Order("name").Find(&classes).Error; err != nil {
  46. return nil, err
  47. }
  48. for _, class := range classes {
  49. class.GetTeachers()
  50. }
  51. return classes, nil
  52. }
  53. func GetClass(id string) (*Class, error) {
  54. var class Class
  55. if err := DB().First(&class, id).Error; err != nil {
  56. return nil, err
  57. }
  58. if err := DB().Raw(selectUniqueClassTeachers, id).Scan(&class.Teachers).Error; err != nil {
  59. return nil, err
  60. }
  61. if err := DB().Raw(selectClassActivities, id).Scan(&class.Activities).Error; err != nil {
  62. return nil, err
  63. }
  64. for _, teacher := range class.Teachers {
  65. teacher.GetActivitiesByClass(strconv.Itoa(int(class.ID)))
  66. }
  67. if class.CoordinatorID != 0 {
  68. if !DB().First(&class.Coordinator, class.CoordinatorID).RecordNotFound() {
  69. if err := DB().First(&class.Coordinator, class.CoordinatorID).Error; err != nil {
  70. return nil, err
  71. }
  72. }
  73. }
  74. if class.MinuterID != 0 {
  75. if !DB().First(&class.Minuter, class.MinuterID).RecordNotFound() {
  76. if err := DB().First(&class.Minuter, class.MinuterID).Error; err != nil {
  77. return nil, err
  78. }
  79. }
  80. }
  81. return &class, nil
  82. }
  83. func (t *Class) Create(db *gorm.DB, record map[string]interface{}) error {
  84. result := new(Class)
  85. if name := record["name"]; name == nil {
  86. return errors.New("Error in creating class: field name is empty")
  87. } else {
  88. result.Name = name.(string)
  89. }
  90. db.Create(result)
  91. return nil
  92. }