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 ( ErrRegisteringSensor = errors.New("error registering sensor") ErrUpdatingSensor = errors.New("error updating sensor") 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") )