Initial commit
This commit is contained in:
commit
89f483171a
43 changed files with 2245 additions and 0 deletions
143
trigger.go
Normal file
143
trigger.go
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
// External
|
||||
we "git.gibonuddevalla.se/go/wrappederror"
|
||||
"github.com/expr-lang/expr"
|
||||
|
||||
// Standard
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Trigger struct {
|
||||
ID int
|
||||
Name string
|
||||
SectionID int `db:"section_id"`
|
||||
Expression string
|
||||
Datapoints []string
|
||||
}
|
||||
|
||||
func Foo() {
|
||||
}
|
||||
|
||||
func TriggersRetrieve() (areas []Area, err error) { // {{{
|
||||
areas = []Area{}
|
||||
|
||||
row := service.Db.Conn.QueryRow(`
|
||||
WITH section_triggers AS (
|
||||
SELECT
|
||||
s.id AS id,
|
||||
s.area_id,
|
||||
s.name AS name,
|
||||
jsonb_agg(
|
||||
to_jsonb(t.*)
|
||||
) AS triggers
|
||||
FROM section s
|
||||
LEFT JOIN "trigger" t ON t.section_id = s.id
|
||||
GROUP BY
|
||||
s.id, s.name)
|
||||
|
||||
SELECT
|
||||
jsonb_agg(jsonsections)
|
||||
FROM (
|
||||
SELECT
|
||||
a.id,
|
||||
a.name,
|
||||
jsonb_agg(
|
||||
to_jsonb(
|
||||
s.*
|
||||
)
|
||||
) AS sections
|
||||
FROM area a
|
||||
LEFT JOIN section_triggers s ON s.area_id = a.id
|
||||
GROUP BY
|
||||
a.id, a.name
|
||||
) jsonsections
|
||||
`,
|
||||
)
|
||||
|
||||
var jsonData []byte
|
||||
err = row.Scan(&jsonData)
|
||||
if err != nil {
|
||||
err = we.Wrap(err)
|
||||
return
|
||||
}
|
||||
|
||||
err = json.Unmarshal(jsonData, &areas)
|
||||
if err != nil {
|
||||
err = we.Wrap(err)
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
} // }}}
|
||||
func TriggerRetrieve(id int) (trigger Trigger, err error) { // {{{
|
||||
row := service.Db.Conn.QueryRow(`SELECT to_jsonb(t.*) FROM "trigger" t WHERE id=$1`, id)
|
||||
var jsonData []byte
|
||||
err = row.Scan(&jsonData)
|
||||
if err != nil {
|
||||
err = we.Wrap(err)
|
||||
return
|
||||
}
|
||||
|
||||
err = json.Unmarshal(jsonData, &trigger)
|
||||
return
|
||||
} // }}}
|
||||
func (t *Trigger) Validate() (ok bool, err error) {
|
||||
if strings.TrimSpace(t.Name) == "" {
|
||||
err = fmt.Errorf("Name can't be empty")
|
||||
return
|
||||
}
|
||||
|
||||
if strings.TrimSpace(t.Expression) == "" {
|
||||
err = fmt.Errorf("Expression can't be empty")
|
||||
return
|
||||
}
|
||||
|
||||
return true, nil
|
||||
}
|
||||
func (t *Trigger) Update() (err error) {
|
||||
var ok bool
|
||||
if ok, err = t.Validate(); !ok {
|
||||
return
|
||||
}
|
||||
|
||||
logger.Info("FOO", "trigger", t)
|
||||
_, err = service.Db.Conn.Exec(`
|
||||
UPDATE "trigger"
|
||||
SET
|
||||
name=$2,
|
||||
expression=$3
|
||||
WHERE
|
||||
id=$1
|
||||
`,
|
||||
t.ID,
|
||||
t.Name,
|
||||
t.Expression,
|
||||
)
|
||||
if err != nil {
|
||||
err = we.Wrap(err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (t *Trigger) Run(datapoints map[string]Datapoint) (output any, err error) {
|
||||
env := make(map[string]any)
|
||||
for dpName, dp := range datapoints {
|
||||
env[dpName] = dp.LastDatapointValue.Value()
|
||||
}
|
||||
|
||||
program, err := expr.Compile(t.Expression)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
output, err = expr.Run(program, env)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue