75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package handlers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
|
|
"github.com/fiskerinc/cloud-services/services/attendant/services"
|
|
|
|
"github.com/fiskerinc/cloud-services/pkg/common"
|
|
fv "github.com/fiskerinc/cloud-services/pkg/flashpackversion"
|
|
"github.com/fiskerinc/cloud-services/pkg/logger"
|
|
"github.com/fiskerinc/cloud-services/pkg/validator"
|
|
)
|
|
|
|
func UpdateCarState(db *services.DB, vin string, data []byte) error {
|
|
logger.Debug().Msgf("UpdateCarState %s", vin)
|
|
var update common.CarStateUpdate
|
|
|
|
err := json.Unmarshal(data, &update)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = validator.ValidateStruct(&update)
|
|
if err != nil {
|
|
logger.Err(err).Interface("CarStateUpdate", update).Str("CarStateUpdateByteValue as string", string(data)).Send()
|
|
return err
|
|
}
|
|
|
|
return processUpdateCarStateECUs(db, vin, update.ECUs)
|
|
}
|
|
|
|
func processUpdateCarStateECUs(db *services.DB, vin string, ecus map[string]common.CarECU) error {
|
|
cache := services.GetCarEcuCache()
|
|
insert := []common.CarECU{}
|
|
errs := []error{}
|
|
|
|
for name, ecu := range ecus {
|
|
ecu.VIN = vin
|
|
ecu.ECU = name
|
|
err := validator.ValidateStruct(&ecu)
|
|
if err != nil {
|
|
logger.Error().Msgf("invalid CarECU %v", err)
|
|
errs = append(errs, err)
|
|
continue
|
|
}
|
|
|
|
if !cache.Exists(ecu.CacheKey(), ecu.HashValues()) {
|
|
insert = append(insert, ecu)
|
|
}
|
|
}
|
|
|
|
if len(insert) == 0 {
|
|
return combineErrors(errs)
|
|
}
|
|
|
|
err := fv.InsertCarECUsAndUpdateFlashpackVersion(db.GetCars(), db.GetCarVersionsLog(), vin, insert)
|
|
if err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
|
|
return combineErrors(errs)
|
|
}
|
|
|
|
func combineErrors(errs []error) error {
|
|
if len(errs) == 0 {
|
|
return nil
|
|
}
|
|
errString := errs[0].Error()
|
|
for i := 1; i < len(errs); i++ {
|
|
errString += " " + errs[i].Error()
|
|
}
|
|
return errors.New(errString)
|
|
}
|