/// <summary> /// Reads the JSON representation of the object. /// </summary> /// <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader" /> to read from.</param> /// <param name="objectType">Type of the object.</param> /// <param name="existingValue">The existing value of object being read.</param> /// <param name="serializer">The calling serializer.</param> /// <returns> /// The object value. /// </returns> /// <exception cref="System.Exception">Unable to determine the field type.</exception> public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.StartArray) { var fields = new List <Models.Legacy.Field>(); var jArray = JArray.Load(reader); foreach (var item in jArray) { var id = item.GetPropertyValue <int?>("id"); var name = item.GetPropertyValue <string>("name"); var type = item.GetPropertyValue <string>("type"); var field = (Models.Legacy.Field)null; switch (type) { case "date": var unixTime = item.GetPropertyValue <long?>("value"); if (unixTime.HasValue) { field = new Models.Legacy.Field <DateTime>(name, unixTime.Value.FromUnixTime()); } else { field = new Models.Legacy.Field <DateTime?>(name, null); } break; case "text": field = new Models.Legacy.Field <string>(name, item.GetPropertyValue <string>("value")); break; case "number": var numericValue = item.GetPropertyValue <long?>("value"); if (numericValue.HasValue) { field = new Models.Legacy.Field <long>(name, numericValue.Value); } else { field = new Models.Legacy.Field <long?>(name, null); } break; default: throw new Exception($"{type} is an unknown field type"); } if (id.HasValue) { field.Id = id.Value; } fields.Add(field); } return(fields.ToArray()); } return(Array.Empty <Models.Legacy.Field>()); }
public async Task RunAsync(ILegacyClient client, TextWriter log, CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return; } await log.WriteLineAsync("\n***** LEGACY CONTACTS AND CUSTOM FIELDS *****\n").ConfigureAwait(false); // GET ALL FIELDS var fields = await client.CustomFields.GetAllAsync(null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"All custom fields retrieved. There are {fields.Length} fields").ConfigureAwait(false); // CLEANUP PREVIOUS INTEGRATION TESTS THAT MIGHT HAVE BEEN INTERRUPTED BEFORE THEY HAD TIME TO CLEANUP AFTER THEMSELVES var cleanUpTasks = fields .Where(f => f.Name.StartsWith("stronggrid_")) .Select(async oldField => { await client.CustomFields.DeleteAsync(oldField.Id, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Field {oldField.Id} deleted").ConfigureAwait(false); await Task.Delay(250).ConfigureAwait(false); // Brief pause to ensure SendGrid has time to catch up }); await Task.WhenAll(cleanUpTasks).ConfigureAwait(false); var nicknameField = await client.CustomFields.CreateAsync("stronggrid_nickname", FieldType.Text, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Field '{nicknameField.Name}' Id: {nicknameField.Id}").ConfigureAwait(false); var ageField = await client.CustomFields.CreateAsync("stronggrid_age", FieldType.Number, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Field '{ageField.Name}' Id: {ageField.Id}").ConfigureAwait(false); var customerSinceField = await client.CustomFields.CreateAsync("stronggrid_customer_since", FieldType.Date, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Field '{customerSinceField.Name}' Id: {customerSinceField.Id}").ConfigureAwait(false); fields = await client.CustomFields.GetAllAsync(null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"All custom fields retrieved. There are {fields.Length} fields").ConfigureAwait(false); var email = "*****@*****.**"; var firstName = "Robert"; var lastName = "Unknown"; var customFields = new Models.Legacy.Field[] { new Models.Legacy.Field <string>("stronggrid_nickname", "Bob"), new Models.Legacy.Field <long?>("stronggrid_age", 42), new Models.Legacy.Field <DateTime>("stronggrid_customer_since", new DateTime(2000, 12, 1)) }; var contactId = await client.Contacts.CreateAsync(email, firstName, lastName, customFields, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Contact {contactId} created: {firstName} {lastName}").ConfigureAwait(false); var newLastName = "Smith"; await client.Contacts.UpdateAsync(email, null, newLastName, cancellationToken : cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Contact {contactId} updated: {firstName} {newLastName}").ConfigureAwait(false); var contact = await client.Contacts.GetAsync(contactId, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Retrieved contact {contactId}").ConfigureAwait(false); await log.WriteLineAsync($"\tEmail: {contact.Email}").ConfigureAwait(false); await log.WriteLineAsync($"\tFirst Name: {contact.FirstName}").ConfigureAwait(false); await log.WriteLineAsync($"\tLast Name: {contact.LastName}").ConfigureAwait(false); await log.WriteLineAsync($"\tCreated On:{contact.CreatedOn}").ConfigureAwait(false); await log.WriteLineAsync($"\tModified On: {contact.ModifiedOn}").ConfigureAwait(false); await log.WriteLineAsync($"\tLast Clicked On: {contact.LastClickedOn}").ConfigureAwait(false); await log.WriteLineAsync($"\tLast Emailed On: {contact.LastEmailedOn}").ConfigureAwait(false); await log.WriteLineAsync($"\tLast Opened On: {contact.LastOpenedOn}").ConfigureAwait(false); foreach (var customField in contact.CustomFields.OfType <Models.Legacy.Field <string> >()) { await log.WriteLineAsync($"\t{customField.Name}: {customField.Value}").ConfigureAwait(false); } foreach (var customField in contact.CustomFields.OfType <Models.Legacy.Field <long?> >()) { await log.WriteLineAsync($"\t{customField.Name}: {customField.Value}").ConfigureAwait(false); } foreach (var customField in contact.CustomFields.OfType <Models.Legacy.Field <DateTime?> >()) { await log.WriteLineAsync($"\t{customField.Name}: {customField.Value}").ConfigureAwait(false); } var recordsPerPage = 5; var contacts = await client.Contacts.GetAsync(recordsPerPage, 1, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync(contacts.Length < recordsPerPage?$"Found {contacts.Length} contacts" : $"Retrieved the first {recordsPerPage} contacts").ConfigureAwait(false); foreach (var record in contacts) { await log.WriteLineAsync($"\t{record.FirstName} {record.LastName}").ConfigureAwait(false); } var firstNameCondition = new SearchCondition { Field = "first_name", Value = "Robert", Operator = ConditionOperator.Equal, LogicalOperator = LogicalOperator.None }; var LastNameCondition = new SearchCondition { Field = "last_name", Value = "Smith", Operator = ConditionOperator.Equal, LogicalOperator = LogicalOperator.And }; var searchResult = await client.Contacts.SearchAsync(new[] { firstNameCondition, LastNameCondition }, null, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Found {searchResult.Length} contacts named Robert Smith").ConfigureAwait(false); var billableCount = await client.Contacts.GetBillableCountAsync(null, cancellationToken).ConfigureAwait(false); var totalCount = await client.Contacts.GetTotalCountAsync(null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync("Record counts").ConfigureAwait(false); await log.WriteLineAsync($"\tBillable: {billableCount}").ConfigureAwait(false); await log.WriteLineAsync($"\tTotal: {totalCount}").ConfigureAwait(false); await client.Contacts.DeleteAsync(contactId, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Contact {contactId} deleted: {firstName} {newLastName}").ConfigureAwait(false); await client.CustomFields.DeleteAsync(nicknameField.Id, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Field {nicknameField.Id} deleted").ConfigureAwait(false); await client.CustomFields.DeleteAsync(ageField.Id, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Field {ageField.Id} deleted").ConfigureAwait(false); await client.CustomFields.DeleteAsync(customerSinceField.Id, null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"Field {customerSinceField.Id} deleted").ConfigureAwait(false); fields = await client.CustomFields.GetAllAsync(null, cancellationToken).ConfigureAwait(false); await log.WriteLineAsync($"All custom fields retrieved. There are {fields.Length} fields").ConfigureAwait(false); }
public override Models.Legacy.Field[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (JsonDocument.TryParseValue(ref reader, out var doc)) { if (doc.RootElement.ValueKind == JsonValueKind.Array) { var fields = new List <Models.Legacy.Field>(); foreach (var item in doc.RootElement.EnumerateArray()) { var id = item.TryGetProperty("id", out JsonElement idProperty) ? idProperty.GetInt32() : (int?)null; var name = item.TryGetProperty("name", out JsonElement nameProperty) ? nameProperty.GetString() : null; var type = item.TryGetProperty("type", out JsonElement typeProperty) ? typeProperty.GetString() : null; var field = (Models.Legacy.Field)null; switch (type) { case "date": if (!item.TryGetProperty("value", out JsonElement dateProperty)) { field = new Models.Legacy.Field <DateTime?>(name, null); } else if (dateProperty.ValueKind == JsonValueKind.Number) { field = new Models.Legacy.Field <DateTime>(name, dateProperty.GetInt64().FromUnixTime()); } else { field = new Models.Legacy.Field <DateTime>(name, long.Parse(dateProperty.GetString()).FromUnixTime()); } break; case "text": if (!item.TryGetProperty("value", out JsonElement textProperty)) { field = new Models.Legacy.Field <string>(name, null); } else { field = new Models.Legacy.Field <string>(name, textProperty.GetString()); } break; case "number": if (!item.TryGetProperty("value", out JsonElement numericProperty)) { field = new Models.Legacy.Field <long?>(name, null); } else if (numericProperty.ValueKind == JsonValueKind.Number) { field = new Models.Legacy.Field <long>(name, numericProperty.GetInt64()); } else { field = new Models.Legacy.Field <long>(name, long.Parse(numericProperty.GetString())); } break; default: throw new Exception($"{type} is an unknown field type"); } if (id.HasValue) { field.Id = id.Value; } fields.Add(field); } return(fields.ToArray()); } } return(Array.Empty <Models.Legacy.Field>()); }