private IActionResult ValidateDuplicatesDiffs(String tab, SidekaColumnConfig columns, SidekaDiff[] diffs, object[] data) { var idGetter = GetIdGetter(columns); var ids = new HashSet <string>(); foreach (var item in data) { ids.Add(idGetter(item)); } foreach (var diff in diffs) { foreach (var added in diff.Added) { var id = idGetter(added); if (ids.Contains(id)) { return(StatusCode((int)HttpStatusCode.BadRequest, new Dictionary <string, string>() { { "message", string.Format("Duplicates item diff {0} in tab {1}", id, tab) } })); } ids.Add(id); } } return(null); }
private static Func <Object, String> GetIdGetter(SidekaColumnConfig config) { if (config.IsDict) { return(o => (string)((Dictionary <string, object>)o)["id"]); } else { var index = Array.IndexOf(config.Columns, ("id")); return(o => (String)((object[])o)[index]); } }
private IActionResult Validate(SidekaColumnConfig columns, object[] diffTypes, string location, bool validateArrayLength = true) { var index = 0; foreach (var diffType in diffTypes) { Type t = diffType.GetType(); bool isDiffTypeDict = t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary <,>); if (columns.IsDict) { if (!isDiffTypeDict) { return(StatusCode((int)HttpStatusCode.BadRequest, new Dictionary <string, string>() { { "message", string.Format("Invalid item, dict expected, at row {0} at {1}", index, location) } })); } } else { if (!t.IsArray) { return(StatusCode((int)HttpStatusCode.BadRequest, new Dictionary <string, string>() { { "message", string.Format("Invalid item, array expected, at row {0} at {1}", index, location) } })); } else if (columns.Columns.Length != ((object[])diffType).Length && validateArrayLength) { return(StatusCode((int)HttpStatusCode.BadRequest, new Dictionary <string, string>() { { "message", string.Format("Invalid item, expecting array of length {0} instead of {1}, at row {2} at {3}", columns.Columns.Length, ((object[])diffType).Length, index, location) } })); } } index++; } return(null); }
private object[] MergeDiffs(SidekaColumnConfig columns, SidekaDiff[] diffs, object[] dataArray) { var data = dataArray.ToList(); var idGetter = GetIdGetter(columns); foreach (var diff in diffs) { foreach (var added in diff.Added) { data.Add(added); } foreach (var modified in diff.Modified) { for (var i = 0; i <= data.Count - 1; i++) { var datumId = idGetter(data[i]); var modifiedId = idGetter(modified); if (datumId == modifiedId) { data[i] = modified; } } } foreach (var deleted in diff.Deleted) { for (var i = data.Count - 1; i >= 0; i--) { var datumId = idGetter(data[i]); var deletedId = idGetter(deleted); if (datumId == deletedId) { data.RemoveAt(i); } } } } return(data.ToArray()); }