Ejemplo n.º 1
0
        public StateEntity([NotNull] QboxState qboxState)
        {
            Guard.NotNull(qboxState, nameof(qboxState));

            SerialNumber = qboxState.SerialNumber;
            RowKey       = DateTimeRowKeyHelper.Construct(DateTime.UtcNow);

            CorrelationId   = qboxState.CorrelationId;
            LogTimeStamp    = qboxState.LogTime;
            MessageType     = qboxState.MessageType;
            Message         = qboxState.Message;
            State           = qboxState.State;
            FirmwareVersion = qboxState.FirmwareVersion;
            MeterType       = qboxState.MeterType;
            SequenceNumber  = qboxState.SequenceNumber;
            Payloads        = qboxState.Payloads;
            MessageTime     = qboxState.MessageTime;

            // Copy all 'Last...' values
            var propertiesToCopy = typeof(QboxState).GetProperties()
                                   .Where(pi => pi.Name.StartsWith("Last") && (pi.PropertyType == typeof(string) || pi.PropertyType == typeof(DateTime) || pi.PropertyType == typeof(DateTime?))
                                          );

            foreach (var propertyInfo in propertiesToCopy)
            {
                var value = propertyInfo.GetValue(qboxState);
                var targetPropertyInfo = typeof(StateEntity).GetProperty(propertyInfo.Name);

                // Skip null values
                if (targetPropertyInfo != null && value != null)
                {
                    targetPropertyInfo.SetValue(this, value);
                }
            }
        }
Ejemplo n.º 2
0
        public async Task <bool> StoreAsync(QboxState qboxState)
        {
            Guard.NotNull(qboxState, nameof(qboxState));

            var entity = new StateEntity(qboxState);

            _logger.LogInformation("Inserting state for '{SerialNumber}' with RowKey '{RowKey}' into Azure Table '{table}'", qboxState.SerialNumber, entity.RowKey, _stateTable.Name);

            return(await _stateTable.Set.AddAsync(entity).TimeoutAfter(_serverTimeout) != null);
        }
Ejemplo n.º 3
0
        /// <inheritdoc cref="IStateStoreService.StoreAsync(string, StateData)"/>
        public async Task StoreAsync(string correlationId, StateData stateData)
        {
            Guard.IsNotNullOrEmpty(correlationId, nameof(correlationId));
            Guard.IsNotNull(stateData, nameof(stateData));

            var state = new QboxState
            {
                CorrelationId                                 = correlationId,
                LogTime                                       = DateTime.UtcNow,
                SerialNumber                                  = stateData.SerialNumber,
                MessageType                                   = stateData.MessageType,
                State                                         = stateData.State.ToString(),
                FirmwareVersion                               = stateData.Status?.FirmwareVersion,
                SequenceNumber                                = stateData.SequenceNumber,
                LastIpAddress                                 = stateData.Status?.LastIpAddress.Key,
                LastIpAddressUpdate                           = stateData.Status?.LastIpAddress.Value,
                MeterType                                     = stateData.MeterType != null?stateData.MeterType.ToString() : null,
                                                  Payloads    = stateData.Payloads,
                                                  MessageTime = stateData.MessageTime
            };

            if (stateData.Message != null)
            {
                if (stateData.Message.AsSpan(1, 10).ToArray().All(char.IsLetterOrDigit))
                {
                    state.Message = stateData.Message;
                }
                else
                {
                    // Convert to Base64 string
                    state.Message = $"Base64 byte[] {Convert.ToBase64String(Encoding.UTF8.GetBytes(stateData.Message))}";
                }
            }

            // Copy all 'Last...' values
            if (stateData.Status != null)
            {
                var propertiesToCopy = typeof(QboxStatus).GetProperties()
                                       .Where(pi => pi.Name.StartsWith("Last") && (pi.PropertyType == typeof(string) || pi.PropertyType == typeof(DateTime))
                                              );
                foreach (var propertyInfo in propertiesToCopy)
                {
                    var value = propertyInfo.GetValue(stateData.Status);
                    var targetPropertyInfo = typeof(QboxState).GetProperty(propertyInfo.Name);

                    // Skip default DateTime values
                    if (targetPropertyInfo != null && !(value is DateTime date && date == default(DateTime)))
                    {
                        targetPropertyInfo.SetValue(state, value);
                    }
                }
            }

            await _azureTablesService.StoreAsync(state);
        }