Exemple #1
0
        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));
            }
        }
Exemple #2
0
        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));
            }
        }