Skip to content

Commit

Permalink
v1.2.2
Browse files Browse the repository at this point in the history
- Improve `QueryParameters` to enforce a value case conversion
- Fix `WormsClient`: `GetExternalId` and `GetRecordByExternalId` must send the type in lower-case
  • Loading branch information
sn4k3 committed Aug 20, 2023
1 parent 2fa01f6 commit 8e682df
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 55 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

## 20/08/2023 - v1.2.2

- Improve `QueryParameters` to enforce a value case conversion
- Fix `WormsClient`: `GetExternalId` and `GetRecordByExternalId` must send the type in lower-case

## 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
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.1</Version>
<Version>1.2.2</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
29 changes: 29 additions & 0 deletions SpeciesDatabaseApi/ApiToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,35 @@

namespace SpeciesDatabaseApi;

/// <summary>
/// Defines where a API token will be placed within the request
/// </summary>
public enum ApiTokenPlacement
{
/// <summary>
/// Is up to developer to insert the token manually
/// </summary>
Manual,

/// <summary>
/// The token goes into Header<br/>
/// Inserted by the base client
/// </summary>
Header,

/// <summary>
/// The token goes into Header.Authorization<br/>
/// Inserted by the base client
/// </summary>
HeaderAuthorization,

/// <summary>
/// The tokes goes as a GET parameter<br/>
/// Inserted by the base client
/// </summary>
Get,
}

/// <summary>
/// Represents an API token to send with the request
/// </summary>
Expand Down
30 changes: 0 additions & 30 deletions SpeciesDatabaseApi/ApiTokenPlacement.cs

This file was deleted.

4 changes: 2 additions & 2 deletions SpeciesDatabaseApi/MarineSpecies/WormsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public WormsClient(HttpClient? httpClient = null) : base(DefaultApiAddress, http
/// <returns></returns>
public Task<string[]?> GetExternalId(int aphiaId, ExternalIdentifierTypeEnum type, CancellationToken token = default)
{
var parameters = new QueryParameters("type", type);
var parameters = new QueryParameters("type", type, valueCase:QueryParameterCase.Lower);
return GetJsonAsync<string[]>($"AphiaExternalIDByAphiaID/{aphiaId}", parameters, token);
}

Expand All @@ -129,7 +129,7 @@ public WormsClient(HttpClient? httpClient = null) : base(DefaultApiAddress, http
/// <returns></returns>
public Task<AphiaRecord?> GetRecordByExternalId(string externalId, ExternalIdentifierTypeEnum type, CancellationToken token = default)
{
var parameters = new QueryParameters("type", type);
var parameters = new QueryParameters("type", type, valueCase: QueryParameterCase.Lower);
return GetJsonAsync<AphiaRecord>($"AphiaRecordByExternalID/{externalId}", parameters, token);
}
#endregion
Expand Down
37 changes: 33 additions & 4 deletions SpeciesDatabaseApi/QueryParameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,32 @@ public class QueryParameter : IEquatable<QueryParameter>
/// </summary>
public object? Value { get; init; }

public QueryParameter(string key, object? value)
/// <summary>
/// Enforce a case conversion
/// </summary>
public QueryParameterCase ValueCase { get; init; }

public QueryParameter(string key, object? value, QueryParameterCase valueCase = QueryParameterCase.None)
{
Key = key;
Value = value;
ValueCase = valueCase;
}

public QueryParameter(KeyValuePair<string, object?> keyValuePair) : this(keyValuePair.Key, keyValuePair.Value)
public QueryParameter(KeyValuePair<string, object?> keyValuePair, QueryParameterCase valueCase = QueryParameterCase.None) : this(keyValuePair.Key, keyValuePair.Value, valueCase)
{
}

public override string ToString()
{
return $"{Key}={Value}";
var value = ValueCase switch
{
QueryParameterCase.None => Value?.ToString(),
QueryParameterCase.Lower => Value?.ToString()?.ToLower(),
QueryParameterCase.Upper => Value?.ToString()?.ToUpper(),
_ => throw new ArgumentOutOfRangeException()
};
return $"{Key}={value}";
}

public string? ToUrlString()
Expand Down Expand Up @@ -61,7 +74,15 @@ public override string ToString()
foreach (var arrayItem in items)
{
if (sb.Length > 0) sb.Append('&');
sb.Append($"{Uri.EscapeDataString(Key)}={Uri.EscapeDataString(arrayItem)}");

value = ValueCase switch
{
QueryParameterCase.None => arrayItem,
QueryParameterCase.Lower => arrayItem.ToLower(),
QueryParameterCase.Upper => arrayItem.ToUpper(),
_ => throw new ArgumentOutOfRangeException()
};
sb.Append($"{Uri.EscapeDataString(Key)}={Uri.EscapeDataString(value)}");
}

return sb.ToString();
Expand Down Expand Up @@ -95,6 +116,14 @@ public override string ToString()
break;
}

value = ValueCase switch
{
QueryParameterCase.None => value,
QueryParameterCase.Lower => value.ToLower(),
QueryParameterCase.Upper => value.ToUpper(),
_ => throw new ArgumentOutOfRangeException()
};

return $"{Uri.EscapeDataString(Key)}={Uri.EscapeDataString(value)}";
}

Expand Down
60 changes: 42 additions & 18 deletions SpeciesDatabaseApi/QueryParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,24 @@ public enum QueryParametersSpecialType
ClassPropertiesReflection
}

public enum QueryParameterCase
{
/// <summary>
/// As set, do not force case
/// </summary>
None,

/// <summary>
/// Force lower case
/// </summary>
Lower,

/// <summary>
/// Force upper case
/// </summary>
Upper,
}

/// <summary>
/// Handles query parameters and build the string, avoiding any null value
/// </summary>
Expand All @@ -38,29 +56,32 @@ public QueryParameters(int capacity) : base(capacity)
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="distinct">True to only add distinct keys</param>
public QueryParameters(string key, object? value, bool distinct = false) : this(1)
/// <param name="valueCase">Enforce a value case conversion</param>
public QueryParameters(string key, object? value, bool distinct = false, QueryParameterCase valueCase = QueryParameterCase.None) : this(1)
{
Add(key, value, distinct);
Add(key, value, distinct, valueCase);
}

/// <summary>
/// Adds the <see cref="KeyValuePair{TKey,TValue}"/> to this collection
/// </summary>
/// <param name="keyValuePair"></param>
/// <param name="distinct">True to only add distinct keys</param>
public QueryParameters(KeyValuePair<string, object?> keyValuePair, bool distinct = false) : this(1)
/// <param name="valueCase">Enforce a value case conversion</param>
public QueryParameters(KeyValuePair<string, object?> keyValuePair, bool distinct = false, QueryParameterCase valueCase = QueryParameterCase.None) : this(1)
{
Add(keyValuePair, distinct);
Add(keyValuePair, distinct, valueCase);
}

/// <summary>
/// Adds the list of <see cref="KeyValuePair{TKey,TValue}"/> to this collection
/// </summary>
/// <param name="list"></param>
/// <param name="distinct">True to only add distinct keys</param>
public QueryParameters(IEnumerable<KeyValuePair<string, object?>> list, bool distinct = false) : this(list.Count())
/// <param name="valueCase">Enforce a value case conversion</param>
public QueryParameters(IEnumerable<KeyValuePair<string, object?>> list, bool distinct = false, QueryParameterCase valueCase = QueryParameterCase.None) : this(list.Count())
{
Add(list, distinct);
Add(list, distinct, valueCase);
}


Expand All @@ -69,9 +90,10 @@ public QueryParameters(IEnumerable<KeyValuePair<string, object?>> list, bool dis
/// </summary>
/// <param name="dictionary"></param>
/// <param name="distinct">True to only add distinct keys</param>
public QueryParameters(IReadOnlyDictionary<string, object?> dictionary, bool distinct = false) : this(dictionary.Count)
/// <param name="valueCase">Enforce a value case conversion</param>
public QueryParameters(IReadOnlyDictionary<string, object?> dictionary, bool distinct = false, QueryParameterCase valueCase = QueryParameterCase.None) : this(dictionary.Count)
{
Add(dictionary, distinct);
Add(dictionary, distinct, valueCase);
}


Expand All @@ -93,35 +115,36 @@ public QueryParameters(QueryParametersSpecialType specialType, object? classObj,
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="distinct">True to only add distinct keys</param>
public void Add(string key, object? value, bool distinct = false)
/// <param name="valueCase">Enforce a value case conversion</param>
public void Add(string key, object? value, bool distinct = false, QueryParameterCase valueCase = QueryParameterCase.None)
{
if (value is null) return;
if (distinct && this.Any(queryParameter => queryParameter.Key == key)) return;
Add(new QueryParameter(key, value));
Add(new QueryParameter(key, value, valueCase));
}

/// <summary>
/// Adds the <see cref="KeyValuePair{TKey,TValue}"/> to this collection
/// </summary>
/// <param name="keyValuePair"></param>
/// <param name="distinct">True to only add distinct keys</param>
public void Add(KeyValuePair<string, object?> keyValuePair, bool distinct = false)
/// <param name="valueCase">Enforce a value case conversion</param>
public void Add(KeyValuePair<string, object?> keyValuePair, bool distinct = false, QueryParameterCase valueCase = QueryParameterCase.None)
{
if (keyValuePair.Value is null) return;
if (distinct && this.Any(queryParameter => queryParameter.Key == keyValuePair.Key)) return;
Add(new QueryParameter(keyValuePair));
Add(keyValuePair.Key, keyValuePair.Value, distinct, valueCase);
}

/// <summary>
/// Adds the list of <see cref="KeyValuePair{TKey,TValue}"/> to this collection
/// </summary>
/// <param name="list"></param>
/// <param name="distinct">True to only add distinct keys</param>
public void Add(IEnumerable<KeyValuePair<string, object?>> list, bool distinct = false)
/// <param name="valueCase">Enforce a value case conversion</param>
public void Add(IEnumerable<KeyValuePair<string, object?>> list, bool distinct = false, QueryParameterCase valueCase = QueryParameterCase.None)
{
foreach (var keyValuePair in list)
{
Add(keyValuePair, distinct);
Add(keyValuePair, distinct, valueCase);
}
}

Expand All @@ -130,11 +153,12 @@ public void Add(IEnumerable<KeyValuePair<string, object?>> list, bool distinct =
/// </summary>
/// <param name="dictionary"></param>
/// <param name="distinct">True to only add distinct keys</param>
public void Add(IReadOnlyDictionary<string, object?> dictionary, bool distinct = false)
/// <param name="valueCase">Enforce a value case conversion</param>
public void Add(IReadOnlyDictionary<string, object?> dictionary, bool distinct = false, QueryParameterCase valueCase = QueryParameterCase.None)
{
foreach (var keyValuePair in dictionary)
{
Add(keyValuePair, distinct);
Add(keyValuePair, distinct, valueCase);
}
}

Expand Down

0 comments on commit 8e682df

Please sign in to comment.