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

103 lines
2.2 KiB
Go

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()
}