選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

115 行
3.1 KiB

  1. package controller
  2. import (
  3. "context"
  4. "encoding/json"
  5. "log/slog"
  6. "net/http"
  7. "strconv"
  8. "github.com/AFASystems/presence/internal/pkg/api/response"
  9. "github.com/AFASystems/presence/internal/pkg/model"
  10. "github.com/AFASystems/presence/internal/pkg/validation"
  11. "github.com/gorilla/mux"
  12. "gorm.io/gorm"
  13. )
  14. func TrackerZoneAddController(db *gorm.DB, context context.Context) http.HandlerFunc {
  15. return func(w http.ResponseWriter, r *http.Request) {
  16. var tz model.TrackerZones
  17. if err := json.NewDecoder(r.Body).Decode(&tz); err != nil {
  18. response.BadRequest(w, "invalid request body")
  19. return
  20. }
  21. if err := validation.Struct(&tz); err != nil {
  22. response.BadRequest(w, err.Error())
  23. return
  24. }
  25. if err := db.WithContext(context).Create(&tz).Error; err != nil {
  26. response.InternalError(w, "failed to create tracker zone", err)
  27. return
  28. }
  29. response.JSON(w, http.StatusCreated, map[string]string{"status": "created"})
  30. }
  31. }
  32. func TrackerZoneListController(db *gorm.DB, context context.Context) http.HandlerFunc {
  33. return func(w http.ResponseWriter, r *http.Request) {
  34. query := r.URL.Query()
  35. lStr := query.Get("limit")
  36. if lStr == "" {
  37. lStr = "100"
  38. }
  39. limit, err := strconv.Atoi(lStr)
  40. if err != nil {
  41. slog.Error("invalid limit parameter", "value", lStr)
  42. response.BadRequest(w, "invalid limit parameter")
  43. return
  44. }
  45. oStr := query.Get("offset")
  46. if oStr == "" {
  47. oStr = "0"
  48. }
  49. offset, err := strconv.Atoi(oStr)
  50. if err != nil {
  51. slog.Error("invalid offset parameter", "value", oStr)
  52. response.BadRequest(w, "invalid offset parameter")
  53. return
  54. }
  55. var list []model.TrackerZones
  56. if err := db.WithContext(context).Limit(limit).Offset(offset).Find(&list).Error; err != nil {
  57. response.InternalError(w, "failed to list tracker zones", err)
  58. return
  59. }
  60. response.JSON(w, http.StatusOK, list)
  61. }
  62. }
  63. func TrackerZoneUpdateController(db *gorm.DB, context context.Context) http.HandlerFunc {
  64. return func(w http.ResponseWriter, r *http.Request) {
  65. var tz model.TrackerZones
  66. if err := json.NewDecoder(r.Body).Decode(&tz); err != nil {
  67. response.BadRequest(w, "invalid request body")
  68. return
  69. }
  70. if err := validation.Struct(&tz); err != nil {
  71. response.BadRequest(w, err.Error())
  72. return
  73. }
  74. id := tz.ID
  75. if err := db.WithContext(context).First(&model.TrackerZones{}, "id = ?", id).Error; err != nil {
  76. response.NotFound(w, "tracker zone not found")
  77. return
  78. }
  79. if err := db.WithContext(context).Save(&tz).Error; err != nil {
  80. response.InternalError(w, "failed to update tracker zone", err)
  81. return
  82. }
  83. response.JSON(w, http.StatusOK, map[string]string{"status": "updated"})
  84. }
  85. }
  86. func TrackerZoneDeleteController(db *gorm.DB, context context.Context) http.HandlerFunc {
  87. return func(w http.ResponseWriter, r *http.Request) {
  88. id := mux.Vars(r)["id"]
  89. res := db.WithContext(context).Delete(&model.TrackerZones{}, "id = ?", id)
  90. if res.RowsAffected == 0 {
  91. response.NotFound(w, "tracker zone not found")
  92. return
  93. }
  94. if res.Error != nil {
  95. response.InternalError(w, "failed to delete tracker zone", res.Error)
  96. return
  97. }
  98. response.JSON(w, http.StatusOK, map[string]string{"status": "deleted"})
  99. }
  100. }