PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/core/user.go

https://gitlab.com/vafl/vafl
Go | 117 lines | 103 code | 14 blank | 0 comment | 23 complexity | af47dd42e0e7cc630b24c32752369cc1 MD5 | raw file
  1. package core
  2. import (
  3. "gitlab.com/vafl/vafl/utils"
  4. "golang.org/x/net/context"
  5. "golang.org/x/oauth2"
  6. "google.golang.org/api/classroom/v1"
  7. )
  8. type User struct {
  9. Vafl *Vafl
  10. Id string
  11. FirstName string
  12. LastName string
  13. AccessToken string
  14. srv *classroom.Service
  15. }
  16. func (u *User) InitializeService() {
  17. ctx := context.Background()
  18. client := oauth2.NewClient(ctx, oauth2.StaticTokenSource(&oauth2.Token{AccessToken: u.AccessToken}))
  19. srv, err := classroom.New(client)
  20. utils.PanicIf(err)
  21. u.srv = srv
  22. }
  23. func (u *User) InitializeFields() error {
  24. if u.srv == nil {
  25. u.InitializeService()
  26. }
  27. up, err := u.srv.UserProfiles.Get("me").Do()
  28. if err != nil {
  29. return err
  30. }
  31. u.FirstName = up.Name.GivenName
  32. u.LastName = up.Name.FamilyName
  33. return nil
  34. }
  35. func (u *User) GetTeachingCourses() ([]*classroom.Course, error) {
  36. res, err := u.srv.Courses.List().TeacherId("me").Do()
  37. if err != nil {
  38. return nil, err
  39. }
  40. retcourses := []*classroom.Course{}
  41. for _, c := range res.Courses {
  42. if c.CourseState == "ACTIVE" {
  43. retcourses = append(retcourses, c)
  44. }
  45. }
  46. return retcourses, nil
  47. }
  48. func (u *User) GetAvailableTests() ([]TestAttempt, error) {
  49. res, err := u.Vafl.Database.Query(`SELECT tests.id,tests.name,testattempt.cid
  50. FROM testattempt JOIN tests ON tid=tests.id
  51. WHERE uid=$1
  52. AND tests.end > now()
  53. AND tests.start < now()
  54. AND NOT EXISTS
  55. (SELECT 1 FROM testscore
  56. WHERE testattempt.tid=testscore.tid
  57. AND testscore.sid = testattempt.uid)`, u.Id)
  58. if err != nil {
  59. return nil, err
  60. }
  61. var tests []TestAttempt
  62. for res.Next() {
  63. tst := TestAttempt{}
  64. err := res.Scan(&tst.Test.Id, &tst.Test.Name, &tst.Container)
  65. if err != nil {
  66. return nil, err
  67. }
  68. tests = append(tests, tst)
  69. }
  70. return tests, nil
  71. }
  72. func (u *User) IsTeacher() bool {
  73. res, err := u.srv.Courses.List().TeacherId("me").Do()
  74. if err != nil {
  75. return false
  76. }
  77. if len(res.Courses) == 0 {
  78. return false
  79. }
  80. return true
  81. }
  82. func (u *User) GetCourse(courseID string) (Course, error) {
  83. c := Course{}
  84. cres, err := u.srv.Courses.Get(courseID).Do()
  85. if err != nil {
  86. return c, err
  87. }
  88. c.Name = cres.Name
  89. sres, err := u.srv.Courses.Students.List(courseID).Do()
  90. if err != nil {
  91. return c, err
  92. }
  93. var users []User
  94. for _, s := range sres.Students {
  95. u := User{}
  96. u.Id = s.UserId
  97. u.FirstName = s.Profile.Name.GivenName
  98. u.LastName = s.Profile.Name.FamilyName
  99. users = append(users, u)
  100. }
  101. c.Students = users
  102. return c, nil
  103. }