Files
cloud-services/services/ota_update_go/services/foa.go

85 lines
2.0 KiB
Go

package services
import (
"net/http"
"net/url"
"slices"
"sync"
"github.com/fiskerinc/cloud-services/pkg/common"
s "github.com/fiskerinc/cloud-services/pkg/common/carupdatestatus"
"github.com/fiskerinc/cloud-services/pkg/foa"
"github.com/fiskerinc/cloud-services/pkg/httpclient"
"github.com/fiskerinc/cloud-services/pkg/logger"
"github.com/fiskerinc/cloud-services/pkg/utils/envtool"
)
var UPDATE_MANIFEST_IDS_TO_NOTIFY_FOA = []int64{816, 817, 818, 819, 820}
var (
foaService FoaServiceInterface
foaOnce sync.Once
)
func GetFoaService() FoaServiceInterface {
foaOnce.Do(func() {
if foaService != nil {
return
}
foaService = NewFoaService()
})
return foaService
}
func SetFoaService(foa FoaServiceInterface) {
foaService = foa
}
func NewFoaService() FoaServiceInterface {
return &FoaService{
foaURL: envtool.GetEnv("FOA_URL", "REPLACE_ME"),
foaAPIToken: envtool.GetEnv("FOA_API_KEY", "REPLACE_ME"),
}
}
type FoaServiceInterface interface {
OtaUpdateStatus(vin string, carUpdate *common.CarUpdate, status *common.CarUpdateProgress) (*http.Response, error)
}
type FoaService struct {
foaURL string
foaAPIToken string
}
func (f *FoaService) OtaUpdateStatus(vin string, carUpdate *common.CarUpdate, status *common.CarUpdateProgress) (*http.Response, error) {
if !slices.Contains(UPDATE_MANIFEST_IDS_TO_NOTIFY_FOA, carUpdate.UpdateManifestID) {
// Nothing to send if the manifest is not one of the specified IDs
return nil, nil
}
var body interface{} = nil
switch status.Status {
case s.Pending:
body = foa.BuildOtaUpdateStatusInProgressRequest(vin, carUpdate.UpdateManifestID)
}
if body == nil {
return nil, nil
}
logger.Info().Msgf("Notifying FOA for %s of update %d status %s", vin, carUpdate.UpdateManifestID, status.Status)
urlString, err := url.JoinPath(f.foaURL, "ota/update_status")
if err != nil {
return nil, err
}
postHeader := http.Header{}
postHeader.Add("Authorization", "Bearer "+f.foaAPIToken)
postHeader.Add("Content-Type", "application/json")
return httpclient.Post(urlString, body, postHeader)
}