Skip to content

Commit

Permalink
v1.2.1
Browse files Browse the repository at this point in the history
- Improve the `BaseClient` and remove the overloads for url parameters, now `QueryParameters` must be used instead to populate the parameters collection
- Improve the `WormsClient` and `MarineRegionsCLient`, rename/shorten all methods
  • Loading branch information
sn4k3 committed Aug 17, 2023
1 parent d18f1a1 commit 2fa01f6
Show file tree
Hide file tree
Showing 12 changed files with 656 additions and 602 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Change Log

## 17/08/2023 - v1.2.1

- Improve the `BaseClient` and remove the overloads for url parameters, now `QueryParameters` must be used instead to populate the parameters collection
- Improve the `WormsClient` and `MarineRegionsCLient`, rename/shorten all methods

## 15/08/2023 - v1.2.0

- **BaseClient**:
Expand Down
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<Authors>Tiago Conceição (sn4k3)</Authors>
<Company>PTRTECH</Company>
<Copyright>Copyright 2023-$([System.DateTime]::Now.ToString(`yyyy`)) © PTRTECH</Copyright>
<Version>1.2.0</Version>
<Version>1.2.1</Version>
<Description>Queries and fetch data from species, taxon, regions and conservation database(s) to retrieve information using the provider API.</Description>
<ApplicationIcon>$(MSBuildThisFileDirectory)images/icon.ico</ApplicationIcon>

Expand Down
364 changes: 23 additions & 341 deletions SpeciesDatabaseApi/BaseClient.cs

Large diffs are not rendered by default.

32 changes: 16 additions & 16 deletions SpeciesDatabaseApi/BoldSystems/BoldSystemsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ public BoldSystemsClient(HttpClient? httpClient = null) : base(DefaultApiAddress
/// <returns></returns>
public Task<Stats?> GetStats(PublicApiParameters requestParameters, BoldStatsDataType dataType = BoldStatsDataType.DrillDown, CancellationToken token = default)
{
var parameters = GetDictionaryFromClassProperties(requestParameters);
var parameters = new QueryParameters(QueryParametersSpecialType.ClassPropertiesReflection, requestParameters);
if (parameters.Count == 0) throw new ArgumentException("The call require at least one parameter", nameof(requestParameters));
parameters.TryAdd("dataType", StringExtensions.PrependCharByUpperChar(dataType.ToString(), '_').ToLowerInvariant());
parameters.TryAdd("format", "json");
parameters.Add("dataType", StringExtensions.PrependCharByUpperChar(dataType.ToString(), '_').ToLowerInvariant());
parameters.Add("format", "json");
return GetJsonAsync<Stats>("API_Public/stats", parameters, token);
}

Expand All @@ -72,9 +72,9 @@ public BoldSystemsClient(HttpClient? httpClient = null) : base(DefaultApiAddress
/// <returns></returns>
public Task<SpecimenResults?> GetSpecimen(PublicApiParameters requestParameters, CancellationToken token = default)
{
var parameters = GetDictionaryFromClassProperties(requestParameters);
if (parameters.Count == 0) throw new ArgumentException("The call require at least one parameter", nameof(requestParameters));
parameters.TryAdd("format", "json");
var parameters = new QueryParameters(QueryParametersSpecialType.ClassPropertiesReflection, requestParameters);
if (parameters.Count == 0) throw new ArgumentException("The call require at least one parameter", nameof(requestParameters));
parameters.Add("format", "json");
return GetJsonAsync<SpecimenResults>("API_Public/specimen", parameters, token);
}

Expand All @@ -87,7 +87,7 @@ public BoldSystemsClient(HttpClient? httpClient = null) : base(DefaultApiAddress
/// <returns></returns>
public async Task<List<SequenceData>> GetSequences(PublicApiParameters requestParameters, CancellationToken token = default)
{
var parameters = GetDictionaryFromClassProperties(requestParameters);
var parameters = new QueryParameters(QueryParametersSpecialType.ClassPropertiesReflection, requestParameters);
if (parameters.Count == 0) throw new ArgumentException("The call require at least one parameter", nameof(requestParameters));
using var response = await GetResponseAsync("API_Public/sequence", parameters, token).ConfigureAwait(false);

Expand Down Expand Up @@ -129,9 +129,9 @@ public async Task<List<SequenceData>> GetSequences(PublicApiParameters requestPa
/// <returns></returns>
public Task<SpecimenResults?> GetSpecimenAndSequence(PublicApiParameters requestParameters, CancellationToken token = default)
{
var parameters = GetDictionaryFromClassProperties(requestParameters);
var parameters = new QueryParameters(QueryParametersSpecialType.ClassPropertiesReflection, requestParameters);
if (parameters.Count == 0) throw new ArgumentException("The call require at least one parameter", nameof(requestParameters));
parameters.TryAdd("format", "json");
parameters.Add("format", "json");
return GetJsonAsync<SpecimenResults>("API_Public/combined", parameters, token);
}

Expand All @@ -144,7 +144,7 @@ public async Task<List<SequenceData>> GetSequences(PublicApiParameters requestPa
/// <returns></returns>
public Task DownloadTraceFile(PublicApiParameters requestParameters, Stream stream, CancellationToken token = default)
{
var parameters = GetDictionaryFromClassProperties(requestParameters);
var parameters = new QueryParameters(QueryParametersSpecialType.ClassPropertiesReflection, requestParameters);
if (parameters.Count == 0) throw new ArgumentException("The call require at least one parameter", nameof(requestParameters));
return DownloadAsync("API_Public/trace", parameters, stream, token);
}
Expand All @@ -158,7 +158,7 @@ public Task DownloadTraceFile(PublicApiParameters requestParameters, Stream stre
/// <returns></returns>
public async Task DownloadTraceFile(PublicApiParameters requestParameters, string filePath, CancellationToken token = default)
{
var parameters = GetDictionaryFromClassProperties(requestParameters);
var parameters = new QueryParameters(QueryParametersSpecialType.ClassPropertiesReflection, requestParameters);
if (parameters.Count == 0) throw new ArgumentException("The call require at least one parameter", nameof(requestParameters));

await using var fs = File.Open(filePath, FileMode.Create);
Expand All @@ -174,7 +174,7 @@ public async Task DownloadTraceFile(PublicApiParameters requestParameters, strin
/// <returns>the top public matches (up to 100) can be retrieved by querying a COI sequence.</returns>
public Task<TaxonData?> GetTaxonData(int taxId, BoldDataTypesEnum dataTypes = BoldDataTypesEnum.Basic, CancellationToken token = default)
{
var parameters = new Dictionary<string, object?>
var parameters = new QueryParameters
{
{"taxId", taxId},
{"dataTypes", dataTypes},
Expand All @@ -192,8 +192,8 @@ public async Task DownloadTraceFile(PublicApiParameters requestParameters, strin
/// <returns>the top public matches (up to 100) can be retrieved by querying a COI sequence.</returns>
public Task<Dictionary<int, TaxonData>?> GetTaxonDataIncludeTree(int taxId, BoldDataTypesEnum dataTypes = BoldDataTypesEnum.Basic, CancellationToken token = default)
{
var parameters = new Dictionary<string, object?>
{
var parameters = new QueryParameters
{
{"taxId", taxId},
{"dataTypes", dataTypes},
{"includeTree", true}
Expand All @@ -210,7 +210,7 @@ public async Task DownloadTraceFile(PublicApiParameters requestParameters, strin
/// <returns>the top public matches (up to 100) can be retrieved by querying a COI sequence.</returns>
public Task<TaxonSearch?> GetTaxonData(string taxName, bool fuzzy = false, CancellationToken token = default)
{
var parameters = new Dictionary<string, object?>
var parameters = new QueryParameters
{
{"taxName", taxName},
{"fuzzy", fuzzy},
Expand All @@ -227,7 +227,7 @@ public async Task DownloadTraceFile(PublicApiParameters requestParameters, strin
/// <returns>the top public matches (up to 100) can be retrieved by querying a COI sequence.</returns>
public Task<CoiMatches?> GetCoiMatches(BoldDatabaseEnum db, string sequence, CancellationToken token = default)
{
var parameters = new Dictionary<string, object?>
var parameters = new QueryParameters
{
{"db", db},
{"sequence", sequence}
Expand Down
46 changes: 23 additions & 23 deletions SpeciesDatabaseApi/MarineRegions/MarineRegionsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="mrgId">The MRGID to search for</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<GazetteerRecord?> GetGazetteerRecord(int mrgId, CancellationToken token = default)
public Task<GazetteerRecord?> GetRecord(int mrgId, CancellationToken token = default)
{
return GetJsonAsync<GazetteerRecord>($"getGazetteerRecordByMRGID.json/{mrgId}/", token);
}
Expand All @@ -60,7 +60,7 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="mrgId">The MRGID to search for</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<JsonNode?> GetFullGazetteerRecord(int mrgId, CancellationToken token = default)
public Task<JsonNode?> GetFullRecord(int mrgId, CancellationToken token = default)
{
return GetJsonAsync<JsonNode>($"getGazetteerRecordByMRGID.jsonld/{mrgId}/", token);
}
Expand All @@ -71,7 +71,7 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="mrgId">The MRGID to search for</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<JsonNode?> GetGazetteerGeometries(int mrgId, CancellationToken token = default)
public Task<JsonNode?> GetGeometries(int mrgId, CancellationToken token = default)
{
return GetJsonAsync<JsonNode>($"getGazetteerGeometries.jsonld/{mrgId}/", token);
}
Expand All @@ -81,7 +81,7 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public Task<GazetteerType[]?> GetGazetteerTypes(CancellationToken token = default)
public Task<GazetteerType[]?> GetTypes(CancellationToken token = default)
{
return GetJsonAsync<GazetteerType[]>("getGazetteerTypes.json/", token);
}
Expand All @@ -92,15 +92,15 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="name">The name to search for</param>
/// <param name="like">Adds a '%'-sign before and after the GazetteerName (SQL LIKE function). Default=true</param>
/// <param name="fuzzy">Uses Levenshtein query to find nearest matches. Default=false</param>
/// <param name="typeIds">One or more placetypeIDs. See <see cref="GetGazetteerTypes"/> to retrieve a list of placetypeIDs. Default=(empty)</param>
/// <param name="typeIds">One or more placetypeIDs. See <see cref="GetTypes"/> to retrieve a list of placetypeIDs. Default=(empty)</param>
/// <param name="language">Language (ISO 639-1 code). Default=(empty)</param>
/// <param name="offset">Start record number, in order to page through next batch of results. Default=0</param>
/// <param name="count">Number of records to retrieve. Default=100; max=100</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<GazetteerRecord[]?> GetGazetteerRecords(string name, bool like = true, bool fuzzy = false, IEnumerable<int>? typeIds = null, string? language = null, int offset = 0, int count = 100, CancellationToken token = default)
public Task<GazetteerRecord[]?> GetRecords(string name, bool like = true, bool fuzzy = false, IEnumerable<int>? typeIds = null, string? language = null, int offset = 0, int count = 100, CancellationToken token = default)
{
var parameters = new Dictionary<string, object?>
var parameters = new QueryParameters
{
{"like", like},
{"fuzzy", fuzzy},
Expand All @@ -120,7 +120,7 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="fuzzy">Uses Levenshtein query to find nearest matches. Default=false</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<List<GazetteerRecord[]>?> GetGazetteerRecords(IEnumerable<string?> names, bool like = true, bool fuzzy = false, CancellationToken token = default)
public Task<List<GazetteerRecord[]>?> GetRecords(IEnumerable<string?> names, bool like = true, bool fuzzy = false, CancellationToken token = default)
{
var namesPath = new StringBuilder();
foreach (var name in names)
Expand All @@ -147,7 +147,7 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
// page=2023-07-31T15:00:00Z/2023-07-31T16:00:00Z
// 2023-07-11T22:05:53.8948950+01:00/2023-08-11T22:05:53.8962167+01:00
// 2023-07-11T21:06:43.0750477Z/2023-08-11T21:06:43.0763630Z
var parameters = new KeyValuePair<string, object?>("page", $"{startDateTime.ToUniversalTime():O}/{endDateTime.ToUniversalTime():O}");
var parameters = new QueryParameters("page", $"{startDateTime.ToUniversalTime():O}/{endDateTime.ToUniversalTime():O}");
return GetJsonAsync<JsonNode>("getFeed.jsonld", parameters, token);
}

Expand All @@ -168,7 +168,7 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="mrgId">The MRGID to search for</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<GazetteerWms[]?> GetgetGazetteerWmSes(int mrgId, CancellationToken token = default)
public Task<GazetteerWms[]?> GetWmSes(int mrgId, CancellationToken token = default)
{
return GetJsonAsync<GazetteerWms[]>($"getGazetteerWMSes.json/{mrgId}/", token);
}
Expand All @@ -181,9 +181,9 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="type"></param>
/// <param name="token"></param>
/// <returns></returns>
public Task<GazetteerRecord[]?> GetGazetteerRelations(int mrgId, RelationDirection direction = RelationDirection.Upper, RelationType type = RelationType.PartOf, CancellationToken token = default)
public Task<GazetteerRecord[]?> GetRelations(int mrgId, RelationDirection direction = RelationDirection.Upper, RelationType type = RelationType.PartOf, CancellationToken token = default)
{
var parameters = new Dictionary<string, object?>
var parameters = new QueryParameters
{
{"direction", direction},
{"type", type},
Expand All @@ -197,9 +197,9 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="offset">Provide offset to return next batch of 100 sources.</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<GazetteerSource[]?> GetGazetteerSources(int offset = 0, CancellationToken token = default)
public Task<GazetteerSource[]?> GetSources(int offset = 0, CancellationToken token = default)
{
var parameters = new KeyValuePair<string, object?>("offset", offset);
var parameters = new QueryParameters("offset", offset);
return GetJsonAsync<GazetteerSource[]>("getGazetteerSources.json/", parameters, token);
}

Expand All @@ -209,7 +209,7 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="sourceId"></param>
/// <param name="token"></param>
/// <returns></returns>
public Task<GazetteerSourceName[]?> GetGazetteerSource(int sourceId, CancellationToken token = default)
public Task<GazetteerSourceName[]?> GetSource(int sourceId, CancellationToken token = default)
{
return GetJsonAsync<GazetteerSourceName[]>($"getGazetteerSourceBySourceID.json/{sourceId}/", token);
}
Expand All @@ -220,7 +220,7 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="mrgId">The MRGID to search for</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<string[]?> GetGazetteerNames(int mrgId, CancellationToken token = default)
public Task<string[]?> GetNames(int mrgId, CancellationToken token = default)
{
return GetJsonAsync<string[]>($"getGazetteerNamesByMRGID.json/{mrgId}/", token);
}
Expand All @@ -231,21 +231,21 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// <param name="sourceName">The source name to search for</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<GazetteerRecord[]?> GetGazetteerRecordsBySource(string sourceName, CancellationToken token = default)
public Task<GazetteerRecord[]?> GetRecordsBySource(string sourceName, CancellationToken token = default)
{
return GetJsonAsync<GazetteerRecord[]>($"getGazetteerRecordsBySource.json/{EscapeDataString(sourceName)}/", token);
}

/// <summary>
/// Gets all records for the given type, per batch of 100
/// </summary>
/// <param name="type">Use <see cref="GetGazetteerTypes"/> to view a complete list of types</param>
/// <param name="type">Use <see cref="GetTypes"/> to view a complete list of types</param>
/// <param name="offset">Provide offset to return next batch of 100 records.</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<GazetteerRecord[]?> GetGazetteerRecordsByType(string type, int offset = 0, CancellationToken token = default)
public Task<GazetteerRecord[]?> GetRecordsByType(string type, int offset = 0, CancellationToken token = default)
{
var parameters = new KeyValuePair<string, object?>("offset", offset);
var parameters = new QueryParameters("offset", offset);
return GetJsonAsync<GazetteerRecord[]>($"getGazetteerRecordsByType.json/{EscapeDataString(type)}/", parameters, token);
}

Expand All @@ -254,15 +254,15 @@ public MarineRegionsClient(HttpClient? httpClient = null) : base(DefaultApiAddre
/// </summary>
/// <param name="longitude">A decimal number which ranges from -90 to 90</param>
/// <param name="latitude">A decimal number which ranges from -180 to +180</param>
/// <param name="typeIds">One or more placetypeIDs. See <see cref="GetGazetteerTypes"/> to retrieve a list of placetypeIDs. Default=(empty)</param>
/// <param name="typeIds">One or more placetypeIDs. See <see cref="GetTypes"/> to retrieve a list of placetypeIDs. Default=(empty)</param>
/// <param name="offset">Start record number, in order to page through next batch of results. Default=0</param>
/// <param name="token"></param>
/// <returns></returns>
public Task<GazetteerRecord[]?> GetGazetteerRecordsByLatLong(decimal latitude, decimal longitude, IEnumerable<int>? typeIds = null, int offset = 0, CancellationToken token = default)
public Task<GazetteerRecord[]?> GetRecordsByLatLong(decimal latitude, decimal longitude, IEnumerable<int>? typeIds = null, int offset = 0, CancellationToken token = default)
{
if (latitude is < -90 or > 90) throw new ArgumentOutOfRangeException(nameof(latitude), "Latitude must be between -90 and 90");
if (longitude is < -180 or > 180) throw new ArgumentOutOfRangeException(nameof(longitude), "Longitude must be between -90 and 90");
var parameters = new Dictionary<string, object?>
var parameters = new QueryParameters
{
{"typeID", typeIds},
{"offset", offset},
Expand Down
Loading

0 comments on commit 2fa01f6

Please sign in to comment.