heritage-api/service/point-service.go

173 lines
4.2 KiB
Go

package service
import (
"errors"
"strings"
"github.com/sirupsen/logrus"
"myschools.me/heritage/heritage-api/model"
"myschools.me/heritage/heritage-api/mysql"
)
func PointCreatePoint(p *model.Point) (*model.Point, error) {
if p == nil {
return nil, errors.New("invalid point")
}
p.ID = strings.TrimSpace(p.ID)
if p.ID == "" {
p.ID = newID()
}
p.Name = strings.TrimSpace(p.Name)
p.LocationObjectID = strings.TrimSpace(p.LocationObjectID)
p.StatusCode = strings.TrimSpace(p.StatusCode)
p.Image = strings.TrimSpace(p.Image)
p.ObjectID = strings.TrimSpace(p.ObjectID)
p.IndicatorID = strings.TrimSpace(p.IndicatorID)
p.CreatorPersonID = strings.TrimSpace(p.CreatorPersonID)
p.SensorID = strings.TrimSpace(p.SensorID)
p.CreatedTaskID = strings.TrimSpace(p.CreatedTaskID)
p.Remark = strings.TrimSpace(p.Remark)
if p.Name == "" || p.StatusCode == "" || p.ObjectID == "" || p.IndicatorID == "" || p.CreatorPersonID == "" {
return nil, errors.New("missing required fields")
}
if p.Image == "" {
p.Image = ""
}
if err := mysql.PointCreate(p); err != nil {
logrus.WithFields(logrus.Fields{
"func": "PointCreatePoint",
}).Warnf("mysql.PointCreate: %v", err)
return nil, err
}
return p, nil
}
func PointUpdatePoint(idv string, patch *model.Point) (*model.Point, error) {
pid := strings.TrimSpace(idv)
if pid == "" {
return nil, ErrNotFound
}
existing, found, err := mysql.PointByID(&pid)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "PointUpdatePoint",
}).Warnf("mysql.PointByID: %v", err)
return nil, err
}
if !found || existing == nil {
logrus.WithFields(logrus.Fields{
"func": "PointUpdatePoint",
}).Warnf("mysql.PointByID: not found")
return nil, ErrNotFound
}
if patch == nil {
return existing, nil
}
if s := strings.TrimSpace(patch.Name); s != "" {
existing.Name = s
}
existing.X = patch.X
existing.Y = patch.Y
existing.Z = patch.Z
if s := strings.TrimSpace(patch.LocationObjectID); s != "" {
existing.LocationObjectID = s
}
if s := strings.TrimSpace(patch.StatusCode); s != "" {
existing.StatusCode = s
}
if s := strings.TrimSpace(patch.Image); s != "" {
existing.Image = s
}
if s := strings.TrimSpace(patch.ObjectID); s != "" {
existing.ObjectID = s
}
if s := strings.TrimSpace(patch.IndicatorID); s != "" {
existing.IndicatorID = s
}
if s := strings.TrimSpace(patch.CreatorPersonID); s != "" {
existing.CreatorPersonID = s
}
if s := strings.TrimSpace(patch.SensorID); s != "" {
existing.SensorID = s
}
if s := strings.TrimSpace(patch.CreatedTaskID); s != "" {
existing.CreatedTaskID = s
}
if s := strings.TrimSpace(patch.Remark); s != "" {
existing.Remark = s
}
ok, err := mysql.PointUpdate(existing)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "PointUpdatePoint",
}).Warnf("mysql.PointUpdate: %v", err)
return nil, err
}
if !ok {
logrus.WithFields(logrus.Fields{
"func": "PointUpdatePoint",
}).Warnf("mysql.PointUpdate: not found")
return nil, ErrNotFound
}
return existing, nil
}
func PointDeletePoint(idv string) error {
pid := strings.TrimSpace(idv)
if pid == "" {
return ErrNotFound
}
ok, err := mysql.PointDelete(&pid)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "PointDeletePoint",
}).Warnf("mysql.PointDelete: %v", err)
return err
}
if !ok {
logrus.WithFields(logrus.Fields{
"func": "PointDeletePoint",
}).Warnf("mysql.PointDelete: not found")
return ErrNotFound
}
return nil
}
func PointGetPoint(idv string) (*model.Point, error) {
pid := strings.TrimSpace(idv)
if pid == "" {
return nil, ErrNotFound
}
p, found, err := mysql.PointByID(&pid)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "PointGetPoint",
}).Warnf("mysql.PointByID: %v", err)
return nil, err
}
if !found || p == nil {
logrus.WithFields(logrus.Fields{
"func": "PointGetPoint",
}).Warnf("mysql.PointByID: not found")
return nil, ErrNotFound
}
return p, nil
}
func PointListPoints(objectID, indicatorID, keyword *string, page, size int) ([]model.Point, int64, error) {
if page < 1 {
page = 1
}
if size < 1 {
size = 20
}
if size > 200 {
size = 200
}
offset := (page - 1) * size
return mysql.PointList(objectID, indicatorID, keyword, &offset, &size)
}