Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

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