Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

128 řádky
3.6 KiB

  1. package controller
  2. import (
  3. "context"
  4. "encoding/json"
  5. "log/slog"
  6. "net/http"
  7. "github.com/AFASystems/presence/internal/pkg/api/response"
  8. "github.com/AFASystems/presence/internal/pkg/model"
  9. "github.com/AFASystems/presence/internal/pkg/service"
  10. "github.com/AFASystems/presence/internal/pkg/validation"
  11. "github.com/gorilla/mux"
  12. "github.com/segmentio/kafka-go"
  13. "gorm.io/gorm"
  14. )
  15. func ParserAddController(db *gorm.DB, writer *kafka.Writer, context context.Context) http.HandlerFunc {
  16. return func(w http.ResponseWriter, r *http.Request) {
  17. var config model.Config
  18. if err := json.NewDecoder(r.Body).Decode(&config); err != nil {
  19. response.BadRequest(w, "invalid request body")
  20. return
  21. }
  22. if err := validation.Struct(&config); err != nil {
  23. response.BadRequest(w, err.Error())
  24. return
  25. }
  26. if err := db.WithContext(context).Create(&config).Error; err != nil {
  27. response.InternalError(w, "failed to create parser config", err)
  28. return
  29. }
  30. kp := model.KafkaParser{
  31. ID: "add",
  32. Config: config,
  33. }
  34. if err := service.SendParserConfig(kp, writer, context); err != nil {
  35. slog.Error("failed to send parser config to Kafka", "err", err)
  36. response.InternalError(w, "failed to publish parser config", err)
  37. return
  38. }
  39. response.JSON(w, http.StatusCreated, map[string]string{"status": "created"})
  40. }
  41. }
  42. func ParserListController(db *gorm.DB, context context.Context) http.HandlerFunc {
  43. return func(w http.ResponseWriter, r *http.Request) {
  44. var configs []model.Config
  45. if err := db.WithContext(context).Find(&configs).Error; err != nil {
  46. response.InternalError(w, "failed to list parser configs", err)
  47. return
  48. }
  49. response.JSON(w, http.StatusOK, configs)
  50. }
  51. }
  52. func ParserDeleteController(db *gorm.DB, writer *kafka.Writer, context context.Context) http.HandlerFunc {
  53. return func(w http.ResponseWriter, r *http.Request) {
  54. id := mux.Vars(r)["id"]
  55. res := db.WithContext(context).Delete(&model.Config{}, "name = ?", id)
  56. if res.RowsAffected == 0 {
  57. response.NotFound(w, "parser config not found")
  58. return
  59. }
  60. if res.Error != nil {
  61. response.InternalError(w, "failed to delete parser config", res.Error)
  62. return
  63. }
  64. kp := model.KafkaParser{
  65. ID: "delete",
  66. Name: id,
  67. }
  68. if err := service.SendParserConfig(kp, writer, context); err != nil {
  69. slog.Error("failed to send parser config to Kafka", "err", err)
  70. response.InternalError(w, "failed to publish parser config deletion", err)
  71. return
  72. }
  73. response.JSON(w, http.StatusOK, map[string]string{"status": "deleted"})
  74. }
  75. }
  76. func ParserUpdateController(db *gorm.DB, writer *kafka.Writer, context context.Context) http.HandlerFunc {
  77. return func(w http.ResponseWriter, r *http.Request) {
  78. id := mux.Vars(r)["id"]
  79. if err := db.WithContext(context).First(&model.Config{}, "name = ?", id).Error; err != nil {
  80. response.NotFound(w, "parser config not found")
  81. return
  82. }
  83. var config model.Config
  84. if err := json.NewDecoder(r.Body).Decode(&config); err != nil {
  85. response.BadRequest(w, "invalid request body")
  86. return
  87. }
  88. if err := validation.Struct(&config); err != nil {
  89. response.BadRequest(w, err.Error())
  90. return
  91. }
  92. if err := db.WithContext(context).Save(&config).Error; err != nil {
  93. response.InternalError(w, "failed to update parser config", err)
  94. return
  95. }
  96. kp := model.KafkaParser{
  97. ID: "update",
  98. Name: config.Name,
  99. Config: config,
  100. }
  101. if err := service.SendParserConfig(kp, writer, context); err != nil {
  102. slog.Error("failed to send parser config to Kafka", "err", err)
  103. response.InternalError(w, "failed to publish parser config update", err)
  104. return
  105. }
  106. response.JSON(w, http.StatusOK, map[string]string{"status": "updated"})
  107. }
  108. }