package sensors import ( "log/slog" "strings" "time" ) type Service struct { repo Repository } func NewService(repo Repository) *Service { return &Service{ repo: repo, } } func (s *Service) RegisterSensor(sensor Sensor) error { if err := sensor.Validate(); err != nil { slog.Error("error validating sensor", "error", err) return err } err := s.repo.CreateSensor(sensor) if err != nil { slog.Error("error registering sensor", "error", err) if strings.Contains(err.Error(), "duplicate key value") { return ErrSensorAlreadyExists } return ErrRegisteringSensor } return nil } func (s *Service) RegisterSensorData(data SensorData) error { if err := data.Validate(); err != nil { slog.Error("error validating sensor data", "error", err) return err } err := s.repo.CreateSensorData(data) if err != nil { slog.Error("error registering sensor data", "error", err) return err } return nil } func (s *Service) UpdateSensor(sensor Sensor) error { if err := sensor.Validate(); err != nil { slog.Error("error validating sensor data", "error", err) return err } err := s.repo.UpdateSensor(sensor) if err != nil { slog.Error("error updating sensor", "error", err) if strings.Contains(err.Error(), "duplicate key value") { return ErrSensorAlreadyExists } return ErrUpdatingSensor } return nil } func (s *Service) GetSensor(sensor SensorRequest) (Sensor, error) { if err := sensor.Validate(); err != nil { slog.Error("error getting sensor", "error", err) return Sensor{}, err } return s.repo.ReadSensor(sensor.SensorID) } func (s *Service) GetValues(sensor SensorDataRequest) ([]SensorData, error) { if err := sensor.Validate(); err != nil { slog.Error("error validating sensor data request", "error", err) return []SensorData{}, err } from, err := time.Parse(time.RFC3339, *sensor.From) if err != nil { slog.Error("error parsing from date", "error", err) return []SensorData{}, err } to, err := time.Parse(time.RFC3339, *sensor.To) if err != nil { slog.Error("error parsing to date", "error", err) return []SensorData{}, err } return s.repo.ReadSensorValues(sensor.SensorID, from, to) } func (s *Service) ListSensors() ([]Sensor, error) { return s.repo.ReadAllSensors() }