teachers.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package api
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "github.com/gorilla/mux"
  8. "gogs.carducci-dante.gov.it/karmen/core/orm"
  9. "gogs.carducci-dante.gov.it/karmen/core/renderer"
  10. "gogs.carducci-dante.gov.it/karmen/datasource/edt"
  11. )
  12. func teachersHandler() http.Handler {
  13. fn := func(w http.ResponseWriter, r *http.Request) {
  14. teachers, err := orm.GetTeachersAll()
  15. if err != nil {
  16. renderer.Render[r.URL.Query()["format"][0]](w, r, err)
  17. } else {
  18. renderer.Render[r.URL.Query()["format"][0]](w, r, teachers, r.URL.Query())
  19. }
  20. }
  21. return http.HandlerFunc(fn)
  22. }
  23. func teacherShowHandler() http.Handler {
  24. fn := func(w http.ResponseWriter, r *http.Request) {
  25. teacher, err := orm.GetTeacherAll(mux.Vars(r)["id"])
  26. if err != nil {
  27. renderer.Render[r.URL.Query()["format"][0]](w, r, err)
  28. } else {
  29. renderer.Render[r.URL.Query()["format"][0]](w, r, teacher, r.URL.Query())
  30. }
  31. }
  32. return http.HandlerFunc(fn)
  33. }
  34. func teachersAddHandler() http.Handler {
  35. fn := func(w http.ResponseWriter, r *http.Request) {
  36. if r.Method == "GET" {
  37. teacher, err := orm.GetTeacher(mux.Vars(r)["id"])
  38. if err != nil {
  39. renderer.Render[r.URL.Query()["format"][0]](w, r, err)
  40. } else {
  41. renderer.Render[r.URL.Query()["format"][0]](w, r, teacher, r.URL.Query())
  42. }
  43. } else if r.Method == "POST" {
  44. teacher := new(orm.Teacher)
  45. err := renderer.Decode(teacher, r)
  46. if err != nil {
  47. panic(err)
  48. }
  49. _, err = orm.CreateTeacher(teacher)
  50. if err != nil {
  51. panic(err)
  52. }
  53. http.Redirect(w, r, fmt.Sprintf("/teachers/%d?format=html&tpl_layout=base&tpl_content=teachers_show", teacher.ID), http.StatusSeeOther)
  54. }
  55. }
  56. return http.HandlerFunc(fn)
  57. }
  58. func teachersDeleteHandler() http.Handler {
  59. fn := func(w http.ResponseWriter, r *http.Request) {
  60. teacher, err := orm.GetTeacher(mux.Vars(r)["id"])
  61. if err != nil {
  62. panic(err)
  63. }
  64. if err := orm.DeleteTeacher(teacher); err != nil {
  65. panic(err)
  66. }
  67. var data struct {
  68. RedirectUrl string `json:"redirect_url"`
  69. }
  70. data.RedirectUrl = "/teachers?format=html&tpl_layout=base&tpl_content=teachers"
  71. w.Header().Set("Content-Type", "application/json")
  72. json.NewEncoder(w).Encode(data)
  73. }
  74. return http.HandlerFunc(fn)
  75. }
  76. func teacherUpdateHandler() http.Handler {
  77. fn := func(w http.ResponseWriter, r *http.Request) {
  78. if r.Method == "GET" {
  79. teacher, err := orm.GetTeacher(mux.Vars(r)["id"])
  80. if err != nil {
  81. renderer.Render[r.URL.Query()["format"][0]](w, r, err)
  82. } else {
  83. renderer.Render[r.URL.Query()["format"][0]](w, r, teacher, r.URL.Query())
  84. }
  85. } else if r.Method == "POST" {
  86. teacher, err := orm.GetTeacher(mux.Vars(r)["id"])
  87. if err != nil {
  88. panic(err)
  89. }
  90. err = renderer.Decode(teacher, r)
  91. if err != nil {
  92. panic(err)
  93. }
  94. _, err = orm.SaveTeacher(teacher)
  95. if err != nil {
  96. panic(err)
  97. }
  98. http.Redirect(w, r, fmt.Sprintf("/teachers/%d?format=html&tpl_layout=base&tpl_content=teachers_show", teacher.ID), http.StatusSeeOther)
  99. }
  100. }
  101. return http.HandlerFunc(fn)
  102. }
  103. func teachersCheckUsernameHandler() http.Handler {
  104. fn := func(w http.ResponseWriter, r *http.Request) {
  105. var teacher orm.Teacher
  106. var data struct {
  107. Exists bool `json:"exists"`
  108. }
  109. if orm.DB().Where("username = ?", mux.Vars(r)["username"]).Find(&teacher).RecordNotFound() {
  110. data.Exists = false
  111. } else {
  112. data.Exists = true
  113. }
  114. w.Header().Set("Content-Type", "application/json")
  115. json.NewEncoder(w).Encode(data)
  116. }
  117. return http.HandlerFunc(fn)
  118. }
  119. func teachersImportHandler() http.Handler {
  120. fn := func(w http.ResponseWriter, r *http.Request) {
  121. r.ParseMultipartForm(32 << 20)
  122. file, _, err := r.FormFile("teachers_import")
  123. if err != nil {
  124. panic(err)
  125. }
  126. defer file.Close()
  127. data, err := ioutil.ReadAll(file)
  128. if err != nil {
  129. panic(err)
  130. }
  131. if importer, err := edt.NewImporter(
  132. string(data),
  133. map[string]string{
  134. "COGNOME": "surname",
  135. "NOME": "name",
  136. },
  137. ); err != nil {
  138. panic(err)
  139. } else {
  140. if err := orm.Import(&orm.Teacher{}, importer); err != nil {
  141. panic(err)
  142. }
  143. http.Redirect(w, r, "/teachers", http.StatusSeeOther)
  144. }
  145. }
  146. return http.HandlerFunc(fn)
  147. }