add and improve remove driver function and rename datapoint
This commit is contained in:
@@ -2,7 +2,6 @@ package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
@@ -70,17 +69,13 @@ func (d *Datapoint) Set(path string, set json_dataModels.Set) (bool, error) {
|
||||
if set.Driver == nil {
|
||||
return changed, nil
|
||||
}
|
||||
if set.Driver.Type == "" {
|
||||
return changed, errors.New("driver type missing")
|
||||
}
|
||||
if set.Driver.Bus == "" {
|
||||
return changed, errors.New("driver bus name missing")
|
||||
}
|
||||
|
||||
if d.Drivers == nil {
|
||||
d.Drivers = json_dataModels.NewDrivers()
|
||||
d.Drivers = json_dataModels.Drivers{}
|
||||
}
|
||||
d.Drivers.AddDriver(set.Driver.Type, set.Driver.Bus, set.Driver.Address)
|
||||
d.Drivers.AddDriver(set.Driver)
|
||||
|
||||
changed = true
|
||||
d.UpdateDateTime = time.Now().UnixMilli()
|
||||
|
||||
return changed, nil
|
||||
@@ -99,6 +94,27 @@ func (d *Datapoint) CreateDatapoints(uuids *Uuids, sets ...json_dataModels.Set)
|
||||
|
||||
for _, dp := range sets {
|
||||
|
||||
if dp.Path == "" && dp.Uuid != uuid.Nil {
|
||||
existing := uuids.GetDatapoint(dp.Uuid)
|
||||
_, err := existing.Set("", dp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
created = append(created, json_dataModels.Set{
|
||||
Uuid: existing.Uuid,
|
||||
Path: existing.Path,
|
||||
Type: existing.Type,
|
||||
Value: existing.Value,
|
||||
Rights: existing.ReadWrite,
|
||||
Drivers: &existing.Drivers,
|
||||
Updated: true,
|
||||
HasChild: existing.HasChild,
|
||||
})
|
||||
|
||||
existing.Publish(OnChange)
|
||||
continue
|
||||
}
|
||||
|
||||
parts := strings.Split(dp.Path, ":")
|
||||
|
||||
current := d
|
||||
@@ -106,6 +122,7 @@ func (d *Datapoint) CreateDatapoints(uuids *Uuids, sets ...json_dataModels.Set)
|
||||
if current.Datapoints == nil {
|
||||
current.Datapoints = make(map[string]*Datapoint)
|
||||
}
|
||||
|
||||
if i == len(parts)-1 {
|
||||
// Leaf node: create or update datapoint
|
||||
if existing, ok := current.Datapoints[part]; ok {
|
||||
@@ -126,7 +143,6 @@ func (d *Datapoint) CreateDatapoints(uuids *Uuids, sets ...json_dataModels.Set)
|
||||
})
|
||||
|
||||
existing.Publish(OnChange)
|
||||
|
||||
} else {
|
||||
var uid uuid.UUID = uuid.New()
|
||||
if dp.Uuid != uuid.Nil {
|
||||
@@ -147,8 +163,8 @@ func (d *Datapoint) CreateDatapoints(uuids *Uuids, sets ...json_dataModels.Set)
|
||||
}
|
||||
|
||||
//add uuid to flat map for faster lookup
|
||||
uuids.AddDatapoint(current, ndp)
|
||||
|
||||
renamedDps := uuids.AddDatapoint(current, ndp)
|
||||
created = append(created, renamedDps...)
|
||||
created = append(created, json_dataModels.Set{
|
||||
Uuid: ndp.Uuid,
|
||||
Path: ndp.Path,
|
||||
@@ -183,8 +199,8 @@ func (d *Datapoint) CreateDatapoints(uuids *Uuids, sets ...json_dataModels.Set)
|
||||
}
|
||||
|
||||
//add uuid to flat map for faster lookup
|
||||
uuids.AddDatapoint(current, newDp)
|
||||
|
||||
renamedDps := uuids.AddDatapoint(current, newDp)
|
||||
created = append(created, renamedDps...)
|
||||
created = append(created, json_dataModels.Set{
|
||||
Uuid: newDp.Uuid,
|
||||
Path: newDp.Path,
|
||||
@@ -304,6 +320,8 @@ func (d *Datapoint) UpdateValue(value any) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// removes datapoint and its children if path is given
|
||||
// if path and
|
||||
func (d *Datapoint) RemoveDatapoint(set json_dataModels.Set) (sets []json_dataModels.Set, err error) {
|
||||
parts := strings.Split(set.Path, ":")
|
||||
|
||||
@@ -324,20 +342,35 @@ func (d *Datapoint) RemoveDatapoint(set json_dataModels.Set) (sets []json_dataMo
|
||||
|
||||
toDelete := parts[len(parts)-1]
|
||||
if dp, ok := current.Datapoints[toDelete]; ok {
|
||||
s, p := removeChildren(dp)
|
||||
sets = append(sets, s...)
|
||||
publishes = append(publishes, p...)
|
||||
publishes = append(publishes, json_dataModels.Publish{
|
||||
Event: OnDelete,
|
||||
Uuid: dp.Uuid,
|
||||
Path: dp.Path,
|
||||
})
|
||||
sets = append(sets, json_dataModels.Set{
|
||||
Uuid: dp.Uuid,
|
||||
Path: dp.Path,
|
||||
})
|
||||
delete(current.Datapoints, toDelete)
|
||||
|
||||
//if driver information found, remoove only driver information
|
||||
if set.Driver != nil {
|
||||
dp.RemoveDriver(set.Driver)
|
||||
publishes = append(publishes, json_dataModels.Publish{
|
||||
Event: OnChange,
|
||||
Uuid: dp.Uuid,
|
||||
Path: dp.Path,
|
||||
Drivers: &dp.Drivers,
|
||||
})
|
||||
sets = append(sets, json_dataModels.Set{
|
||||
Uuid: dp.Uuid,
|
||||
Path: dp.Path,
|
||||
Drivers: &dp.Drivers,
|
||||
})
|
||||
} else {
|
||||
s, pubs := removeChildren(dp)
|
||||
sets = append(sets, s...)
|
||||
publishes = append(publishes, pubs...)
|
||||
publishes = append(publishes, json_dataModels.Publish{
|
||||
Event: OnDelete,
|
||||
Uuid: dp.Uuid,
|
||||
Path: dp.Path,
|
||||
})
|
||||
sets = append(sets, json_dataModels.Set{
|
||||
Uuid: dp.Uuid,
|
||||
Path: dp.Path,
|
||||
})
|
||||
delete(current.Datapoints, toDelete)
|
||||
}
|
||||
r := json_data.NewResponse()
|
||||
r.Publish = append(r.Publish, publishes...)
|
||||
|
||||
@@ -442,7 +475,7 @@ func (d *Datapoint) AddSubscribtion(conn *wsModels.Client, sub json_dataModels.S
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Datapoint) RenamePaths(oldPath string) {
|
||||
func (d *Datapoint) RenamePaths(oldPath string) (renamed []json_dataModels.Set) {
|
||||
visited := make(map[*Datapoint]bool)
|
||||
|
||||
if len(d.Datapoints) == 0 {
|
||||
@@ -451,11 +484,22 @@ func (d *Datapoint) RenamePaths(oldPath string) {
|
||||
|
||||
for _, dp := range d.Datapoints {
|
||||
dp.Path = strings.Replace(dp.Path, oldPath, d.Path, 1)
|
||||
dp.renameSubPaths(oldPath, d.Path, visited)
|
||||
renamedDps := dp.renameSubPaths(oldPath, d.Path, visited)
|
||||
renamed = append(renamed, renamedDps...)
|
||||
renamed = append(renamed, json_dataModels.Set{
|
||||
Uuid: dp.Uuid,
|
||||
Path: dp.Path,
|
||||
Type: dp.Type,
|
||||
Value: dp.Value,
|
||||
Rights: dp.ReadWrite,
|
||||
Drivers: &dp.Drivers,
|
||||
HasChild: dp.HasChild,
|
||||
})
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (d *Datapoint) renameSubPaths(oldPath, newPath string, visited map[*Datapoint]bool) {
|
||||
func (d *Datapoint) renameSubPaths(oldPath, newPath string, visited map[*Datapoint]bool) (renamed []json_dataModels.Set) {
|
||||
if visited[d] {
|
||||
return
|
||||
}
|
||||
@@ -467,14 +511,29 @@ func (d *Datapoint) renameSubPaths(oldPath, newPath string, visited map[*Datapoi
|
||||
|
||||
for _, dp := range d.Datapoints {
|
||||
dp.Path = strings.Replace(dp.Path, oldPath, newPath, 1)
|
||||
dp.renameSubPaths(oldPath, newPath, visited)
|
||||
renamedDps := dp.renameSubPaths(oldPath, newPath, visited)
|
||||
renamed = append(renamed, renamedDps...)
|
||||
renamed = append(renamed, json_dataModels.Set{
|
||||
Uuid: dp.Uuid,
|
||||
Path: dp.Path,
|
||||
Type: dp.Type,
|
||||
Value: dp.Value,
|
||||
Rights: dp.ReadWrite,
|
||||
Drivers: &dp.Drivers,
|
||||
HasChild: dp.HasChild,
|
||||
})
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (d *Datapoint) RemoveSubscribtion(client *wsModels.Client) {
|
||||
delete(d.Subscriptions, client)
|
||||
}
|
||||
|
||||
func (d *Datapoint) RemoveDriver(driver *json_dataModels.Driver) {
|
||||
d.Drivers.RemoveDriver(driver)
|
||||
}
|
||||
|
||||
func (d *Datapoint) Publish(eventType string) error {
|
||||
r := json_data.NewResponse()
|
||||
r.AddPublish(json_dataModels.Publish{
|
||||
|
Reference in New Issue
Block a user