public async Task <StandardTableDataCM> Query(SalesforceObjectType type, IList <FieldDTO> propertiesToRetrieve, string filter, AuthorizationToken authToken) { var whatToSelect = propertiesToRetrieve?.Select(p => p.Name).ToArray() ?? new string[0]; var selectQuery = $"SELECT {(whatToSelect.Length == 0 ? "*" : string.Join(", ", whatToSelect))} FROM {type}"; if (!string.IsNullOrEmpty(filter)) { selectQuery += " WHERE " + NormalizeFilterByFiedType(propertiesToRetrieve, filter); } try { var result = await ExecuteClientOperationWithTokenRefresh(CreateForceClient, x => x.QueryAsync <object>(selectQuery), authToken); var table = ParseQueryResult(result); table.FirstRowHeaders = true; var headerRow = whatToSelect.Length > 0 ? whatToSelect.Select(x => new TableCellDTO { Cell = new KeyValueDTO(x, x) }).ToList() : (await GetProperties(type, authToken)).Select(x => new TableCellDTO { Cell = new KeyValueDTO(x.Name, x.Label) }).ToList(); table.Table.Insert(0, new TableRowDTO { Row = headerRow }); return(table); } catch (ForceException ex) { _logger.Error($"Failed to execute Salesforce query for object type {type} and filter {filter}", ex); throw; } }
public async Task <List <FieldDTO> > GetProperties(SalesforceObjectType type, AuthorizationToken authToken, bool updatableOnly = false, string label = null) { var responce = (JObject) await ExecuteClientOperationWithTokenRefresh(CreateForceClient, x => x.DescribeAsync <object>(type.ToString()), authToken); var objectFields = new List <FieldDTO>(); JToken resultFields; if (responce.TryGetValue("fields", out resultFields) && resultFields is JArray) { if (updatableOnly) { resultFields = new JArray(resultFields.Where(fieldDescription => fieldDescription.Value <bool>("updateable"))); } var fields = resultFields .Select(fieldDescription => /* * Select Fields as FieldDTOs with * * Key -> Field Name * Value -> Field Lable * AvailabilityType -> Run Time * FieldType -> Field Type * * IsRequired -> The Field is required when ALL the below conditions are true. * nillable = false, Meaning, the field must have a valid value. The field's value should not be NULL or NILL or Empty * defaultedOnCreate = false, Meaning, Salesforce itself does not assign default value for this field when object is created (ex. ID) * updateable = true, Meaning, The filed's value must be updatable by the user. * User must be able to set or modify the value of this field. */ new FieldDTO(fieldDescription.Value <string>("name")) { FieldType = ExtractFieldType(fieldDescription.Value <string>("type")), IsRequired = fieldDescription.Value <bool>("nillable") == false && fieldDescription.Value <bool>("defaultedOnCreate") == false && fieldDescription.Value <bool>("updateable") == true, Availability = AvailabilityType.RunTime, Label = fieldDescription.Value <string>("label"), Data = ExtractFieldData(fieldDescription.ToObject <JObject>()), SourceCrateLabel = label } ) .OrderBy(field => field.Name); objectFields.AddRange(fields); } else { var errorMessage = "Request to Salesforce object properties returned unexpected results"; _logger.Error(errorMessage); throw new ApplicationException(errorMessage); } return(objectFields); }
public async Task <bool> Delete(SalesforceObjectType objectType, string objectId, AuthorizationToken authToken) { try { return(await ExecuteClientOperationWithTokenRefresh(CreateForceClient, x => x.DeleteAsync(objectType.ToString(), objectId), authToken)); } catch (ForceException ex) { _logger.Error($"Failed to delete {objectType} with Id {objectId}", ex); throw; } }
public async Task <string> Create(SalesforceObjectType type, IDictionary <string, object> @object, AuthorizationToken authToken) { var result = await ExecuteClientOperationWithTokenRefresh(CreateForceClient, x => x.CreateAsync(type.ToString(), @object), authToken); return(result?.Id ?? string.Empty); }