package common import ( "encoding/json" "fiskerinc.com/modules/grpc/kafka_grpc" "fiskerinc.com/modules/logger" ) func DepotRouteTRexToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_DepotPayload { switch input.Handler { case "init": return MessageToGRPC(input) } return &kafka_grpc.GRPC_DepotPayload{ Handler: input.Handler, } } func DepotRouteHMIToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_DepotPayload { switch input.Handler { case "init": return HMISessionToGRPC(input) } return &kafka_grpc.GRPC_DepotPayload{ Handler: input.Handler, } } func DepotRouteMobileToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_DepotPayload { return &kafka_grpc.GRPC_DepotPayload{ Handler: input.Handler, } } func MessageToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_DepotPayload { grpcPayload := &kafka_grpc.GRPC_DepotPayload{ Handler: input.Handler, } var data map[string]string err := json.Unmarshal(input.Data, &data) if err != nil || data == nil { return grpcPayload } initPayload := &kafka_grpc.InitPayload{ Data: data, } grpcPayload.Data = &kafka_grpc.GRPC_DepotPayload_InitPayload{ InitPayload: initPayload, } return grpcPayload } // ##################################################################################################### // ################################## Attendant ######################################################## // ##################################################################################################### func AttendantRouteTRexGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { switch input.Handler { case "car_state": return CarStateToGRPC(input) case "car_update_status", "car_update_download", "car_update_install": return CarUpdateToGRPC(input) case "get_filekeys": return CarFileKeysRequestToGRPC(input) case "ecc_keys": return CarUpdateRequestToGRPC(input) case "dtcs": return DTCEntryToGRPC(input) case "sms_delivery_status_manifest": return MessageStatusToGRPC(input) } return &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } } func AttendantRouteHMIGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { switch input.Handler { case "update_approve": return UpdateApprove(input) case "car_update_status", "car_update_download", "car_update_install": return CarUpdateToGRPC(input) case "get_filekeys": return CarFileKeysRequestToGRPC(input) } return &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } } func AttendantRouteMobileGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { switch input.Handler { case "update_approve": if input.Data == nil { break } return UpdateApprove(input) case "updates_get": if input.Data == nil { break } var m map[string]string err := json.Unmarshal(input.Data, &m) if err != nil || m == nil { break } return &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, Data: &kafka_grpc.GRPC_AttendantPayload_UpdateGet{ UpdateGet: &kafka_grpc.VehicleData{ Vin: m["vin"], }, }, } } return &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } } func UpdateApprove(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { var m map[string]int err := json.Unmarshal(input.Data, &m) if err != nil || m == nil { return &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } } return &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, Data: &kafka_grpc.GRPC_AttendantPayload_UpdateApprove{ UpdateApprove: &kafka_grpc.UpdateData{ Id: int64(m["id"]), }, }, } } // tmobile.MessageStatus imp func MessageStatusToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { var m map[string]string err := json.Unmarshal(input.Data, &m) if err != nil || m == nil { return &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } } val, ok := kafka_grpc.EmumStatus_value[m["Status"]] if !ok { return &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } } return &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, Data: &kafka_grpc.GRPC_AttendantPayload_MessageStatus{ MessageStatus: &kafka_grpc.MessageStatus{ MessageId: m["MessageID"], Status: kafka_grpc.EmumStatus(val), }, }, } } func DTCEntryToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { grpcPayload := &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } var dtc CommonDTCEntry err := json.Unmarshal(input.Data, &dtc) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_AttendantPayload_DtcEntry{ DtcEntry: &kafka_grpc.DTCEntry{ Vin: dtc.VIN, Ecu: dtc.ECU, Dtc: dtc.DTC, Timestamp: dtc.CreatedAt.UnixMilli(), CreatedAt: dtc.CreatedAt.UnixMilli(), Speed: uint32(dtc.Speed), Mileage: dtc.Mileage, Volt: uint32(dtc.Voltage), SnapshotBase64: dtc.SnapshotBase64, Status: uint32(dtc.Status), }, } return grpcPayload } func AttendantRouteServiceGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { switch input.Handler { case "send_manifest": return UpdateManifestToGRPC(input) case "order_updated": return OrderToGRPC(input) } return &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } } func CarUpdateRequestToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { grpcPayload := &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } var carState CarUpdateRequest err := json.Unmarshal(input.Data, &carState) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_AttendantPayload_CarUpdateRequest{ CarUpdateRequest: &kafka_grpc.CarUpdateRequest{ CarUpdateId: carState.CarUpdateID, }, } return grpcPayload } func CarStateToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { grpcPayload := &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } var carState CarStateUpdate err := json.Unmarshal(input.Data, &carState) if err != nil { return grpcPayload } var ecuUpdate map[string]*kafka_grpc.CarECU for key, ecu := range carState.ECUs { if ecuUpdate == nil { ecuUpdate = make(map[string]*kafka_grpc.CarECU) } obj := &kafka_grpc.CarECU{ Vin: ecu.VIN, Ecu: ecu.ECU, SwVersion: ecu.Version, SerialNumber: ecu.SerialNumber, HwVersion: ecu.HWVersion, BootLoaderVersion: ecu.BootLoaderVersion, Fingerprint: ecu.Fingerprint, CodeDataString: ecu.Config, Vendor: ecu.Vendor, SupplierSwVersion: ecu.SupplierSWVersion, EpochUsec: ecu.Epoch_usec, AssyNumber: ecu.ASSYNumber, } if ecu.CreatedAt != nil { t := ecu.CreatedAt.UnixMilli() obj.CreatedAt = &t } if ecu.UpdatedAt != nil { t := ecu.UpdatedAt.UnixMilli() obj.UpdatedAt = &t } ecuUpdate[key] = obj } carUpdateStatus := &kafka_grpc.CarUpdateStatus{ Ecus: ecuUpdate, } grpcPayload.Data = &kafka_grpc.GRPC_AttendantPayload_CarUpdateStatus{ CarUpdateStatus: carUpdateStatus, } return grpcPayload } func CarUpdateToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { grpcPayload := &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } var carProg CarUpdateProgress err := json.Unmarshal(input.Data, &carProg) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_AttendantPayload_CarUpdateProgress{ CarUpdateProgress: &kafka_grpc.CarUpdateProgress{ FileCurrent: carProg.FileCurrent, FileTotal: carProg.FileTotal, PkgCurrent: carProg.PackageCurrent, PkgTotal: carProg.PackageTotal, InstalledFiles: int64(carProg.InstalledFiles), TotalFiles: int64(carProg.TotalFiles), CarUpdateID: carProg.CarUpdateID, Ecu: carProg.ECU, Status: carProg.Status, Info: carProg.Info, ErrCode: int64(carProg.ErrorCode), }, } return grpcPayload } func CarFileKeysRequestToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { grpcPayload := &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } var fileReq FileKeysRequest err := json.Unmarshal(input.Data, &fileReq) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_AttendantPayload_FileKeyReq{ FileKeyReq: &kafka_grpc.FileKeysRequest{ FileIDs: fileReq.FileIDs, }, } return grpcPayload } func ECCKeysToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { grpcPayload := &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } var eccKeys []ECCKeys err := json.Unmarshal(input.Data, &eccKeys) if err != nil || len(eccKeys) == 0 { return grpcPayload } var grpcECCKeys []*kafka_grpc.ECCKey for _, eccKey := range eccKeys { grpcECCKey := toKafkaECCKey(&eccKey) grpcECCKeys = append(grpcECCKeys, grpcECCKey) } grpcPayload.Data = &kafka_grpc.GRPC_AttendantPayload_Keys{ Keys: &kafka_grpc.ECCKeys{ EccKeys: grpcECCKeys, }, } return grpcPayload } func HMISessionToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_DepotPayload { grpcPayload := &kafka_grpc.GRPC_DepotPayload{ Handler: input.Handler, } var sessionData HMISessionData err := json.Unmarshal(input.Data, &sessionData) if err != nil { return grpcPayload } hmiSession := &kafka_grpc.HMISessionData{ SessionId: sessionData.SessionID, Vin: sessionData.VIN, Salt: sessionData.Salt, } grpcPayload.Data = &kafka_grpc.GRPC_DepotPayload_HmiSession{ HmiSession: hmiSession, } return grpcPayload } // ##################################################################################################### // ################################## Valet ######################################################## // ##################################################################################################### func ValetRouteTRexPayloadGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { switch input.Handler { case "departure_schedule": return DepartureScheduleToGRPC(input) case "charge_settings": return ChargeSettingToGRPC(input) case "charging_command": return ChargingCMDToGRPC(input) } return &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } } func ChargingCMDToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var m map[string]string err := json.Unmarshal(input.Data, &m) if err != nil || m == nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_ChCMD{ ChCMD: &kafka_grpc.ChargingCommand{ Action: m["action"], }, } return grpcPayload } func DepartureScheduleToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var schedule DepartureSchedule err := json.Unmarshal(input.Data, &schedule) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_DepartureSchedule{ DepartureSchedule: &kafka_grpc.DepartureSchedule{ NextDayDeparture: schedule.NextDayDeparture, }, } if len(schedule.DepartureDays) > 0 { var departureDays []*kafka_grpc.DepartureDay for _, d := range schedule.DepartureDays { departureDays = append(departureDays, &kafka_grpc.DepartureDay{ DayOfWeek: d.DayOfWeek, Time: d.Time, }) } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_DepartureSchedule).DepartureSchedule.DepartureDays = departureDays } return grpcPayload } func ChargeSettingToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var settings ChargeSettings err := json.Unmarshal(input.Data, &settings) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_ChargeSetting{ ChargeSetting: &kafka_grpc.ChargeSettings{ ChargeLimit: int32(settings.ChargeLimit), MaxCurrent: int32(settings.MaxCurrent), }, } if settings.OffPeakCharging != nil { grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_ChargeSetting).ChargeSetting.OffPeakCcharging = &kafka_grpc.OffPeakCharging{ Start: settings.OffPeakCharging.Start.UnixMilli(), End: settings.OffPeakCharging.End.UnixMilli(), } } if settings.MinCharge != nil { minCharge := int32(*settings.MinCharge) grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_ChargeSetting).ChargeSetting.MinCharge = &minCharge } return grpcPayload } func ValetRouteHMIPayloadGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { switch input.Handler { case "ble_key": return BLEKeysToGRPC(input) case "profiles": break case "settings_update": return HMISettingsUpdateToGRPC(input) case "map_history": return HMIMapHistoryToGRPC(input) case "user_pois": return HMIPOIsMessageToGRPC(input) case "consent": return UserConsentFromHMIToGRPC(input) case "profile_delete": return JSONHMIDeleteProfileToGRPC(input) } return &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } } func BLEKeysToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var m map[string]string err := json.Unmarshal(input.Data, &m) if err != nil || m == nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_BLEKey{ BLEKey: &kafka_grpc.BLEKeyRequest{ DriverId: m["driver_id"], BleKey: m["ble_key"], }, } return grpcPayload } func HMISettingsUpdateToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var update HMISettingsUpdate err := json.Unmarshal(input.Data, &update) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_HmiSettingsUpdate{ HmiSettingsUpdate: &kafka_grpc.HMISettingsUpdate{ DriverId: update.DriverID, }, } if len(update.Settings) > 0 { var settings []*kafka_grpc.CarSetting for _, s := range update.Settings { carSetting := &kafka_grpc.CarSetting{ Vin: s.VIN, DriverId: s.DriverID, Name: s.Name, Type: s.Type, Value: s.Value, } if s.CreatedAt != nil { millis := s.CreatedAt.UnixMilli() carSetting.Created = &millis } if s.UpdatedAt != nil { millis := s.UpdatedAt.UnixMilli() carSetting.Updated = &millis } settings = append(settings, carSetting) } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_HmiSettingsUpdate).HmiSettingsUpdate.Settings = settings } return grpcPayload } func HMIMapHistoryToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var history HMIMapHistory err := json.Unmarshal(input.Data, &history) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_HmiMapHistory{ HmiMapHistory: &kafka_grpc.HMIMapHistory{ DriverId: history.DriverID, }, } if len(history.Searches) > 0 { var searches []*kafka_grpc.MapHistory for _, s := range history.Searches { search := &kafka_grpc.MapHistory{ Name: s.Name, Description: s.Description, } if s.Location != nil { search.Location = &kafka_grpc.MapCoordinates{ Latitude: s.Location.Latitude, Longitude: s.Location.Longitude, } } searches = append(searches, search) } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_HmiMapHistory).HmiMapHistory.Searches = searches } return grpcPayload } func HMIPOIsMessageToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var message HMIPOIsMessage err := json.Unmarshal(input.Data, &message) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_HmiPOIsMessage{ HmiPOIsMessage: &kafka_grpc.HMIPOIsMessage{ DriverId: message.DriverID, }, } if len(message.UserPOIs) > 0 { var userPOIs []*kafka_grpc.PointOfInterest for _, poi := range message.UserPOIs { userPOI := &kafka_grpc.PointOfInterest{ Name: poi.Name, } if poi.Location != (POILocation{}) { userPOI.Location = &kafka_grpc.POILocation{ Latitude: poi.Location.Latitude, Longitude: poi.Location.Longitude, } } userPOIs = append(userPOIs, userPOI) } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_HmiPOIsMessage).HmiPOIsMessage.UserPOIs = userPOIs } return grpcPayload } func UserConsentFromHMIToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var consent []UserConsentFromHMI err := json.Unmarshal(input.Data, &consent) if err != nil { return grpcPayload } if len(consent) > 0 { var arr []*kafka_grpc.UserConsent for _, c := range consent { arr = append(arr, &kafka_grpc.UserConsent{ Name: c.Name, Accept: c.Accept, DriverId: c.DriverID, }) } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_UserConsentFromHMI{ UserConsentFromHMI: &kafka_grpc.UserConsentFromHMI{ UserConsent: arr, }, } } return grpcPayload } func JSONHMIDeleteProfileToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var profile JSONHMIDeleteProfile err := json.Unmarshal(input.Data, &profile) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_HmiDeleteProfile{ HmiDeleteProfile: &kafka_grpc.JSONHMIDeleteProfile{ DriverId: profile.DriverID, }, } return grpcPayload } func ValetRouteMobilePayloadGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { switch input.Handler { case "charge_settings_get", "departure_schedule_get": return EmptyMessageFromMobileToGRPC(input) case "remote_command": return RemoteCMDToGRPC(input) case "car_locations", "map_history_get", "profiles", "store_inventory", "user_pois_get": break // no payload for these handlers case "digital_twin": return DigitalTwinRequestToGRPC(input) case "map_destination": return MapDestinationRequestToGRPC(input) case "map_route": return MapRouteRequestToGRPC(input) case "map_history_add": return MapHistoryToGRPC(input) case "settings_update": return MobileSettingsUpdateToGRPC(input) case "charge_settings": return MobileChargeSettingUpdateToGRPC(input) case "store_purchase": return StorePurchasesToGRPC(input) case "user_poi_create": return PointOfInterestToGRPC(input) case "user_poi_edit": return MobilePOIEditMessageToGRPC(input) case "user_poi_delete": return MobilePOIDeleteMessageToGRPC(input) case "departure_schedule": return MobileDepartureScheduleToGRPC(input) case "wake_car": return WakeCarToGRPC(input) case "manual_issue": return AddIssueRequestToGRPC(input) } return &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } } func EmptyMessageFromMobileToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var request EmptyMessageFromMobile err := json.Unmarshal(input.Data, &request) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_EmptyMsg{ EmptyMsg: &kafka_grpc.VIN{ Vin: request.VIN, }, } return grpcPayload } func AddIssueRequestToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var request AddIssueRequest err := json.Unmarshal(input.Data, &request) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_AddIssueReq{ AddIssueReq: &kafka_grpc.AddIssueRequest{ Images: request.Images, }, } issue := &kafka_grpc.Issue{ Vin: request.VIN, Description: request.Description, DriverId: request.DriverID, Id: int32(request.ID), Title: request.Title, Timestamp: request.Timestamp.UnixMilli(), } if len(request.IssueImages) > 0 { var images []*kafka_grpc.IssueImage for _, img := range request.IssueImages { image := &kafka_grpc.IssueImage{ Id: int32(img.ID), Image: img.Image, IssueId: int32(img.IssueID), } images = append(images, image) } issue.Images = images } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_AddIssueReq).AddIssueReq.Issue = issue return grpcPayload } func WakeCarToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var wakeCar EmptyMessageFromMobile err := json.Unmarshal(input.Data, &wakeCar) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_Wakecar{ Wakecar: &kafka_grpc.VIN{ Vin: wakeCar.VIN, }, } return grpcPayload } func MobileDepartureScheduleToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var schedule MobileDepartureSchedule err := json.Unmarshal(input.Data, &schedule) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_MobileDepartureSchedule{ MobileDepartureSchedule: &kafka_grpc.MobileDepartureSchedule{ Vin: schedule.VIN, }, } if schedule.DepartureSchedule.NextDayDeparture != nil || len(schedule.DepartureSchedule.DepartureDays) > 0 { grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_MobileDepartureSchedule).MobileDepartureSchedule.DepartureSchedule = &kafka_grpc.DepartureSchedule{ NextDayDeparture: schedule.DepartureSchedule.NextDayDeparture, } if len(schedule.DepartureSchedule.DepartureDays) > 0 { var departureDays []*kafka_grpc.DepartureDay for _, day := range schedule.DepartureSchedule.DepartureDays { departureDay := &kafka_grpc.DepartureDay{ DayOfWeek: day.DayOfWeek, Time: day.Time, } departureDays = append(departureDays, departureDay) } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_MobileDepartureSchedule).MobileDepartureSchedule.DepartureSchedule.DepartureDays = departureDays } } return grpcPayload } func MobilePOIDeleteMessageToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var message MobilePOIDeleteMessage err := json.Unmarshal(input.Data, &message) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_PoiDelete{ PoiDelete: &kafka_grpc.MobilePOIDeleteMessage{ Name: message.Name, }, } return grpcPayload } func MobilePOIEditMessageToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var message MobilePOIEditMessage err := json.Unmarshal(input.Data, &message) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_PoiEdit{ PoiEdit: &kafka_grpc.MobilePOIEditMessage{ OldName: message.OldName, }, } if message.UserPOI != (PointOfInterest{}) { userPoi := &kafka_grpc.PointOfInterest{ Name: message.UserPOI.Name, } if message.UserPOI.Location != (POILocation{}) { userPoi.Location = &kafka_grpc.POILocation{ Latitude: message.UserPOI.Location.Latitude, Longitude: message.UserPOI.Location.Longitude, } } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_PoiEdit).PoiEdit.UserPoi = userPoi } return grpcPayload } func PointOfInterestToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var poi PointOfInterest err := json.Unmarshal(input.Data, &poi) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_PoiCreate{ PoiCreate: &kafka_grpc.PointOfInterest{ Name: poi.Name, }, } if poi.Location != (POILocation{}) { grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_PoiCreate).PoiCreate.Location = &kafka_grpc.POILocation{ Latitude: poi.Location.Latitude, Longitude: poi.Location.Longitude, } } return grpcPayload } func StorePurchasesToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var purchases StorePurchases err := json.Unmarshal(input.Data, &purchases) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_StorePurchases{ StorePurchases: &kafka_grpc.StorePurchases{ Vin: purchases.VIN, }, } if len(purchases.Purchases) > 0 { var storePurchases []*kafka_grpc.StorePurchaseItem for _, p := range purchases.Purchases { purchase := &kafka_grpc.StorePurchaseItem{ Id: p.ID.String(), } storePurchases = append(storePurchases, purchase) } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_StorePurchases).StorePurchases.Purchases = storePurchases } return grpcPayload } func MobileChargeSettingUpdateToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var setting MobileChargeSetting err := json.Unmarshal(input.Data, &setting) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_MobileChargeSetting{ MobileChargeSetting: &kafka_grpc.MobileChargeSetting{ Vin: setting.VIN, }, } if setting.ChargeSettings != (ChargeSettings{}) { chargeSettings := &kafka_grpc.ChargeSettings{ ChargeLimit: int32(setting.ChargeSettings.ChargeLimit), MaxCurrent: int32(setting.ChargeSettings.MaxCurrent), } if setting.ChargeSettings.OffPeakCharging != nil { chargeSettings.OffPeakCcharging = &kafka_grpc.OffPeakCharging{ Start: setting.ChargeSettings.OffPeakCharging.Start.UnixMilli(), End: setting.ChargeSettings.OffPeakCharging.End.UnixMilli(), } } if setting.ChargeSettings.MinCharge != nil { minCharge := int32(*setting.ChargeSettings.MinCharge) chargeSettings.MinCharge = &minCharge } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_MobileChargeSetting).MobileChargeSetting.ChargeSettings = chargeSettings } return grpcPayload } func MobileSettingsUpdateToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var update MobileSettingsUpdate err := json.Unmarshal(input.Data, &update) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_SettingsUpdate{ SettingsUpdate: &kafka_grpc.MobileSettingsUpdate{ Vin: update.VIN, }, } if len(update.Settings) > 0 { var settings []*kafka_grpc.CarSetting for _, s := range update.Settings { setting := &kafka_grpc.CarSetting{ Vin: s.VIN, DriverId: s.DriverID, Name: s.Name, Value: s.Value, Type: s.Type, } if s.CreatedAt != nil { millis := s.CreatedAt.UnixMilli() setting.Created = &millis } if s.UpdatedAt != nil { millis := s.UpdatedAt.UnixMilli() setting.Updated = &millis } settings = append(settings, setting) } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_SettingsUpdate).SettingsUpdate.Settings = settings } return grpcPayload } func MapHistoryToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var history MapHistory err := json.Unmarshal(input.Data, &history) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_MapHistory{ MapHistory: &kafka_grpc.MapHistory{ Name: history.Name, Description: history.Description, }, } if history.Location != nil { grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_MapHistory).MapHistory.Location = &kafka_grpc.MapCoordinates{ Latitude: history.Location.Latitude, Longitude: history.Location.Longitude, } } return grpcPayload } func MapRouteRequestToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var request MapRouteRequest err := json.Unmarshal(input.Data, &request) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_MapRouteReq{ MapRouteReq: &kafka_grpc.MapRouteRequest{ Vin: request.VIN, }, } if len(request.Route) > 0 { var route []*kafka_grpc.MapCoordinates for _, r := range request.Route { route = append(route, &kafka_grpc.MapCoordinates{ Latitude: r.Latitude, Longitude: r.Longitude, }) } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_MapRouteReq).MapRouteReq.Route = route } if len(request.Waypoints) > 0 { var waypoints []*kafka_grpc.MapWaypoint for _, p := range request.Waypoints { waypoint := &kafka_grpc.MapWaypoint{ Type: p.Type, Title: p.Title, Coordinates: &kafka_grpc.MapCoordinates{ Latitude: p.Latitude, Longitude: p.Longitude, }, } waypoints = append(waypoints, waypoint) } grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_MapRouteReq).MapRouteReq.Waypoints = waypoints } return grpcPayload } func MapDestinationRequestToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var request MapDestinationRequest err := json.Unmarshal(input.Data, &request) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_MapDestReq{ MapDestReq: &kafka_grpc.MapDestinationRequest{ Vin: request.VIN, Name: request.Name, }, } if request.Address != nil { grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_MapDestReq).MapDestReq.Address = &kafka_grpc.TomTomAddress{ StreetName: request.Address.StreetName, StreetNumber: request.Address.StreetNumber, LocalName: request.Address.LocalName, PostalCode: request.Address.PostalCode, CountrySubdivisionName: request.Address.CountrySubdivisionName, CountryCodeIso3: request.Address.CountryCodeIso3, } } if request.Coordinates != (MapCoordinates{}) { grpcPayload.Data.(*kafka_grpc.GRPC_ValetPayload_MapDestReq).MapDestReq.Coordinates = &kafka_grpc.MapCoordinates{ Latitude: request.Coordinates.Latitude, Longitude: request.Coordinates.Longitude, } } return grpcPayload } func DigitalTwinRequestToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var request DigitalTwinRequest err := json.Unmarshal(input.Data, &request) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_DigitalTwinReq{ DigitalTwinReq: &kafka_grpc.VIN{ Vin: request.VIN, }, } return grpcPayload } func ValetRouteServicePayloadGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { switch input.Handler { case "remote_command": return RemoteCMDToGRPC(input) } return &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } } func RemoteCMDToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_ValetPayload { grpcPayload := &kafka_grpc.GRPC_ValetPayload{ Handler: input.Handler, } var command kafka_grpc.RemoteCommand err := json.Unmarshal(input.Data, &command) if err != nil { return grpcPayload } grpcPayload.Data = &kafka_grpc.GRPC_ValetPayload_RemoteCmd{ RemoteCmd: &command, } return grpcPayload } func UpdateManifestToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload { grpcPayload := &kafka_grpc.GRPC_AttendantPayload{ Handler: input.Handler, } var commonManifest UpdateManifest err := json.Unmarshal(input.Data, &commonManifest) if err != nil { return grpcPayload } data := &kafka_grpc.UpdateManifest{} data.Id = commonManifest.ID data.Name = commonManifest.Name data.Version = commonManifest.Version data.Description = commonManifest.Description data.ReleaseNotes = commonManifest.ReleaseNotes data.EcuList = commonManifest.ECUList data.Fingerprint = commonManifest.Fingerprint data.CarUpdateId = commonManifest.CarUpdateID data.Rollback = commonManifest.RollbackEnabled data.Type = commonManifest.Type data.Vod = commonManifest.VOD data.ManifestType = int32(commonManifest.ManifestType) data.Env = commonManifest.Env data.UpdateDuration = int32(commonManifest.UpdateDuration) data.MaxAttempts = int32(commonManifest.MaxAttempts) data.Active = commonManifest.Active data.Country = commonManifest.Country data.BodyType = commonManifest.BodyType data.Restraint = commonManifest.Restraint data.Powertrain = commonManifest.PowerTrain data.Model = commonManifest.Model data.Trim = commonManifest.Trim data.Year = int32(commonManifest.Year) data.Sums = commonManifest.SUMS if commonManifest.CreatedAt != nil { created := commonManifest.CreatedAt.UnixMilli() data.Created = &created } if commonManifest.UpdatedAt != nil { updated := commonManifest.UpdatedAt.UnixMilli() data.Updated = &updated } // Convert ECUs updateManifestECU := make([]*kafka_grpc.UpdateManifestECU, 0, len(commonManifest.ECUs)) updateManifestECU = UpdateManifestECUToGRPC(commonManifest.ECUs, updateManifestECU) data.EcuUpdates = updateManifestECU data.EcuUpdates = updateManifestECU grpcPayload.Data = &kafka_grpc.GRPC_AttendantPayload_UpdateManifest{ UpdateManifest: data, } return grpcPayload } func UpdateManifestECUToGRPC(ecus []*UpdateManifestECU, output []*kafka_grpc.UpdateManifestECU) []*kafka_grpc.UpdateManifestECU { for _, commonECU := range ecus { u := &kafka_grpc.UpdateManifestECU{ Id: commonECU.ID, ManifestId: commonECU.UpdateManifestID, Name: commonECU.ECU, Version: commonECU.Version, CurrentVersion: commonECU.CurrentVersion, HwVersion: commonECU.HWVersion, HwVersions: commonECU.HWVersions, ConfigurationMask: commonECU.ConfigurationMask, Configuration: commonECU.Configuration, SelfDownload: commonECU.SelfDownload, Mode: commonECU.Mode, InstallPriority: int32(commonECU.InstallPriority), } if commonECU.CreatedAt != nil { created := commonECU.CreatedAt.UnixMilli() u.Created = &created } if commonECU.UpdatedAt != nil { updated := commonECU.UpdatedAt.UnixMilli() u.Updated = &updated } u.EccKeys = toKafkaECCKey(commonECU.ECCKeys) if len(commonECU.Files) > 0 { fileInBytes := toBinaryArray(commonECU.Files) if len(fileInBytes) > 0 { var files []*kafka_grpc.UpdateManifestFile err := json.Unmarshal(fileInBytes, &files) if err != nil { logger.Warn().Msgf("unable to parse Files of %s", string(fileInBytes)) } u.Files = files } } if len(commonECU.Rollback) > 0 { u.Rollback = make([]*kafka_grpc.UpdateManifestECU, 0, len(u.Rollback)) u.Rollback = UpdateManifestECUToGRPC(commonECU.Rollback, u.Rollback) } output = append(output, u) } return output } func toKafkaECCKey(req *ECCKeys) *kafka_grpc.ECCKey { if req == nil { return nil } e := &kafka_grpc.ECCKey{ Ecu: req.ECU, Env: req.Env, } if req.CreatedAt != nil { t := req.CreatedAt.UnixMilli() e.Created = &t } if req.UpdatedAt != nil { t := req.UpdatedAt.UnixMilli() e.Updated = &t } if req.PubKey1 != nil { e.PubKeyLevel_1 = &kafka_grpc.BineryHex{ Data: req.PubKey1.Bytes(), } } if req.PubKey2 != nil { e.PubKeyLevel_2 = &kafka_grpc.BineryHex{ Data: req.PubKey2.Bytes(), } } if req.PubKey3 != nil { e.PubKeyLevel_3 = &kafka_grpc.BineryHex{ Data: req.PubKey3.Bytes(), } } if req.PrivKey1 != nil { e.Level_1 = &kafka_grpc.BineryHex{ Data: req.PrivKey1.Bytes(), } } if req.PrivKey2 != nil { e.Level_2 = &kafka_grpc.BineryHex{ Data: req.PrivKey2.Bytes(), } } if req.PrivKey3 != nil { e.Level_3 = &kafka_grpc.BineryHex{ Data: req.PrivKey3.Bytes(), } } return e }