Initial cloud-services repo - gateway service + pkg modules
This commit is contained in:
128
pkg/carcommand/wake_up.go
Normal file
128
pkg/carcommand/wake_up.go
Normal file
@@ -0,0 +1,128 @@
|
||||
package carcommand
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"fiskerinc.com/modules/cache"
|
||||
"fiskerinc.com/modules/db/queries"
|
||||
"fiskerinc.com/modules/grpc/sms"
|
||||
"fiskerinc.com/modules/logger"
|
||||
"fiskerinc.com/modules/redis"
|
||||
"fiskerinc.com/modules/utils/envtool"
|
||||
"fiskerinc.com/modules/validator"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type CarWakeUp struct {
|
||||
db queries.CarsInterface
|
||||
sms sms.SMSServiceClient
|
||||
}
|
||||
|
||||
func NewCarWakeUp(db queries.CarsInterface, sms sms.SMSServiceClient) *CarWakeUp {
|
||||
return &CarWakeUp{
|
||||
db: db,
|
||||
sms: sms,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CarWakeUp) WakeUp(vin string, await bool) error {
|
||||
logger.Debug().Msgf("CarWakeUp.WakeUp %s", vin)
|
||||
car, err := c.db.SelectByVIN(vin)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if car.ICCID == "" {
|
||||
return errors.WithStack(ErrNoICCIDForWakeUp)
|
||||
}
|
||||
|
||||
// KafkaServiceTarget is where the sms delivery status will be sent if await is false
|
||||
// Need to be added to aftersales and ota_update
|
||||
smsWakeUp := sms.SendSMSRequest{
|
||||
ICCID: car.ICCID,
|
||||
MessageText: ".",
|
||||
Await: await,
|
||||
KafkaServiceTarget: envtool.GetEnv("SMS_SERVICE_KAFKA_CALLBACK", "attendant_service"),
|
||||
}
|
||||
|
||||
if ok, err := validator.ValidateICCIDSimple(smsWakeUp.ICCID); !ok || err != nil {
|
||||
err = errors.New("iccid " + smsWakeUp.ICCID + " is invalid")
|
||||
logger.Warn().Err(errors.WithStack(err)).Send()
|
||||
return err
|
||||
}
|
||||
_, err = c.sms.HandleSMSSend(context.Background(), &smsWakeUp)
|
||||
if err != nil {
|
||||
logger.Error().Err(errors.WithStack(err)).Send()
|
||||
return errors.WithStack(ErrWakeUpMessageNotSent)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *CarWakeUp) WakeUpQueue(vin string, await bool) (qs *sms.SMSQueueResponse, err error) {
|
||||
logger.Debug().Msgf("CarWakeUp.WakeUpQueue %s", vin)
|
||||
car, err := c.db.SelectByVIN(vin)
|
||||
if err != nil {
|
||||
return qs, err
|
||||
}
|
||||
|
||||
// If we do not return an ICCID, we still send the message to the SMS service.
|
||||
// The sms service will create a fake wake up message to be used on dev
|
||||
|
||||
smsWakeUp := sms.SendSMSRequest{
|
||||
ICCID: car.ICCID,
|
||||
MessageText: ".",
|
||||
Await: await,
|
||||
}
|
||||
|
||||
qs, err = c.sms.HandleSMSQueue(context.Background(), &smsWakeUp)
|
||||
if err != nil {
|
||||
logger.Error().Err(errors.WithStack(err)).Send()
|
||||
return qs, errors.WithStack(ErrWakeUpMessageNotSent)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// The SMS service currently automatically always calls back to the attendant service, which is not great, as config updates are not sent that way
|
||||
func QueueSMSWakeUp(vin string, await bool, kafkaclient redis.Client, carDB queries.CarsInterface, sms sms.SMSServiceClient) (qs *sms.SMSQueueResponse, err error) {
|
||||
// This new client with every request is bad. These are re-usable
|
||||
wake := NewCarWakeUp(carDB, sms)
|
||||
qs, err = wake.WakeUpQueue(vin, await)
|
||||
if err != nil {
|
||||
level := logger.Error()
|
||||
if errors.Is(err, ErrNoICCIDForWakeUp) ||
|
||||
errors.Is(err, ErrWakeUpMessageNotSent) {
|
||||
level = logger.Warn()
|
||||
}
|
||||
logger.At(level, vin, "sms").Err(err).Send()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func SMSWakeUp(vin string, checkonline bool, clientPool redis.ClientPoolInterface, carDB queries.CarsInterface, sms sms.SMSServiceClient) (err error) {
|
||||
if checkonline {
|
||||
var online bool
|
||||
online, err = cache.IsCarOnline(clientPool, vin)
|
||||
if err != nil {
|
||||
logger.At(logger.Error(), vin, "sms").Err(err).Send()
|
||||
return
|
||||
}
|
||||
if online {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
wake := NewCarWakeUp(carDB, sms)
|
||||
err = wake.WakeUp(vin, true)
|
||||
if err != nil {
|
||||
level := logger.Error()
|
||||
if errors.Is(err, ErrNoICCIDForWakeUp) ||
|
||||
errors.Is(err, ErrWakeUpMessageNotSent) {
|
||||
level = logger.Warn()
|
||||
}
|
||||
logger.At(level, vin, "sms").Err(err).Send()
|
||||
}
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user