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); } } }
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); }
/// <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); }