diff options
Diffstat (limited to 'hived/alertHandlers.go')
-rw-r--r-- | hived/alertHandlers.go | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/hived/alertHandlers.go b/hived/alertHandlers.go new file mode 100644 index 0000000..fd49835 --- /dev/null +++ b/hived/alertHandlers.go @@ -0,0 +1,188 @@ +package main + +import ( + "context" + "encoding/json" + "net/http" + "time" + + "github.com/rs/zerolog/log" +) + +func (alertHandler Handler) HandleAlertPost(writer http.ResponseWriter, request *http.Request) { + var bodyJSON addAlertJSONType + + writer.Header().Add("Content-Type", "application/json") + + err := json.NewDecoder(request.Body).Decode(&bodyJSON) + if err != nil { + log.Printf(err.Error()) + + err := json.NewEncoder(writer).Encode(map[string]interface{}{ + "isSuccessful": false, + "error": "not all parameters are valid.", + }) + if err != nil { + log.Error().Err(err) + http.Error(writer, "internal server error", http.StatusInternalServerError) + } + } + + if bodyJSON.Name == "" || bodyJSON.Expr == "" { + err := json.NewEncoder(writer).Encode(map[string]interface{}{ + "isSuccessful": false, + "error": "not all parameters are valid.", + }) + if err != nil { + log.Error().Err(errFailedUnmarshall) + http.Error(writer, "internal server error", http.StatusInternalServerError) + } + + return + } + + ctx, cancel := context.WithTimeout(request.Context(), redisContextTimeout*time.Second) + defer cancel() + + key := "alert:" + bodyJSON.Name + alertHandler.rdb.Set(ctx, bodyJSON.Name, bodyJSON.Expr, 0) + alertHandler.rdb.SAdd(ctx, "alertkeys", key) + + err = json.NewEncoder(writer).Encode(map[string]interface{}{ + "isSuccessful": true, + "error": "", + }) + + if err != nil { + log.Error().Err(err) + http.Error(writer, "internal server error", http.StatusInternalServerError) + } +} + +func (alertHandler Handler) HandleAlertDelete(writer http.ResponseWriter, request *http.Request) { + var identifier string + + writer.Header().Add("Content-Type", "application/json") + + params := request.URL.Query() + + for key, value := range params { + switch key { + case "key": + identifier = value[0] + default: + log.Error().Err(errUnknownParam) + } + } + + if identifier == "" { + err := json.NewEncoder(writer).Encode(map[string]interface{}{ + "isSuccessful": false, + "error": "Id parameter is not valid.", + }) + if err != nil { + log.Error().Err(err) + http.Error(writer, "internal server error", http.StatusInternalServerError) + } + + return + } + + ctx, cancel := context.WithTimeout(request.Context(), redisContextTimeout*time.Second) + defer cancel() + + alertHandler.rdb.Del(ctx, identifier) + setKey := "alert:" + identifier + alertHandler.rdb.SRem(ctx, "alertkeys", setKey) + log.Printf(setKey) + + err := json.NewEncoder(writer).Encode(struct { + IsSuccessful bool `json:"isSuccessful"` + Err string `json:"err"` + }{IsSuccessful: true, Err: ""}) + if err != nil { + log.Error().Err(err) + http.Error(writer, "internal server error", http.StatusInternalServerError) + } +} + +func (alertHandler Handler) HandleAlertGet(writer http.ResponseWriter, request *http.Request) { + var identifier string + + writer.Header().Add("Content-Type", "application/json") + + params := request.URL.Query() + for key, value := range params { + switch key { + case "key": + identifier = value[0] + default: + log.Error().Err(errUnknownParam) + } + } + + if identifier == "" { + err := json.NewEncoder(writer).Encode(map[string]interface{}{ + "isSuccessful": false, + "error": "Id parameter is not valid.", + }) + if err != nil { + log.Error().Err(err) + http.Error(writer, "internal server error", http.StatusInternalServerError) + } + + return + } + + ctx, cancel := context.WithTimeout(request.Context(), redisContextTimeout*time.Second) + defer cancel() + + redisResult := alertHandler.rdb.Get(ctx, identifier) + + redisResultString, err := redisResult.Result() + if err != nil { + log.Err(err) + } + + var ErrorString string + if err == nil { + ErrorString = "" + } else { + ErrorString = err.Error() + } + + writer.Header().Add("Content-Type", "application/json") + + err = json.NewEncoder(writer).Encode(struct { + IsSuccessful bool `json:"isSuccessful"` + Error string `json:"error"` + Key string `json:"key"` + Expr string `json:"expr"` + }{IsSuccessful: true, Error: ErrorString, Key: identifier, Expr: redisResultString}) + + if err != nil { + log.Error().Err(err) + http.Error(writer, "internal server error", http.StatusInternalServerError) + } +} + +func alertHandler(writer http.ResponseWriter, request *http.Request) { + addSecureHeaders(&writer) + + handler := Handler{rdb: rdb} + + switch request.Method { + case http.MethodPost: + handler.HandleAlertPost(writer, request) + case http.MethodPut: + http.Error(writer, "Method is not supported.", http.StatusNotFound) + case http.MethodPatch: + http.Error(writer, "Method is not supported.", http.StatusNotFound) + case http.MethodDelete: + handler.HandleAlertDelete(writer, request) + case http.MethodGet: + handler.HandleAlertGet(writer, request) + default: + http.Error(writer, "Method is not supported.", http.StatusNotFound) + } +} |