private UpdateDevicePayload AppendExistingDeviceProperties(UpdateDevicePayload updateDevice, DeviceProperties existingDeviceProp) { foreach (PropertyInfo propertyInfo in updateDevice.GetType().GetProperties().Where(p => p.CanRead)) { if (propertyInfo.Name != "OwningCustomerUID") { if (propertyInfo.GetValue(updateDevice) == null) { object value = existingDeviceProp.GetType().GetProperties().Single(p => p.Name.ToString() == propertyInfo.Name.ToString()).GetValue(existingDeviceProp); propertyInfo.SetValue(updateDevice, value); } else if (propertyInfo.GetValue(updateDevice)?.ToString() == string.Empty) { propertyInfo.SetValue(updateDevice, null); } } } updateDevice.DeviceUID = Guid.Parse(existingDeviceProp.DeviceUID); return(updateDevice); }
private bool CheckExistingDevicePropertiesForUpdate(UpdateDevicePayload updateDevice, DeviceStateEnum deviceState, Guid?currentOwningCustomerUID, DeviceProperties existingDeviceProp) { bool areEqual = false; updateDevice.DeviceState = deviceState.ToString(); if (updateDevice.DeregisteredUTC.HasValue) { updateDevice.DeregisteredUTC = CompareHelper.ConvertDateTimeForComparison(updateDevice.DeregisteredUTC.Value); } if (existingDeviceProp.DeregisteredUTC.HasValue) { existingDeviceProp.DeregisteredUTC = CompareHelper.ConvertDateTimeForComparison(existingDeviceProp.DeregisteredUTC.Value); } if (updateDevice.OwningCustomerUID == currentOwningCustomerUID && CompareHelper.AreObjectsEqual(updateDevice, existingDeviceProp, "DeviceUID", "DeviceType", "ActionUTC", "ReceivedUTC", "OwningCustomerUID")) { areEqual = true; } return(areEqual); }
public bool UpdateDeviceProperties(UpdateDeviceProperties device, Guid deviceUid) { DbDeviceType deviceType = deviceTypesCache.First(x => string.Equals(x.Key, device.DeviceType, StringComparison.InvariantCultureIgnoreCase)).Value; var currentUTC = DateTime.UtcNow; var devicePayload = new UpdateDevicePayload { ActionUTC = currentUTC, CellularFirmwarePartnumber = device.CellularFirmwarePartnumber, DataLinkType = device.DataLinkType, DeviceSerialNumber = device.DeviceSerialNumber, DeviceType = device.DeviceType, DeviceUID = deviceUid, GatewayFirmwarePartNumber = device.GatewayFirmwarePartNumber, MainboardSoftwareVersion = device.MainboardSoftwareVersion, ModuleType = device.ModuleType, NetworkFirmwarePartnumber = device.NetworkFirmwarePartnumber, RadioFirmwarePartNumber = device.RadioFirmwarePartNumber, ReceivedUTC = device.ReceivedUTC, SatelliteFirmwarePartnumber = device.SatelliteFirmwarePartnumber, Description = device.Description }; var existingDeviceProp = GetExistingDeviceProperties(deviceUid); var existingPersonalities = GetExistingDevicePersonalities(devicePayload.DeviceUID); var devicePersonality = GetDevicePersonalities(devicePayload, existingPersonalities, deviceType); devicePayload = AppendExistingDeviceProperties(devicePayload, existingDeviceProp); devicePayload.OwningCustomerUID = GetExistingOwningCustomerUid(deviceUid); var deviceState = (DeviceStateEnum)Enum.Parse(typeof(DeviceStateEnum), existingDeviceProp.DeviceState, true); devicePayload.ReceivedUTC = DateTime.UtcNow; bool equal = CheckExistingDevicePropertiesForUpdate(devicePayload, deviceState, devicePayload.OwningCustomerUID, existingDeviceProp); if (equal) { logger.LogInformation("No properties to update"); return(false); } else { var kafkaMessageList = new List <KafkaMessage>(); kafkaTopicNames.ForEach(topic => { var kafkaMessage = new KafkaMessage() { Key = deviceUid.ToString(), Message = new { UpdateDeviceEvent = mapper.Map <UpdateDevicePayload, UpdateDeviceEvent>(devicePayload) }, Topic = topic }; kafkaMessageList.Add(kafkaMessage); }); kafkaTopicNamesV2.ForEach(topic => { var kafkaMessage = new KafkaMessage() { Key = deviceUid.ToString(), Message = ToDevicePayloadV2(devicePayload, devicePersonality), Topic = topic }; kafkaMessageList.Add(kafkaMessage); }); var actions = new List <Action>(); var deviceModel = new DbDevice { CellModemIMEI = devicePayload.CellModemIMEI, CellularFirmwarePartnumber = devicePayload.CellularFirmwarePartnumber, DataLinkType = devicePayload.DataLinkType, DeregisteredUTC = devicePayload.DeregisteredUTC, DevicePartNumber = devicePayload.DevicePartNumber, SerialNumber = devicePayload.DeviceSerialNumber, fk_DeviceTypeID = deviceType.DeviceTypeID, DeviceUID = devicePayload.DeviceUID, FirmwarePartNumber = devicePayload.RadioFirmwarePartNumber == null ? devicePayload.FirmwarePartNumber : devicePayload.RadioFirmwarePartNumber, GatewayFirmwarePartNumber = devicePayload.GatewayFirmwarePartNumber, MainboardSoftwareVersion = devicePayload.MainboardSoftwareVersion, ModuleType = devicePayload.ModuleType, NetworkFirmwarePartnumber = devicePayload.NetworkFirmwarePartnumber, SatelliteFirmwarePartnumber = devicePayload.SatelliteFirmwarePartnumber, UpdateUTC = currentUTC, fk_DeviceStatusID = deviceState.GetHashCode() }; actions.Add(() => transactions.Upsert(deviceModel)); actions.Add(() => transactions.Upsert <DbDevicePersonality>(devicePersonality)); actions.Add(() => transactions.Publish(kafkaMessageList)); return(transactions.Execute(actions)); } }
public bool UpdateDevice(UpdateDeviceEvent device, DeviceStateEnum deviceState) { var currentUTC = DateTime.UtcNow; var devicePayload = new UpdateDevicePayload { ActionUTC = currentUTC, CellModemIMEI = device.CellModemIMEI, CellularFirmwarePartnumber = device.CellularFirmwarePartnumber, DataLinkType = device.DataLinkType, DeregisteredUTC = device.DeregisteredUTC, DevicePartNumber = device.DevicePartNumber, DeviceSerialNumber = device.DeviceSerialNumber, DeviceState = deviceState == DeviceStateEnum.None?null: deviceState.ToString(), DeviceType = device.DeviceType, DeviceUID = device.DeviceUID.Value, FirmwarePartNumber = device.FirmwarePartNumber, GatewayFirmwarePartNumber = device.GatewayFirmwarePartNumber, MainboardSoftwareVersion = device.MainboardSoftwareVersion, ModuleType = device.ModuleType, NetworkFirmwarePartnumber = device.NetworkFirmwarePartnumber, OwningCustomerUID = device.OwningCustomerUID, RadioFirmwarePartNumber = device.RadioFirmwarePartNumber, ReceivedUTC = device.ReceivedUTC, SatelliteFirmwarePartnumber = device.SatelliteFirmwarePartnumber }; var existingDeviceProp = GetExistingDeviceProperties(device.DeviceUID.Value); if (PLDeviceTypes.Contains(device.DeviceType.ToLower(), StringComparer.InvariantCultureIgnoreCase)) { existingDeviceProp.RadioFirmwarePartNumber = existingDeviceProp.FirmwarePartNumber; existingDeviceProp.FirmwarePartNumber = null; } var existingPersonalities = GetExistingDevicePersonalities(device.DeviceUID.Value); DbDeviceType deviceType = string.IsNullOrEmpty(devicePayload.DeviceType) ? deviceTypesCache.First(x => string.Equals(x.Key, existingDeviceProp.DeviceType, StringComparison.InvariantCultureIgnoreCase)).Value : deviceTypesCache.First(x => string.Equals(x.Key, devicePayload.DeviceType, StringComparison.InvariantCultureIgnoreCase)).Value; var devicePersonality = GetDevicePersonalities(devicePayload, existingPersonalities, deviceType); devicePayload = AppendExistingDeviceProperties(devicePayload, existingDeviceProp); Guid?currentOwningCustomerUID = GetExistingOwningCustomerUid(device.DeviceUID.Value); devicePayload.OwningCustomerUID = devicePayload.OwningCustomerUID ?? currentOwningCustomerUID; //DeviceSerialNumber will be persisited as NULL in masterdata and send it as Empty to Kafka devicePayload.DeviceSerialNumber = string.IsNullOrEmpty(devicePayload.DeviceSerialNumber) ? string.Empty : devicePayload.DeviceSerialNumber; bool equal = CheckExistingDevicePropertiesForUpdate(devicePayload, (DeviceStateEnum)Enum.Parse(typeof(DeviceStateEnum), devicePayload.DeviceState), currentOwningCustomerUID, existingDeviceProp); if (equal) { logger.LogInformation("No properties to update"); return(false); } else { var kafkaMessageList = new List <KafkaMessage>(); kafkaTopicNames.ForEach(topic => { var kafkaMessage = new KafkaMessage() { Key = device.DeviceUID.ToString(), Message = new { UpdateDeviceEvent = mapper.Map <UpdateDevicePayload, UpdateDeviceEvent>(devicePayload) }, Topic = topic }; kafkaMessageList.Add(kafkaMessage); }); kafkaTopicNamesV2.ForEach(topic => { var kafkaMessage = new KafkaMessage() { Key = device.DeviceUID.ToString(), Message = ToDevicePayloadV2(devicePayload, devicePersonality), Topic = topic }; kafkaMessageList.Add(kafkaMessage); }); List <Action> actions = new List <Action>(); var deviceModel = new DbDevice { CellModemIMEI = devicePayload.CellModemIMEI, CellularFirmwarePartnumber = devicePayload.CellularFirmwarePartnumber, DataLinkType = devicePayload.DataLinkType, DeregisteredUTC = devicePayload.DeregisteredUTC, DevicePartNumber = devicePayload.DevicePartNumber, SerialNumber = devicePayload.DeviceSerialNumber, fk_DeviceStatusID = deviceState.GetHashCode(), fk_DeviceTypeID = deviceType.DeviceTypeID, DeviceUID = devicePayload.DeviceUID, FirmwarePartNumber = devicePayload.RadioFirmwarePartNumber == null ? devicePayload.FirmwarePartNumber : devicePayload.RadioFirmwarePartNumber, GatewayFirmwarePartNumber = devicePayload.GatewayFirmwarePartNumber, MainboardSoftwareVersion = devicePayload.MainboardSoftwareVersion, ModuleType = devicePayload.ModuleType, NetworkFirmwarePartnumber = devicePayload.NetworkFirmwarePartnumber, SatelliteFirmwarePartnumber = devicePayload.SatelliteFirmwarePartnumber, UpdateUTC = currentUTC }; var asset = GetOwningCustomerUID(device.DeviceUID.Value); if (device.OwningCustomerUID.HasValue && asset != null && (asset.OwningCustomerUID == Guid.Empty || !device.OwningCustomerUID.Equals(asset.OwningCustomerUID))) { var updateAsset = new UpdateAssetEvent { AssetName = asset.AssetName, AssetType = asset.AssetType, EquipmentVIN = asset.EquipmentVIN, IconKey = asset.IconKey, Model = asset.Model, ModelYear = asset.ModelYear, LegacyAssetID = asset.LegacyAssetID, AssetUID = asset.AssetUID, OwningCustomerUID = device.OwningCustomerUID.Value, ActionUTC = DateTime.UtcNow, ReceivedUTC = DateTime.UtcNow }; actions.Add(() => assetServices.UpdateAsset(updateAsset)); } actions.Add(() => transactions.Upsert(deviceModel)); actions.Add(() => transactions.Upsert <DbDevicePersonality>(devicePersonality)); actions.Add(() => transactions.Publish(kafkaMessageList)); return(transactions.Execute(actions)); } }