NUC-31: Implement FireStore rest translator
This commit is contained in:
parent
81dda269a8
commit
b82c169513
2 changed files with 194 additions and 0 deletions
115
NucuCar.Domain/Utilities/FirebaseRestTranslator.cs
Normal file
115
NucuCar.Domain/Utilities/FirebaseRestTranslator.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue