|
- package controller
-
- import (
- "context"
- "encoding/json"
- "log/slog"
- "net/http"
-
- "github.com/AFASystems/presence/internal/pkg/api/response"
- "github.com/AFASystems/presence/internal/pkg/model"
- "github.com/AFASystems/presence/internal/pkg/service"
- "github.com/AFASystems/presence/internal/pkg/validation"
- "github.com/gorilla/mux"
- "github.com/segmentio/kafka-go"
- "gorm.io/gorm"
- )
-
- func ParserAddController(db *gorm.DB, writer *kafka.Writer, context context.Context) http.HandlerFunc {
- return func(w http.ResponseWriter, r *http.Request) {
- var config model.Config
- if err := json.NewDecoder(r.Body).Decode(&config); err != nil {
- response.BadRequest(w, "invalid request body")
- return
- }
- if err := validation.Struct(&config); err != nil {
- response.BadRequest(w, err.Error())
- return
- }
-
- if err := db.WithContext(context).Create(&config).Error; err != nil {
- response.InternalError(w, "failed to create parser config", err)
- return
- }
-
- kp := model.KafkaParser{
- ID: "add",
- Config: config,
- }
-
- if err := service.SendParserConfig(kp, writer, context); err != nil {
- slog.Error("failed to send parser config to Kafka", "err", err)
- response.InternalError(w, "failed to publish parser config", err)
- return
- }
-
- response.JSON(w, http.StatusCreated, map[string]string{"status": "created"})
- }
- }
-
- func ParserListController(db *gorm.DB, context context.Context) http.HandlerFunc {
- return func(w http.ResponseWriter, r *http.Request) {
- var configs []model.Config
- if err := db.WithContext(context).Find(&configs).Error; err != nil {
- response.InternalError(w, "failed to list parser configs", err)
- return
- }
- response.JSON(w, http.StatusOK, configs)
- }
- }
-
- func ParserDeleteController(db *gorm.DB, writer *kafka.Writer, context context.Context) http.HandlerFunc {
- return func(w http.ResponseWriter, r *http.Request) {
- id := mux.Vars(r)["id"]
- res := db.WithContext(context).Delete(&model.Config{}, "name = ?", id)
- if res.RowsAffected == 0 {
- response.NotFound(w, "parser config not found")
- return
- }
- if res.Error != nil {
- response.InternalError(w, "failed to delete parser config", res.Error)
- return
- }
-
- kp := model.KafkaParser{
- ID: "delete",
- Name: id,
- }
-
- if err := service.SendParserConfig(kp, writer, context); err != nil {
- slog.Error("failed to send parser config to Kafka", "err", err)
- response.InternalError(w, "failed to publish parser config deletion", err)
- return
- }
-
- response.JSON(w, http.StatusOK, map[string]string{"status": "deleted"})
- }
- }
-
- func ParserUpdateController(db *gorm.DB, writer *kafka.Writer, context context.Context) http.HandlerFunc {
- return func(w http.ResponseWriter, r *http.Request) {
- id := mux.Vars(r)["id"]
-
- if err := db.WithContext(context).First(&model.Config{}, "name = ?", id).Error; err != nil {
- response.NotFound(w, "parser config not found")
- return
- }
-
- var config model.Config
- if err := json.NewDecoder(r.Body).Decode(&config); err != nil {
- response.BadRequest(w, "invalid request body")
- return
- }
- if err := validation.Struct(&config); err != nil {
- response.BadRequest(w, err.Error())
- return
- }
-
- if err := db.WithContext(context).Save(&config).Error; err != nil {
- response.InternalError(w, "failed to update parser config", err)
- return
- }
-
- kp := model.KafkaParser{
- ID: "update",
- Name: config.Name,
- Config: config,
- }
-
- if err := service.SendParserConfig(kp, writer, context); err != nil {
- slog.Error("failed to send parser config to Kafka", "err", err)
- response.InternalError(w, "failed to publish parser config update", err)
- return
- }
-
- response.JSON(w, http.StatusOK, map[string]string{"status": "updated"})
- }
- }
|