heritage-api/service/device-service.go

172 lines
4.3 KiB
Go

package service
import (
"errors"
"strings"
"github.com/sirupsen/logrus"
"myschools.me/heritage/heritage-api/model"
"myschools.me/heritage/heritage-api/mysql"
)
func DeviceCreateDevice(d *model.Device) (*model.Device, error) {
if d == nil {
return nil, errors.New("invalid device")
}
d.ID = strings.TrimSpace(d.ID)
if d.ID == "" {
d.ID = newID()
}
d.Name = strings.TrimSpace(d.Name)
d.ModelID = strings.TrimSpace(d.ModelID)
d.SerialNo = strings.TrimSpace(d.SerialNo)
d.StatusCode = strings.TrimSpace(d.StatusCode)
d.PointID = strings.TrimSpace(d.PointID)
d.InstalledImage = strings.TrimSpace(d.InstalledImage)
d.Channel1ParamID = strings.TrimSpace(d.Channel1ParamID)
d.Channel2ParamID = strings.TrimSpace(d.Channel2ParamID)
d.Channel3ParamID = strings.TrimSpace(d.Channel3ParamID)
d.CreatorUserID = strings.TrimSpace(d.CreatorUserID)
d.Remark = strings.TrimSpace(d.Remark)
if d.Name == "" || d.StatusCode == "" || d.CreatorUserID == "" {
return nil, errors.New("missing required fields")
}
if err := mysql.DeviceCreate(d); err != nil {
logrus.WithFields(logrus.Fields{
"func": "DeviceCreateDevice",
}).Warnf("mysql.DeviceCreate: %v", err)
return nil, err
}
return d, nil
}
func DeviceUpdateDevice(idv string, patch *model.Device) (*model.Device, error) {
did := strings.TrimSpace(idv)
if did == "" {
return nil, ErrNotFound
}
existing, found, err := mysql.DeviceByID(&did)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "DeviceUpdateDevice",
}).Warnf("mysql.DeviceByID: %v", err)
return nil, err
}
if !found || existing == nil {
logrus.WithFields(logrus.Fields{
"func": "DeviceUpdateDevice",
}).Warnf("mysql.DeviceByID: not found")
return nil, ErrNotFound
}
if patch == nil {
return existing, nil
}
if s := strings.TrimSpace(patch.Name); s != "" {
existing.Name = s
}
if s := strings.TrimSpace(patch.ModelID); s != "" {
existing.ModelID = s
}
if s := strings.TrimSpace(patch.SerialNo); s != "" {
existing.SerialNo = s
}
if s := strings.TrimSpace(patch.StatusCode); s != "" {
existing.StatusCode = s
}
if s := strings.TrimSpace(patch.PointID); s != "" {
existing.PointID = s
}
if patch.InstalledAt != nil {
t := *patch.InstalledAt
existing.InstalledAt = &t
}
if s := strings.TrimSpace(patch.InstalledImage); s != "" {
existing.InstalledImage = s
}
if s := strings.TrimSpace(patch.Channel1ParamID); s != "" {
existing.Channel1ParamID = s
}
if s := strings.TrimSpace(patch.Channel2ParamID); s != "" {
existing.Channel2ParamID = s
}
if s := strings.TrimSpace(patch.Channel3ParamID); s != "" {
existing.Channel3ParamID = s
}
if s := strings.TrimSpace(patch.CreatorUserID); s != "" {
existing.CreatorUserID = s
}
if s := strings.TrimSpace(patch.Remark); s != "" {
existing.Remark = s
}
ok, err := mysql.DeviceUpdate(existing)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "DeviceUpdateDevice",
}).Warnf("mysql.DeviceUpdate: %v", err)
return nil, err
}
if !ok {
logrus.WithFields(logrus.Fields{
"func": "DeviceUpdateDevice",
}).Warnf("mysql.DeviceUpdate: not found")
return nil, ErrNotFound
}
return existing, nil
}
func DeviceDeleteDevice(idv string) error {
did := strings.TrimSpace(idv)
if did == "" {
return ErrNotFound
}
ok, err := mysql.DeviceDelete(&did)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "DeviceDeleteDevice",
}).Warnf("mysql.DeviceDelete: %v", err)
return err
}
if !ok {
logrus.WithFields(logrus.Fields{
"func": "DeviceDeleteDevice",
}).Warnf("mysql.DeviceDelete: not found")
return ErrNotFound
}
return nil
}
func DeviceGetDevice(idv string) (*model.Device, error) {
did := strings.TrimSpace(idv)
if did == "" {
return nil, ErrNotFound
}
d, found, err := mysql.DeviceByID(&did)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "DeviceGetDevice",
}).Warnf("mysql.DeviceByID: %v", err)
return nil, err
}
if !found || d == nil {
logrus.WithFields(logrus.Fields{
"func": "DeviceGetDevice",
}).Warnf("mysql.DeviceByID: not found")
return nil, ErrNotFound
}
return d, nil
}
func DeviceListDevices(keyword *string, page, size int) ([]model.Device, int64, error) {
if page < 1 {
page = 1
}
if size < 1 {
size = 20
}
if size > 200 {
size = 200
}
offset := (page - 1) * size
return mysql.DeviceList(keyword, &offset, &size)
}