nats-app/internal/domains/sensors/domain.go

115 lines
2.4 KiB
Go

package sensors
import (
"errors"
"slices"
"time"
)
func (s *Sensor) Validate() error {
if s.SensorID == "" {
return ErrInvalidSensorIdentifier
}
if s.SensorType == "" {
return ErrInvalidSensorType
}
validTypes := []SType{Temperature, Humidity, CarbonDioxide, Pressure, Proximity, Light}
isValid := slices.Contains(validTypes, s.SensorType)
if !isValid {
return ErrInvalidSensorType
}
if s.SamplingInterval == nil {
defaultInterval := time.Second * 3600
s.SamplingInterval = &defaultInterval
}
if s.ThresholdAbove == nil {
defaultAbove := 100.0
s.ThresholdAbove = &defaultAbove
}
if s.ThresholdBelow == nil {
defaultBelow := 0.0
s.ThresholdBelow = &defaultBelow
}
return nil
}
func (d *SensorData) Validate() error {
if d.SensorID == "" {
return ErrInvalidSensorIdentifier
}
if d.Value == nil {
return ErrMissingValue
}
if d.Timestamp == nil {
now := time.Now()
d.Timestamp = &now
}
return nil
}
// TODO: implement this in service layer for alerts
func (d *SensorData) IsOutOfRangeAbove(sensor Sensor) bool {
if d.Value == nil || sensor.ThresholdAbove == nil {
return false
}
return *d.Value > *sensor.ThresholdAbove
}
func (d *SensorData) IsOutOfRangeBelow(sensor Sensor) bool {
if d.Value == nil || sensor.ThresholdBelow == nil {
return false
}
return *d.Value < *sensor.ThresholdBelow
}
func (r *SensorRequest) Validate() error {
if r.SensorID == "" {
return ErrInvalidSensorIdentifier
}
return nil
}
func (r *SensorDataRequest) Validate() error {
if r.SensorID == "" {
return ErrInvalidSensorIdentifier
}
if r.To == nil || *r.To == "" {
defaultTo := time.Now().Format(time.RFC3339)
r.To = &defaultTo
} else {
if _, err := time.Parse(time.RFC3339, *r.To); err != nil {
defaultTo := time.Now().Format(time.RFC3339)
r.To = &defaultTo
}
}
if r.From == nil || *r.From == "" {
defaultFrom := time.Now().AddDate(0, 0, -7).Format(time.RFC3339)
r.From = &defaultFrom
} else {
if _, err := time.Parse(time.RFC3339, *r.From); err != nil {
defaultFrom := time.Now().AddDate(0, 0, -7).Format(time.RFC3339)
r.From = &defaultFrom
}
}
return nil
}
var (
ErrInvalidSensorIdentifier = errors.New("sensor identifier is required")
ErrInvalidSensorType = errors.New("sensor type is required")
ErrSensorNotFound = errors.New("sensor not found")
ErrMissingValue = errors.New("sensor value no provided")
ErrSensorAlreadyExists = errors.New("sensor already exists")
)