DataHouse/models/sensor/sensor.go

209 lines
4.6 KiB
Go

package sensor
import (
"strconv"
"strings"
"github.com/astaxie/beego/orm"
"git.kingpenguin.tk/chteufleur/datahouse.git/models/database"
"git.kingpenguin.tk/chteufleur/datahouse.git/models/notification"
"git.kingpenguin.tk/chteufleur/datahouse.git/models/utils"
)
const (
NOTIFICATION_DELIMITER = ","
)
type SensorTable struct {
Id int64
SensorMAC string
Description string
Interval int64
Notifications string
}
func init() {
orm.RegisterModel(new(SensorTable))
}
func GetSensorByMac(sensorMac string) *SensorTable {
o := orm.NewOrm()
o.Using(database.Alias)
sensor := new(SensorTable)
ret := new(SensorTable)
var maps []orm.Params
_, err := o.QueryTable(sensor).Filter("SensorMAC", sensorMac).Values(&maps)
if err == nil {
for _, m := range maps {
ret.Id = utils.GetInt(m, "Id")
ret.SensorMAC = utils.GetString(m, "SensorMAC")
ret.Description = utils.GetString(m, "Description")
ret.Interval = utils.GetInt(m, "Interval")
ret.Notifications = utils.GetString(m, "Notifications")
break
}
}
return ret
}
func GetAllSensorIds() []int64 {
o := orm.NewOrm()
o.Using(database.Alias)
sensor := new(SensorTable)
var ret []int64
var maps []orm.Params
_, err := o.QueryTable(sensor).Values(&maps)
if err == nil {
for _, m := range maps {
ret = append(ret, utils.GetInt(m, "Id"))
}
}
return ret
}
func GetAllSensor() []SensorTable {
o := orm.NewOrm()
o.Using(database.Alias)
sensor := new(SensorTable)
var ret []SensorTable
var maps []orm.Params
_, err := o.QueryTable(sensor).Values(&maps)
if err == nil {
for _, m := range maps {
r := new(SensorTable)
r.Id = utils.GetInt(m, "Id")
r.SensorMAC = utils.GetString(m, "SensorMAC")
r.Description = utils.GetString(m, "Description")
r.Interval = utils.GetInt(m, "Interval")
r.Notifications = utils.GetString(m, "Notifications")
ret = append(ret, *r)
}
}
return ret
}
func GetSensor(id int64) *SensorTable {
o := orm.NewOrm()
o.Using(database.Alias)
sensor := new(SensorTable)
var ret = new(SensorTable)
var maps []orm.Params
_, err := o.QueryTable(sensor).Filter("Id", id).Values(&maps)
if err == nil {
for _, m := range maps {
ret.Id = utils.GetInt(m, "Id")
ret.SensorMAC = utils.GetString(m, "SensorMAC")
ret.Description = utils.GetString(m, "Description")
ret.Interval = utils.GetInt(m, "Interval")
ret.Notifications = utils.GetString(m, "Notifications")
}
}
return ret
}
func UpdateSensor(mac, description string, interval int64) {
o := orm.NewOrm()
o.Using(database.Alias)
s := GetSensorByMac(mac)
if o.Read(s) == nil {
s.Description = description
s.Interval = interval
o.Update(s)
}
}
func (ss *SensorTable) update() {
o := orm.NewOrm()
o.Using(database.Alias)
mac := ss.SensorMAC
s := GetSensorByMac(mac)
if o.Read(s) == nil {
s.Description = ss.Description
s.Interval = ss.Interval
s.Notifications = ss.Notifications
o.Update(s)
}
}
func UpdateSensorWithNotifications(mac, description string, interval int64, notifications string) {
o := orm.NewOrm()
o.Using(database.Alias)
s := GetSensorByMac(mac)
if o.Read(s) == nil {
s.Description = description
s.Interval = interval
s.Notifications = notifications
o.Update(s)
}
}
func AddSensor(sensorMac string) {
o := orm.NewOrm()
o.Using(database.Alias)
_, _ = o.Insert(&SensorTable{SensorMAC: sensorMac})
}
func DeleteSensorByMac(sensorMac string) {
o := orm.NewOrm()
o.Using(database.Alias)
o.Delete(&SensorTable{SensorMAC: sensorMac})
}
func DeleteSensor(sensorId int64) {
o := orm.NewOrm()
o.Using(database.Alias)
o.Delete(&SensorTable{Id: sensorId})
}
func (s *SensorTable) GetName() string {
ret := s.Description
if s.Description == "" {
ret = s.SensorMAC
}
return ret
}
func (s *SensorTable) GetNotificationsIds() []int64 {
var ret []int64
for _, idStr := range strings.Split(s.Notifications, NOTIFICATION_DELIMITER) {
id, err := strconv.Atoi(idStr)
if err == nil {
ret = append(ret, int64(id))
}
}
return ret
}
func (s *SensorTable) AddNotification(n notification.NotificationCondition) {
s.Notifications += NOTIFICATION_DELIMITER + strconv.FormatInt(n.Id, 10)
s.update()
}
func (s *SensorTable) DeleteNotification(n notification.NotificationCondition) {
newNotificationStr := ""
for _, idStr := range strings.Split(s.Notifications, NOTIFICATION_DELIMITER) {
id, err := strconv.Atoi(idStr)
if err == nil {
if int64(id) != n.Id {
if newNotificationStr != "" {
newNotificationStr += NOTIFICATION_DELIMITER
}
newNotificationStr += idStr
}
}
}
s.Notifications = newNotificationStr
s.update()
}