public static object Run( HttpContext context , string configuration , IList <object> dataservices ) { if (string.IsNullOrEmpty(configuration)) { return new { error = "No configuration specified." } } ; JObject config = JsonConvert.DeserializeObject <JObject>(configuration); string table = $"{config["table"]}"; if (string.IsNullOrEmpty(table)) { return new { error = "No table Specified." } } ; string idField = config["id"]?.ToString(); if (string.IsNullOrEmpty(idField)) { return new { error = "No id field Specified." } } ; // Get Navigation ID string navigation_id = context.Request.Headers["X-App-Key"]; if (string.IsNullOrEmpty(navigation_id)) { return new { error = "No X-App-Key specified" } } ; // check if admin if (config["admin"] != null && config["admin"].ToObject <bool>() == true) { navigation_id = null; } // Retrieve DataService if (dataservices == null || dataservices.Count == 0) { return new { error = "Data Services not provided" } } ; SQL db = (SQL)dataservices.FirstOrDefault(); if (db == null) { return new { error = "Data Service not provided" } } ; // Form document var data = JsonConvert.DeserializeObject <JObject>(WebTools.GetBody(context)); // set default fields var updatedData = SQL_Update.SetDefaults(context, config, data); // Exclude data var excludeFields = (config["excludeFields"] as JArray)?.ToObject <string[]>(); if (excludeFields != null) { foreach (var excludeField in excludeFields) { updatedData.Remove(excludeField); } } // Update var id = $"{Insert(db, table, updatedData, idField)}"; // Form document data = JsonConvert.DeserializeObject <JObject>(WebTools.GetBody(context)); data[idField] = $"{id}"; // Complete external relationships var externals = (JArray)config["externals"]; if (externals != null) { foreach (var external in externals) { var extTable = $"{external["table"]}"; var extIdField = $"{external["id"]}"; var mapping = external["mapping"]; var relationships = (JArray)external["relationships"]; if (mapping != null) { // for each value create new record on external var source = (JArray)data[$"{mapping["source"]}"]; var sourceKey = $"{mapping["sourceKey"]}"; // fetch existing records IList <string> where = new List <string>(); if (relationships != null) { foreach (var relationship in relationships) { where.Add($"{relationship["target"]} = {data[$"{relationship["source"]}"]}"); } } try { var existingRecordIds = db .Query($"SELECT {extIdField} FROM {extTable} WHERE {string.Join(" AND ", where)}") .Select(x => $"{x[extIdField]}"); // delete from existingRecords var sourceRecordIds = source.Select(x => $"{x[sourceKey]}"); var tobeDeleteIds = existingRecordIds.Except(sourceRecordIds); foreach (var item in tobeDeleteIds) { SQL_Delete.Delete(db, extTable, item, extIdField); } } catch { } if (source != null) { foreach (var item in source) { // new record var record = new Dictionary <string, object>(); // fill up the record with foreign key relationship if (relationships != null) { foreach (var relationship in relationships) { record[$"{relationship["target"]}"] = $"{data[$"{relationship["source"]}"]}"; } } // fill up the mapping value var type = $"{mapping["type"]}"; if (type == "object") { var targets = (JArray)mapping["targets"]; if (targets != null) { foreach (var target in targets) { record[$"{target["target"]}"] = $"{item[$"{target["source"]}"]}"; } } } // navigation_id if (navigation_id != null) { record["navigation_id"] = navigation_id; } // find the key if (sourceKey != null && item[sourceKey] != null) { // update record[extIdField] = $"{item[sourceKey]}"; SQL_Update.Update(db, extTable, record, extIdField); } else { // insert SQL_Insert.Insert(db, extTable, record, extIdField); } } } } } } // Return Result return(new { _id = id }); }
public static object Run( HttpContext context , string configuration , IList <object> dataservices ) { // Get Configuration if (string.IsNullOrEmpty(configuration)) { return new { error = "No configuration specified." } } ; JObject config = JsonConvert.DeserializeObject <JObject>(configuration); // check parameters string table = $"{config["table"]}"; if (string.IsNullOrEmpty(table) == true) { return new { error = "No table specified." } } ; string idField = $"{config["id"]}"; if (string.IsNullOrEmpty(idField) == true) { return new { error = "No id field specified." } } ; // Get Navigation ID string navigation_id = context.Request.Headers["X-App-Key"]; if (string.IsNullOrEmpty(navigation_id)) { return new { error = "No X-App-Key specified" } } ; // IWebToolsService var data = JsonConvert.DeserializeObject <JObject>(WebTools.GetBody(context)); data["navigation_id"] = navigation_id; // Get Group ID string[] group_ids = data["group_id"]?.ToObject <string[]>(); if (group_ids == null || group_ids.Length == 0) { return(JsonConvert.SerializeObject(new { error = "No Group Specified." })); } // Retrieve DataService if (dataservices == null || dataservices.Count == 0) { return new { error = "Data Services not provided" } } ; SQL db = (SQL)dataservices.FirstOrDefault(); if (db == null) { return new { error = "Data Service not provided" } } ; // data validation - id and password is mandatory if (string.IsNullOrEmpty($"{data["id"]}") == true) { return new { error = "id is mandatory field" } } ; // if _id exists - Is it existing user? if (data["_id"] != null) { // Find Item string sql = $@"SELECT * FROM core_user WHERE _id=@_id"; var param = new Dictionary <string, object>(); param["_id"] = $"{data["_id"]}"; var results = db.Query(sql, param); if (results != null && results.Count() > 0) { // account exists var user = results.First(); // check if the password matches if (data["password"] != null && $"{user["password"]}" != $"{data["password"]}") { if (SecurePasswordHasher.Verify($"{data["password"]}", $"{user["password"]}") == false) { return new { error = "password doesn't match" } } } ; // update the password if (data["password"] != null) { data["password"] = SecurePasswordHasher.Hash($"{data["password"]}"); } // Exclude data var excludeFields = (config["excludeFields"] as JArray)?.ToObject <string[]>(); if (excludeFields != null) { foreach (var excludeField in excludeFields) { data.Remove(excludeField); } } var updatedData = SQL_Update.SetDefaults(context, config, data); // update user SQL_Update.Update(db, table, updatedData, idField); // update group UpdateGroup(db, navigation_id, group_ids, $"{data["_id"]}"); return(new { _id = data["_id"] }); } } // new user creation else { // check if the user with same id already exists string sql = $@"SELECT * FROM core_user WHERE id=@id AND navigation_id=@navigation_id"; var param = new Dictionary <string, object>(); param["id"] = $"{data["id"]}"; param["navigation_id"] = navigation_id; var results = db.Query(sql, param); if (results != null && results.Count() > 0) { return new { error = "same id already exists" } } ; // create new user data["password"] = SecurePasswordHasher.Hash($"{data["password"]}"); var updatedData = SQL_Update.SetDefaults(context, config, data); // Exclude data var excludeFields = (config["excludeFields"] as JArray)?.ToObject <string[]>(); if (excludeFields != null) { foreach (var excludeField in excludeFields) { updatedData.Remove(excludeField); } } // update user var insertedId = SQL_Insert.Insert(db, table, updatedData, idField); // update group UpdateGroup(db, navigation_id, group_ids, $"{insertedId}"); return(new { _id = insertedId }); } return(null); }