public IActionResult UpdateDevice([FromBody] UpdateDeviceEvent device) { try { logger.LogInformation($"UpdateDevice called for Device {device.DeviceUID}"); if (!(device.OwningCustomerUID == null || device.OwningCustomerUID == Guid.Empty) || !(device.DeregisteredUTC.HasValue ? device.DeregisteredUTC.Value.ToString("MM-dd-yyyy") == Constants.INVALID_DATE_TIME_VALUE : device.DeregisteredUTC == new DateTime(1111, 11, 11)) || device.ModuleType != null || device.MainboardSoftwareVersion != null || device.RadioFirmwarePartNumber != null || device.GatewayFirmwarePartNumber != null || device.DataLinkType != null || device.DeviceState != null || device.FirmwarePartNumber != null || device.CellModemIMEI != null || device.DevicePartNumber != null || device.CellularFirmwarePartnumber != null || device.NetworkFirmwarePartnumber != null || device.SatelliteFirmwarePartnumber != null) { if (!string.IsNullOrEmpty(device.DeviceType) && !deviceTypesCache.TryGetValue(device.DeviceType, out DbDeviceType deviceType)) { logger.LogWarning($"DeviceType {device.DeviceType} is not exists"); return(BadRequest("Make sure request contains valid DeviceType")); } DeviceStateEnum deviceState = DeviceStateEnum.None; if (!string.IsNullOrEmpty(device.DeviceState) && !Enum.TryParse <DeviceStateEnum>(device.DeviceState?.Trim(), true, out deviceState)) { return(BadRequest("Invalid Device State for updation. Supported Device states are Installed/Provisioned/Subscribed/DeregisteredTechnician/DeregisteredStore")); } if (!deviceService.CheckExistingDevice(device.DeviceUID.Value)) { return(BadRequest("Device doesn't exist!")); } device.ReceivedUTC = DateTime.UtcNow; if (deviceService.UpdateDevice(device, deviceState)) { return(Ok("Update Request is processed successfully")); } else { return(Ok("Update Request is processed and no data to be updated.")); } } else { return(BadRequest("Update Request should have atleast one data to update")); } } catch (Exception ex) { logger.LogError(ex.Message + ex.StackTrace); return(StatusCode((int)HttpStatusCode.InternalServerError, ex.Message)); } }
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)); } }