public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "salesforce/objects/describe")] HttpRequest req, ILogger log) { string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic data = JsonConvert.DeserializeObject <QueryRequest>(requestBody); try { ForceClient client = new ForceClient(data); //var result = await client.GetObjectBasicInfo(data.ObjectTypeName); var result = await client.GetObjectDescribe(data.ObjectTypeName); return((ActionResult) new OkObjectResult(result)); } catch (Exception ex) { return((ActionResult) new BadRequestObjectResult(ex.Message)); throw; } }
public static async Task <string> GenClass(ForceClient client, string objectName, string className, GenConfig config) { SObjectDescribeFull data = await client.GetObjectDescribe(objectName); StringBuilder gen = new StringBuilder(); //gen.AppendLine("// Model generated on " + DateTime.Now.ToString("yyyy-MM-dd")); gen.AppendLine("// SF API version " + config.AuthInfo.ApiVersion); gen.AppendLine("// Custom fields included: " + config.IncludeCustom.ToString()); gen.AppendLine("// Relationship objects included: " + config.IncludeReferences.ToString()); gen.AppendLine(); //need rename of Task to Task_sf, Domain => Domain_sf, Name => Name_sf string newline = Environment.NewLine; gen.AppendLine("using System;"); gen.AppendLine("using NetCoreForce.Client.Models;"); gen.AppendLine("using NetCoreForce.Client.Attributes;"); gen.AppendLine("using Newtonsoft.Json;"); gen.AppendLine(); if (!string.IsNullOrEmpty(config.ClassNamespace)) { gen.AppendLine("namespace " + config.ClassNamespace); gen.AppendLine("{"); } gen.AppendLine("\t///<summary>"); gen.AppendLine($"\t/// {WebUtility.HtmlEncode(data.Label)}"); gen.AppendLine($"\t///<para>SObject Name: {data.Name}</para>"); gen.AppendLine($"\t///<para>Custom Object: {data.Custom.ToString()}</para>"); gen.AppendLine("\t///</summary>"); gen.AppendLine($"\tpublic class {className} : SObject"); gen.AppendLine("\t{"); gen.AppendLine("\t\t[JsonIgnore]"); gen.AppendLine("\t\tpublic static string SObjectTypeName"); gen.AppendLine("\t\t{"); // gen.AppendLine("\t\t\tget { return \"" + data.Name + "\"; }"); gen.AppendLine($"\t\t\tget {{ return \"{data.Name}\"; }}"); gen.AppendLine("\t\t}"); gen.AppendLine(); // gen.AppendLine("\t\tpublic " + className + "() : base (\"" + objectName + "\")"); // gen.AppendLine("\t\t{}"); // gen.AppendLine(); foreach (var field in data.Fields) { try { if (field.Custom && !config.IncludeCustom) { continue; } gen.AppendLine("\t\t///<summary>"); gen.AppendLine("\t\t/// " + WebUtility.HtmlEncode(field.Label)); gen.AppendLine("\t\t/// <para>Name: " + field.Name + "</para>"); gen.AppendLine("\t\t/// <para>SF Type: " + field.Type + "</para>"); if (field.AutoNumber) { gen.AppendLine("\t\t/// <para>AutoNumber field</para>"); } //gen.AppendLine("\t\t/// <para>Custom: " + field.Custom.ToString() + "</para>"); if (field.Custom) { gen.AppendLine("\t\t/// <para>Custom field</para>"); } gen.AppendLine("\t\t/// <para>Nillable: " + field.Nillable.ToString() + "</para>"); gen.AppendLine("\t\t///</summary>"); gen.AppendLine(string.Format("\t\t[JsonProperty(PropertyName = \"{0}\")]", JsonName(field.Name))); if (!field.Creatable || !field.Updateable) { gen.AppendLine(string.Format("\t\t[Updateable({0}), Createable({1})]", field.Updateable.ToString().ToLower(), field.Creatable.ToString().ToLower())); } string csTypeName = SfTypeConverter.GetTypeName(field.Type); switch (csTypeName) { case "Boolean": csTypeName = "bool"; break; case "String": csTypeName = "string"; break; case "Double": csTypeName = "double"; break; case "Int32": csTypeName = "int"; break; case "Decimal": csTypeName = "decimal"; break; default: break; } //we want all nullable types in the model, so that they are not serialized/initialized with default values if (csTypeName == "bool" || csTypeName == "DateTimeOffset" || csTypeName == "DateTime" || csTypeName == "int" || csTypeName == "double" || csTypeName == "decimal") { csTypeName += "?"; } gen.AppendLine(string.Format("\t\tpublic {0} {1} {{ get; set; }}", csTypeName, field.Name)); gen.AppendLine(); if (field.Type == "reference" && config.IncludeReferences) { if (string.IsNullOrEmpty(field.RelationshipName) || field.ReferenceTo.Count > 1) { //only do single-object relationships continue; } if (field.RelationshipName == "ContentBody") { //exception for non-serializable type continue; } gen.AppendLine("\t\t///<summary>"); gen.AppendLine("\t\t/// ReferenceTo: " + field.ReferenceTo[0]); gen.AppendLine("\t\t/// <para>RelationshipName: " + field.RelationshipName + "</para>"); gen.AppendLine("\t\t///</summary>"); gen.AppendLine(string.Format("\t\t[JsonProperty(PropertyName = \"{0}\")]", JsonName(field.RelationshipName))); gen.AppendLine("\t\t[Updateable(false), Createable(false)]"); string referenceClass = GetPrefixedSuffixed(config, field.ReferenceTo[0]); gen.AppendLine(string.Format("\t\tpublic {0} {1} {{ get; set; }}", referenceClass, field.RelationshipName)); gen.AppendLine(); } } catch (Exception ex) { Console.WriteLine("Exception generating models: " + ex.Message); throw ex; } } gen.AppendLine("\t}"); if (!string.IsNullOrEmpty(config.ClassNamespace)) { gen.AppendLine("}"); } string result = gen.ToString(); return(result); }