NUC-31: Implement FireStore rest translator

This commit is contained in:
Denis-Cosmin Nutiu 2020-02-16 13:55:29 +02:00
parent 81dda269a8
commit b82c169513
2 changed files with 194 additions and 0 deletions

View file

@ -0,0 +1,115 @@
using System;
using System.Collections.Generic;
namespace NucuCar.Domain.Utilities
{
/// <summary>
/// This class is used to translate C# dictionaries into firebase json format.
/// </summary>
public static class FirebaseRestTranslator
{
public static Dictionary<string, object> Translate(string name, Dictionary<string, object> dict)
{
return BuildRoot(name, dict);
}
private static Dictionary<string, object> BuildRoot(string name, Dictionary<string, object> dict)
{
var root = new Dictionary<string, object>();
root["name"] = name;
root["fields"] = new Dictionary<string, object>();
// iterate through fields and build leaf
foreach (var entry in dict)
{
var fields = (Dictionary<string, object>) root["fields"];
fields[entry.Key] = BuildNode(entry.Value);
}
return root;
}
private static Dictionary<string, object> BuildNode(object value)
{
switch (value)
{
case string v:
{
if (DateTime.TryParse(v, out _))
{
return BuildTimestamp(v);
}
return BuildString(v);
}
case int v:
{
return BuildInteger(v);
}
case double v:
{
return BuildDouble(v);
}
case List<Dictionary<string, object>> v:
{
return BuildArray(v);
}
case Dictionary<string, object> v:
{
return BuildMap(v);
}
}
throw new ArgumentException($"Can't build leaf! Unknown type for: {value}");
}
private static Dictionary<string, object> BuildSimpleValue(string type, object value)
{
return new Dictionary<string, object>()
{
[type] = value
};
}
private static Dictionary<string, object> BuildString(string value)
{
return BuildSimpleValue("stringValue", value);
}
private static Dictionary<string, object> BuildInteger(int value)
{
return BuildSimpleValue("integerValue", value);
}
private static Dictionary<string, object> BuildTimestamp(string value)
{
return BuildSimpleValue("timestampValue", value);
}
private static Dictionary<string, object> BuildDouble(double value)
{
return BuildSimpleValue("doubleValue", value);
}
private static Dictionary<string, object> BuildArray(List<Dictionary<string, object>> array)
{
var root = new Dictionary<string, object>();
var values = new List<Dictionary<string, object>>();
foreach (var entry in array)
{
values.Add(BuildNode(entry));
}
root["values"] = values;
return root;
}
private static Dictionary<string, object> BuildMap(Dictionary<string, object> map)
{
var fields = new Dictionary<string, object>();
var root = new Dictionary<string, object>
{
["mapValue"] = new Dictionary<string, object>
{
["fields"] = fields
}
};
foreach (var entry in map)
{
fields[entry.Key] = BuildNode(entry.Value);
}
return root;
}
}
}

View file

@ -0,0 +1,79 @@
using System.Collections.Generic;
using Newtonsoft.Json;
using NucuCar.Domain.Utilities;
using Xunit;
using Xunit.Abstractions;
namespace NucuCar.UnitTests.NucuCar.Domain.Tests.Utilities
{
/*
{
"source":"NucuCar.Sensors",
"timestamp":"2019-12-01T23:26:13.5537227+02:00",
"data":[
{
"sensor_state":2,
"temperature":32.65558333857916,
"humidity":100.0,
"pressure":62228.49565168124,
"voc":0.0,
"_id":"Bme680-Sensor"
},
{
"sensor_state":2,
"cpu_temperature":48.849998474121094,
"_id":"CpuTemperature"
}
]
}
*/
public class FirebaseRestTranslatorTests
{
private readonly ITestOutputHelper _testOutputHelper;
public FirebaseRestTranslatorTests(ITestOutputHelper testOutputHelper)
{
_testOutputHelper = testOutputHelper;
}
private Dictionary<string, object> getBasicTelemetryData()
{
var basicTelemetryDict = new Dictionary<string, object>
{
["source"] = "NucuCar.Sensors",
["timestamp"] = "2019-12-01T23:26:13.5537227+02:00"
};
var data = new List<Dictionary<string, object>>
{
new Dictionary<string, object>()
{
["sensor_state"] = 2,
["cpu_temperature"] = 48.849998474121094,
["_id"] = "CpuTemperature",
},
new Dictionary<string, object>()
{
["sensor_state"] = 2,
["temperature"] = 32.65,
["humidity"] = 100.0,
["pressure"] = 62228.49,
["voc"] = 0.0,
["_id"] = "Bme680-Sensor"
}
};
basicTelemetryDict["data"] = data;
return basicTelemetryDict;
}
[Fact]
public void Test_FireBaseTranslator_Parse()
{
var expectedJson =
"{\"name\":\"Test\",\"fields\":{\"source\":{\"stringValue\":\"NucuCar.Sensors\"},\"timestamp\":{\"timestampValue\":\"2019-12-01T23:26:13.5537227+02:00\"},\"data\":{\"values\":[{\"mapValue\":{\"fields\":{\"sensor_state\":{\"integerValue\":2},\"cpu_temperature\":{\"doubleValue\":48.849998474121094},\"_id\":{\"stringValue\":\"CpuTemperature\"}}}},{\"mapValue\":{\"fields\":{\"sensor_state\":{\"integerValue\":2},\"temperature\":{\"doubleValue\":32.65},\"humidity\":{\"doubleValue\":100.0},\"pressure\":{\"doubleValue\":62228.49},\"voc\":{\"doubleValue\":0.0},\"_id\":{\"stringValue\":\"Bme680-Sensor\"}}}}]}}}";
var basicTelemetryData = getBasicTelemetryData();
var result = FirebaseRestTranslator.Translate("Test", basicTelemetryData);
var json = JsonConvert.SerializeObject(result);
Assert.Equal(expectedJson, json);
}
}
}