diff --git a/QuickbaseNet.Examples/Program.cs b/QuickbaseNet.Examples/Program.cs index d8ad200..25c9a2a 100644 --- a/QuickbaseNet.Examples/Program.cs +++ b/QuickbaseNet.Examples/Program.cs @@ -1,6 +1,5 @@ using Newtonsoft.Json; using QuickbaseNet.Helpers; -using QuickbaseNet.Models; using QuickbaseNet.Requests; using QuickbaseNet.Services; @@ -10,7 +9,7 @@ internal class Program { static async Task Main(string[] args) { - var quickBaseClient = new QuickbaseClient("REALM_NAME", "TOKEN_GOES_HERE"); + var quickBaseClient = new QuickbaseClient("diamond", "bztp36_cn6v_0_c5k72hvbvma5mh8xmjgzb4qqsys"); var query = new QuickbaseQueryBuilder() .From("bmycek2xq") .Select(3, 7, 14, 75, 150, 157, 354, 355, 367, 538, 539, 540, 541, 542, 543) diff --git a/QuickbaseNet/Helpers/QuickbaseCommandBuilder.cs b/QuickbaseNet/Helpers/QuickbaseCommandBuilder.cs index 884f407..9698627 100644 --- a/QuickbaseNet/Helpers/QuickbaseCommandBuilder.cs +++ b/QuickbaseNet/Helpers/QuickbaseCommandBuilder.cs @@ -1,85 +1,88 @@ -using QuickbaseNet.Models; +using System; +using System.Collections.Generic; +using QuickbaseNet.Models; using QuickbaseNet.Requests; -namespace QuickbaseNet.Helpers; - -public class QuickbaseCommandBuilder +namespace QuickbaseNet.Helpers { - private string _tableId; - private string _whereClauseForDeletion; - private readonly List> _records = new(); - private int[] _fieldsToReturn; - - public QuickbaseCommandBuilder ForTable(string tableId) + public class QuickbaseCommandBuilder { - _tableId = tableId; - return this; - } + private string _tableId; + private string _whereClauseForDeletion; + private readonly List> _records = new List>(); + private int[] _fieldsToReturn; - public QuickbaseCommandBuilder ReturnFields(params int[] fieldIds) - { - _fieldsToReturn = fieldIds; - return this; - } + public QuickbaseCommandBuilder ForTable(string tableId) + { + _tableId = tableId; + return this; + } - public QuickbaseCommandBuilder AddNewRecord(Action config) - { - var recordBuilder = new RecordBuilder(); - config(recordBuilder); - _records.Add(recordBuilder.Build()); - return this; - } + public QuickbaseCommandBuilder ReturnFields(params int[] fieldIds) + { + _fieldsToReturn = fieldIds; + return this; + } - public QuickbaseCommandBuilder UpdateRecord(int recordId, Action config) - { - var recordBuilder = new RecordBuilder(); - config(recordBuilder); + public QuickbaseCommandBuilder AddNewRecord(Action config) + { + var recordBuilder = new RecordBuilder(); + config(recordBuilder); + _records.Add(recordBuilder.Build()); + return this; + } - // Assuming '3' is the default key field ID for record ID - recordBuilder.AddField("3", recordId.ToString()); - _records.Add(recordBuilder.Build()); - return this; - } + public QuickbaseCommandBuilder UpdateRecord(int recordId, Action config) + { + var recordBuilder = new RecordBuilder(); + config(recordBuilder); + // Assuming '3' is the default key field ID for record ID + recordBuilder.AddField("3", recordId.ToString()); + _records.Add(recordBuilder.Build()); + return this; + } - public QuickbaseCommandBuilder WithDeletionCriteria(string whereClause) - { - _whereClauseForDeletion = whereClause; - return this; - } - public InsertOrUpdateRecordRequest BuildInsertUpdateCommand() - { - return new InsertOrUpdateRecordRequest + public QuickbaseCommandBuilder WithDeletionCriteria(string whereClause) { - To = _tableId, - Data = _records, - FieldsToReturn = _fieldsToReturn - }; - } + _whereClauseForDeletion = whereClause; + return this; + } - public DeleteRecordRequest BuildDeleteCommand() - { - return new DeleteRecordRequest + public InsertOrUpdateRecordRequest BuildInsertUpdateCommand() { - From = _tableId, - Where = _whereClauseForDeletion - }; - } - - public class RecordBuilder - { - private readonly Dictionary _fields = new(); + return new InsertOrUpdateRecordRequest + { + To = _tableId, + Data = _records, + FieldsToReturn = _fieldsToReturn + }; + } - public RecordBuilder AddField(string fieldId, string value) + public DeleteRecordRequest BuildDeleteCommand() { - _fields[fieldId] = new FieldValue { Value = value }; - return this; + return new DeleteRecordRequest + { + From = _tableId, + Where = _whereClauseForDeletion + }; } - public Dictionary Build() + public class RecordBuilder { - return _fields; + private readonly Dictionary _fields = new Dictionary(); + + public RecordBuilder AddField(string fieldId, string value) + { + _fields[fieldId] = new FieldValue { Value = value }; + return this; + } + + public Dictionary Build() + { + return _fields; + } } } } diff --git a/QuickbaseNet/Helpers/QuickbaseQueryBuilder.cs b/QuickbaseNet/Helpers/QuickbaseQueryBuilder.cs index 22370e4..5c1d162 100644 --- a/QuickbaseNet/Helpers/QuickbaseQueryBuilder.cs +++ b/QuickbaseNet/Helpers/QuickbaseQueryBuilder.cs @@ -1,61 +1,64 @@ -using QuickbaseNet.Models; +using System.Collections.Generic; +using System.Linq; +using QuickbaseNet.Models; using QuickbaseNet.Requests; -namespace QuickbaseNet.Helpers; - -public class QuickbaseQueryBuilder +namespace QuickbaseNet.Helpers { - private string _from; - private List _select; - private string _where; - private List _sortBy; - private List _groupBy; - - public QuickbaseQueryBuilder From(string from) + public class QuickbaseQueryBuilder { - _from = from; - return this; - } + private string _from; + private List _select; + private string _where; + private List _sortBy; + private List _groupBy; - public QuickbaseQueryBuilder Select(params int[] fields) - { - _select = fields.ToList(); - return this; - } + public QuickbaseQueryBuilder From(string from) + { + _from = from; + return this; + } - public QuickbaseQueryBuilder Where(string where) - { - _where = where; - return this; - } + public QuickbaseQueryBuilder Select(params int[] fields) + { + _select = fields.ToList(); + return this; + } - public QuickbaseQueryBuilder SortBy(int fieldId, string order) - { - if (_sortBy == null) - _sortBy = new List(); + public QuickbaseQueryBuilder Where(string where) + { + _where = where; + return this; + } - _sortBy.Add(new SortByItem { FieldId = fieldId, Order = order }); - return this; - } + public QuickbaseQueryBuilder SortBy(int fieldId, string order) + { + if (_sortBy == null) + _sortBy = new List(); - public QuickbaseQueryBuilder GroupBy(int fieldId, string grouping) - { - if (_groupBy == null) - _groupBy = new List(); + _sortBy.Add(new SortByItem { FieldId = fieldId, Order = order }); + return this; + } - _groupBy.Add(new GroupByItem { FieldId = fieldId, Grouping = grouping }); - return this; - } + public QuickbaseQueryBuilder GroupBy(int fieldId, string grouping) + { + if (_groupBy == null) + _groupBy = new List(); - public QuickbaseQueryRequest Build() - { - return new QuickbaseQueryRequest + _groupBy.Add(new GroupByItem { FieldId = fieldId, Grouping = grouping }); + return this; + } + + public QuickbaseQueryRequest Build() { - From = _from, - Select = _select, - Where = _where, - SortBy = _sortBy, - GroupBy = _groupBy - }; + return new QuickbaseQueryRequest + { + From = _from, + Select = _select, + Where = _where, + SortBy = _sortBy, + GroupBy = _groupBy + }; + } } } \ No newline at end of file diff --git a/QuickbaseNet/Models/Field.cs b/QuickbaseNet/Models/Field.cs index 37a252f..7759d80 100644 --- a/QuickbaseNet/Models/Field.cs +++ b/QuickbaseNet/Models/Field.cs @@ -1,14 +1,14 @@ using Newtonsoft.Json; -using System.Text.Json.Serialization; -namespace QuickbaseNet.Models; - -public class Field +namespace QuickbaseNet.Models { - [JsonProperty("id")] - public int Id { get; set; } - [JsonProperty("label")] - public string Label { get; set; } - [JsonProperty("type")] - public string Type { get; set; } + public class Field + { + [JsonProperty("id")] + public int Id { get; set; } + [JsonProperty("label")] + public string Label { get; set; } + [JsonProperty("type")] + public string Type { get; set; } + } } \ No newline at end of file diff --git a/QuickbaseNet/Models/FieldValue.cs b/QuickbaseNet/Models/FieldValue.cs index 76f1ec6..9788243 100644 --- a/QuickbaseNet/Models/FieldValue.cs +++ b/QuickbaseNet/Models/FieldValue.cs @@ -1,10 +1,10 @@ using Newtonsoft.Json; -using System.Text.Json.Serialization; -namespace QuickbaseNet.Models; - -public class FieldValue +namespace QuickbaseNet.Models { - [JsonProperty("value")] - public dynamic Value { get; set; } + public class FieldValue + { + [JsonProperty("value")] + public dynamic Value { get; set; } + } } \ No newline at end of file diff --git a/QuickbaseNet/Models/GroupByItem.cs b/QuickbaseNet/Models/GroupByItem.cs index e84d9e6..b44d9e6 100644 --- a/QuickbaseNet/Models/GroupByItem.cs +++ b/QuickbaseNet/Models/GroupByItem.cs @@ -1,12 +1,12 @@ using Newtonsoft.Json; -using System.Text.Json.Serialization; -namespace QuickbaseNet.Models; - -public class GroupByItem +namespace QuickbaseNet.Models { - [JsonProperty("fieldId")] - public int FieldId { get; set; } - [JsonProperty("grouping")] - public string Grouping { get; set; } + public class GroupByItem + { + [JsonProperty("fieldId")] + public int FieldId { get; set; } + [JsonProperty("grouping")] + public string Grouping { get; set; } + } } \ No newline at end of file diff --git a/QuickbaseNet/Models/Metadata.cs b/QuickbaseNet/Models/Metadata.cs index edf790c..ec6d985 100644 --- a/QuickbaseNet/Models/Metadata.cs +++ b/QuickbaseNet/Models/Metadata.cs @@ -1,16 +1,16 @@ -using System.Text.Json.Serialization; -using Newtonsoft.Json; +using Newtonsoft.Json; -namespace QuickbaseNet.Models; - -public class Metadata +namespace QuickbaseNet.Models { - [JsonProperty("totalRecords")] - public int TotalRecords { get; set; } - [JsonProperty("numRecords")] - public int NumRecords { get; set; } - [JsonProperty("numFields")] - public int NumFields { get; set; } - [JsonProperty("skip")] - public int Skip { get; set; } + public class Metadata + { + [JsonProperty("totalRecords")] + public int TotalRecords { get; set; } + [JsonProperty("numRecords")] + public int NumRecords { get; set; } + [JsonProperty("numFields")] + public int NumFields { get; set; } + [JsonProperty("skip")] + public int Skip { get; set; } + } } \ No newline at end of file diff --git a/QuickbaseNet/Models/Options.cs b/QuickbaseNet/Models/Options.cs index e816d3d..c4542f1 100644 --- a/QuickbaseNet/Models/Options.cs +++ b/QuickbaseNet/Models/Options.cs @@ -1,13 +1,14 @@ using Newtonsoft.Json; -namespace QuickbaseNet.Models; - -public class Options +namespace QuickbaseNet.Models { - [JsonProperty("skip")] - public int Skip { get; set; } - [JsonProperty("top")] - public int Top { get; set; } - [JsonProperty("compareWithAppLocalTime")] - public bool CompareWithAppLocalTime { get; set; } + public class Options + { + [JsonProperty("skip")] + public int Skip { get; set; } + [JsonProperty("top")] + public int Top { get; set; } + [JsonProperty("compareWithAppLocalTime")] + public bool CompareWithAppLocalTime { get; set; } + } } \ No newline at end of file diff --git a/QuickbaseNet/Models/SortByItem.cs b/QuickbaseNet/Models/SortByItem.cs index 15e78f2..325e4ea 100644 --- a/QuickbaseNet/Models/SortByItem.cs +++ b/QuickbaseNet/Models/SortByItem.cs @@ -1,11 +1,12 @@ using Newtonsoft.Json; -namespace QuickbaseNet.Models; - -public class SortByItem +namespace QuickbaseNet.Models { - [JsonProperty("fieldId")] - public int FieldId { get; set; } - [JsonProperty("order")] - public string Order { get; set; } + public class SortByItem + { + [JsonProperty("fieldId")] + public int FieldId { get; set; } + [JsonProperty("order")] + public string Order { get; set; } + } } \ No newline at end of file diff --git a/QuickbaseNet/QuickbaseNet.csproj b/QuickbaseNet/QuickbaseNet.csproj index 3b5b170..95540a2 100644 --- a/QuickbaseNet/QuickbaseNet.csproj +++ b/QuickbaseNet/QuickbaseNet.csproj @@ -1,13 +1,26 @@  - net8.0 - enable - enable + netstandard2.0;netstandard2.1;net5.0;net6.0;net48 + True + + + QuickbaseNet + 0.1.1 + ducksoop + Unofficial Quickbase JSON API wrapper for .NET. Provides Query and Command builders for querying and adding/editing records. + https://github.com/ducksoop/quickbase-net + git + Initial release; right now only have Query capabilities available. + true + $(NoWarn);1591 + MIT + + diff --git a/QuickbaseNet/Requests/DeleteRecordRequest.cs b/QuickbaseNet/Requests/DeleteRecordRequest.cs index 61fa794..5aa164d 100644 --- a/QuickbaseNet/Requests/DeleteRecordRequest.cs +++ b/QuickbaseNet/Requests/DeleteRecordRequest.cs @@ -1,11 +1,12 @@ using Newtonsoft.Json; -namespace QuickbaseNet.Requests; - -public class DeleteRecordRequest +namespace QuickbaseNet.Requests { - [JsonProperty("from")] - public string From { get; set; } - [JsonProperty("where")] - public string Where { get; set; } + public class DeleteRecordRequest + { + [JsonProperty("from")] + public string From { get; set; } + [JsonProperty("where")] + public string Where { get; set; } + } } \ No newline at end of file diff --git a/QuickbaseNet/Requests/InsertOrUpdateRecordRequest.cs b/QuickbaseNet/Requests/InsertOrUpdateRecordRequest.cs index d77fc1c..41bf7e0 100644 --- a/QuickbaseNet/Requests/InsertOrUpdateRecordRequest.cs +++ b/QuickbaseNet/Requests/InsertOrUpdateRecordRequest.cs @@ -1,16 +1,19 @@ -using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; using QuickbaseNet.Models; -namespace QuickbaseNet.Requests; - -public class InsertOrUpdateRecordRequest +namespace QuickbaseNet.Requests { - [JsonProperty("to", NullValueHandling = NullValueHandling.Ignore)] - public string To { get; set; } = string.Empty; + public class InsertOrUpdateRecordRequest + { + [JsonProperty("to", NullValueHandling = NullValueHandling.Ignore)] + public string To { get; set; } = string.Empty; - [JsonProperty("data", NullValueHandling = NullValueHandling.Ignore)] - public List>? Data { get; set; } = new(); + [JsonProperty("data", NullValueHandling = NullValueHandling.Ignore)] + public List> Data { get; set; } = new List>(); - [JsonProperty("fieldsToReturn", NullValueHandling = NullValueHandling.Ignore)] - public int[] FieldsToReturn { get; set; } = Array.Empty(); + [JsonProperty("fieldsToReturn", NullValueHandling = NullValueHandling.Ignore)] + public int[] FieldsToReturn { get; set; } = Array.Empty(); + } } \ No newline at end of file diff --git a/QuickbaseNet/Requests/QuickbaseQueryRequest.cs b/QuickbaseNet/Requests/QuickbaseQueryRequest.cs index f083f35..bad20cc 100644 --- a/QuickbaseNet/Requests/QuickbaseQueryRequest.cs +++ b/QuickbaseNet/Requests/QuickbaseQueryRequest.cs @@ -1,20 +1,22 @@ -using Newtonsoft.Json; +using System.Collections.Generic; +using Newtonsoft.Json; using QuickbaseNet.Models; -namespace QuickbaseNet.Requests; - -public class QuickbaseQueryRequest +namespace QuickbaseNet.Requests { - [JsonProperty("from")] - public string From { get; set; } - [JsonProperty("select")] - public List Select { get; set; } - [JsonProperty("where")] - public string Where { get; set; } - [JsonProperty("sortBy")] - public List SortBy { get; set; } - [JsonProperty("groupBy")] - public List GroupBy { get; set; } - [JsonProperty("options")] - public Options Options { get; set; } + public class QuickbaseQueryRequest + { + [JsonProperty("from")] + public string From { get; set; } + [JsonProperty("select")] + public List Select { get; set; } + [JsonProperty("where")] + public string Where { get; set; } + [JsonProperty("sortBy")] + public List SortBy { get; set; } + [JsonProperty("groupBy")] + public List GroupBy { get; set; } + [JsonProperty("options")] + public Options Options { get; set; } + } } \ No newline at end of file diff --git a/QuickbaseNet/Responses/QuickbaseErrorResponse.cs b/QuickbaseNet/Responses/QuickbaseErrorResponse.cs index a7f71c9..6303b1a 100644 --- a/QuickbaseNet/Responses/QuickbaseErrorResponse.cs +++ b/QuickbaseNet/Responses/QuickbaseErrorResponse.cs @@ -1,11 +1,12 @@ using Newtonsoft.Json; -namespace QuickbaseNet.Responses; - -public class QuickbaseErrorResponse +namespace QuickbaseNet.Responses { - [JsonProperty("message")] - public string Message { get; set; } - [JsonProperty("description")] - public string Description { get; set; } + public class QuickbaseErrorResponse + { + [JsonProperty("message")] + public string Message { get; set; } + [JsonProperty("description")] + public string Description { get; set; } + } } \ No newline at end of file diff --git a/QuickbaseNet/Responses/QuickbaseQueryResponse.cs b/QuickbaseNet/Responses/QuickbaseQueryResponse.cs index 26e3920..6dcad37 100644 --- a/QuickbaseNet/Responses/QuickbaseQueryResponse.cs +++ b/QuickbaseNet/Responses/QuickbaseQueryResponse.cs @@ -1,14 +1,16 @@ -using Newtonsoft.Json; +using System.Collections.Generic; +using Newtonsoft.Json; using QuickbaseNet.Models; -namespace QuickbaseNet.Responses; - -public class QuickbaseQueryResponse +namespace QuickbaseNet.Responses { - [JsonProperty("data")] - public List> Data { get; set; } - [JsonProperty("fields")] - public List Fields { get; set; } - [JsonProperty("metadata")] - public Metadata Metadata { get; set; } + public class QuickbaseQueryResponse + { + [JsonProperty("data")] + public List> Data { get; set; } + [JsonProperty("fields")] + public List Fields { get; set; } + [JsonProperty("metadata")] + public Metadata Metadata { get; set; } + } } \ No newline at end of file diff --git a/QuickbaseNet/Responses/QuickbaseRecordUpdateResponse.cs b/QuickbaseNet/Responses/QuickbaseRecordUpdateResponse.cs index 70d6fe2..9e8c3d2 100644 --- a/QuickbaseNet/Responses/QuickbaseRecordUpdateResponse.cs +++ b/QuickbaseNet/Responses/QuickbaseRecordUpdateResponse.cs @@ -1,13 +1,15 @@ -using Newtonsoft.Json; +using System.Collections.Generic; +using Newtonsoft.Json; using QuickbaseNet.Models; -namespace QuickbaseNet.Responses; - -public class QuickbaseRecordUpdateResponse +namespace QuickbaseNet.Responses { - [JsonProperty("data", NullValueHandling = NullValueHandling.Ignore)] - public List> Data { get; set; } = new(); + public class QuickbaseRecordUpdateResponse + { + [JsonProperty("data", NullValueHandling = NullValueHandling.Ignore)] + public List> Data { get; set; } = new List>(); - [JsonProperty("metadata", NullValueHandling = NullValueHandling.Ignore)] - public Metadata Metadata { get; set; } = new(); + [JsonProperty("metadata", NullValueHandling = NullValueHandling.Ignore)] + public Metadata Metadata { get; set; } = new Metadata(); + } } \ No newline at end of file diff --git a/QuickbaseNet/Services/QuickbaseClient.cs b/QuickbaseNet/Services/QuickbaseClient.cs index 2bdac24..c0134c6 100644 --- a/QuickbaseNet/Services/QuickbaseClient.cs +++ b/QuickbaseNet/Services/QuickbaseClient.cs @@ -1,5 +1,7 @@ -using System.Text; -using System.Text.Json; +using System; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; using Newtonsoft.Json; using QuickbaseNet.Requests; using QuickbaseNet.Responses; @@ -9,13 +11,12 @@ namespace QuickbaseNet.Services public class QuickbaseClient { private const string BaseUrl = "https://api.quickbase.com"; - private const string UserAgent = "QuickbaseNet/1.0"; + private const string UserAgent = "QuickbaseNet/0.1.1"; - private readonly HttpClient _httpClient = new(); + private readonly HttpClient _httpClient = new HttpClient(); public QuickbaseClient(string realm, string userToken) { - _httpClient.BaseAddress = new Uri(BaseUrl); _httpClient.DefaultRequestHeaders.Add("QB-Realm-Hostname", $"{realm}.quickbase.com"); _httpClient.DefaultRequestHeaders.Add("Authorization", $"QB-USER-TOKEN {userToken}"); @@ -31,14 +32,14 @@ public QuickbaseClient(string realm, string userToken) if (response.IsSuccessStatusCode) { var jsonResponse = await response.Content.ReadAsStringAsync(); - return (JsonConvert.DeserializeObject(jsonResponse), null, true)!; + return (JsonConvert.DeserializeObject(jsonResponse), null, true); } var errorResponse = await response.Content.ReadAsStringAsync(); - return (null, JsonConvert.DeserializeObject(errorResponse), false)!; + return (null, JsonConvert.DeserializeObject(errorResponse), false); } - public async Task<(QuickbaseRecordUpdateResponse Response, QuickbaseErrorResponse Error, bool IsSuccess)> + internal async Task<(QuickbaseRecordUpdateResponse Response, QuickbaseErrorResponse Error, bool IsSuccess)> InsertRecords(InsertOrUpdateRecordRequest quickBaseRequest) { HttpContent content = new StringContent(JsonConvert.SerializeObject(quickBaseRequest), Encoding.UTF8, "application/json"); @@ -48,14 +49,14 @@ public QuickbaseClient(string realm, string userToken) if (response.IsSuccessStatusCode) { var jsonResponse = await response.Content.ReadAsStringAsync(); - return (JsonConvert.DeserializeObject(jsonResponse), null, true)!; + return (JsonConvert.DeserializeObject(jsonResponse), null, true); } var errorResponse = await response.Content.ReadAsStringAsync(); - return (null, JsonConvert.DeserializeObject(errorResponse), false)!; + return (null, JsonConvert.DeserializeObject(errorResponse), false); } - public async Task<(QuickbaseRecordUpdateResponse Response, QuickbaseErrorResponse Error, bool IsSuccess)> + internal async Task<(QuickbaseRecordUpdateResponse Response, QuickbaseErrorResponse Error, bool IsSuccess)> UpdateRecords(InsertOrUpdateRecordRequest quickBaseRequest) { HttpContent content = new StringContent(JsonConvert.SerializeObject(quickBaseRequest), Encoding.UTF8, "application/json"); @@ -65,11 +66,11 @@ public QuickbaseClient(string realm, string userToken) if (response.IsSuccessStatusCode) { var jsonResponse = await response.Content.ReadAsStringAsync(); - return (JsonConvert.DeserializeObject(jsonResponse), null, true)!; + return (JsonConvert.DeserializeObject(jsonResponse), null, true); } var errorResponse = await response.Content.ReadAsStringAsync(); - return (null, JsonConvert.DeserializeObject(errorResponse), false)!; + return (null, JsonConvert.DeserializeObject(errorResponse), false); } } }