package services import ( "basic-sensor-receiver/models" "crypto/rand" "math/big" ) type SensorsService struct { ctx *Context } func (s *SensorsService) GetList() ([]models.SensorItem, error) { sensors := []models.SensorItem{} err := s.ctx.DB.Select(&sensors, "SELECT id, name, auth_key, last_contact_at FROM sensors") if err != nil { return nil, err } return sensors, nil } func (s *SensorsService) Create(name string) (*models.SensorItem, error) { authKey, err := generateRandomString(32) if err != nil { return nil, err } item := models.SensorItem{ Name: name, AuthKey: authKey, } res, err := s.ctx.DB.Exec("INSERT INTO sensors (name, auth_key) VALUES (?, ?)", item.Name, item.AuthKey) if err != nil { return nil, err } item.Id, err = res.LastInsertId() if err != nil { return nil, err } return &item, nil } func (s *SensorsService) GetById(id int64) (*models.SensorItem, error) { item := models.SensorItem{} err := s.ctx.DB.Get(&item, "SELECT id, name, auth_key, last_contact_at FROM sensors WHERE id = $1", id) if err != nil { return nil, err } return &item, nil } func (s *SensorsService) Update(id int64, name string) (*models.SensorItem, error) { item, err := s.GetById(id) if err != nil { return nil, err } item.Name = name _, err = s.ctx.DB.Exec("UPDATE sensors SET name = ? WHERE id = ?", item.Name, item.Id) if err != nil { return nil, err } return item, nil } func (s *SensorsService) DeleteById(id int64) error { item, err := s.GetById(id) if err != nil { return err } _, err = s.ctx.DB.Exec("DELETE FROM sensor_values WHERE sensor_id = ?", item.Id) if err != nil { return err } _, err = s.ctx.DB.Exec("DELETE FROM sensors WHERE id = ?", item.Id) return err } var randomKeySource = []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") func generateRandomString(length int) (string, error) { key := make([]byte, length) for i := range key { value, err := rand.Int(rand.Reader, big.NewInt(int64(len(randomKeySource)))) if err != nil { return "", err } key[i] = randomKeySource[value.Int64()] } return string(key), nil }