From b0a0f9290e7c845785ac2053a0495abba6ae2af4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20=C3=85hall?= Date: Tue, 30 Apr 2024 21:23:05 +0200 Subject: [PATCH] Trigger expression evaluated and problems managed --- main.go | 36 ++++++++++++++++++++++++++++++++++-- problem.go | 40 ++++++++++++++++++++++++++++++++++++++-- trigger.go | 26 ++++++++++---------------- 3 files changed, 82 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index 3020763..4d9101a 100644 --- a/main.go +++ b/main.go @@ -172,10 +172,42 @@ func entryDatapoint(w http.ResponseWriter, r *http.Request, sess *session.T) { / var triggers []Trigger triggers, err = TriggersRetrieveByDatapoint(dpoint) - for _, trigger := range triggers { - trigger.Run() + if err != nil { + logger.Error("entry", "error", err) } + for _, trigger := range triggers { + var out any + out, err = trigger.Run() + if err != nil { + err = we.Wrap(err).Log() + logger.Error("entry", "error", err) + + } + logger.Debug("entry", "datapoint", dpoint, "value", value, "trigger", trigger, "result", out) + switch v := out.(type) { + case bool: + // Trigger returning true - a problem occured + if v { + err = ProblemStart(trigger) + if err != nil { + err = we.Wrap(err).Log() + logger.Error("entry", "error", err) + } + } else { + err = ProblemClose(trigger) + if err != nil { + err = we.Wrap(err).Log() + logger.Error("entry", "error", err) + } + } + + default: + err := fmt.Errorf(`Expression for trigger %s not returning bool (%T)`, trigger.Name, v) + logger.Info("entry", "error", err) + we.Wrap(err).WithData(v).Log() + } + } j, _ := json.Marshal(struct{ OK bool }{true}) w.Write(j) diff --git a/problem.go b/problem.go index 4c7b00e..ab3b149 100644 --- a/problem.go +++ b/problem.go @@ -2,10 +2,10 @@ package main import ( // External - // we "git.gibonuddevalla.se/go/wrappederror" + we "git.gibonuddevalla.se/go/wrappederror" // Standard - // "encoding/json" + "database/sql" ) /* @@ -18,3 +18,39 @@ type Problem struct { } */ +func ProblemStart(trigger Trigger) (err error) { + row := service.Db.Conn.QueryRow(` + SELECT COUNT(id) + FROM problem + WHERE + trigger_id = $1 AND + "end" IS NULL + GROUP BY trigger_id + `, + trigger.ID, + ) + var openProblems int + err = row.Scan(&openProblems) + if err != nil && err != sql.ErrNoRows { + err = we.Wrap(err).WithData(trigger.ID) + return + } + + // Open up a new problem if no open exists. + if openProblems == 0 { + _, err = service.Db.Conn.Exec(`INSERT INTO problem(trigger_id) VALUES($1)`, trigger.ID) + if err != nil { + err = we.Wrap(err).WithData(trigger) + } + } + return +} + +func ProblemClose(trigger Trigger) (err error) { + _, err = service.Db.Conn.Exec(`UPDATE problem SET "end"=NOW() WHERE trigger_id=$1 AND "end" IS NULL`, trigger.ID) + if err != nil { + err = we.Wrap(err).WithData(trigger) + return + } + return +} diff --git a/trigger.go b/trigger.go index a7944d5..eaa797d 100644 --- a/trigger.go +++ b/trigger.go @@ -4,7 +4,6 @@ import ( // External we "git.gibonuddevalla.se/go/wrappederror" "github.com/expr-lang/expr" - "github.com/jmoiron/sqlx" // Standard "encoding/json" @@ -76,31 +75,26 @@ func TriggersRetrieve() (areas []Area, err error) { // {{{ } // }}} func TriggersRetrieveByDatapoint(datapointName string) (triggers []Trigger, err error) { // {{{ triggers = []Trigger{} - var rows *sqlx.Rows - - rows, err = service.Db.Conn.Queryx(` - SELECT - * - FROM public."trigger" + row := service.Db.Conn.QueryRow(` + SELECT jsonb_agg(t.*) + FROM public."trigger" t WHERE datapoints @> $1 `, fmt.Sprintf(`["%s"]`, datapointName), ) + + var data []byte + err = row.Scan(&data) if err != nil { err = we.Wrap(err).WithData(datapointName) return } - defer rows.Close() - for rows.Next() { - trigger := Trigger{} - err = rows.StructScan(&trigger) - if err != nil { - err = we.Wrap(err).WithData(datapointName) - return - } - triggers = append(triggers, trigger) + err = json.Unmarshal(data, &triggers) + if err != nil { + err = we.Wrap(err).WithData(datapointName) + return } return