Skip to content

Commit 16631f6

Browse files
authored
Merge pull request #15 from microsoft/feature/request-config
- aligns request options with configuration revamp
2 parents 4da0b52 + cac903b commit 16631f6

7 files changed

Lines changed: 109 additions & 97 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
### Changed
1313

14+
## [1.0.0-preview.6] - 2022-04-22
15+
16+
### Added
17+
18+
- Adds support for api surface revamp for query parameters
19+
1420
## [1.0.0-preview.5] - 2022-04-12
1521

1622
### Changed

Microsoft.Kiota.Abstractions.Tests/QueryParametersBaseTests.cs

Lines changed: 0 additions & 51 deletions
This file was deleted.

Microsoft.Kiota.Abstractions.Tests/RequestInformationTests.cs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void AddsAndRemovesRequestOptions()
3939
var testRequestOption = new Mock<IRequestOption>().Object;
4040
Assert.Empty(testRequest.RequestOptions);
4141
// Act
42-
testRequest.AddRequestOptions(testRequestOption);
42+
testRequest.AddRequestOptions(new IRequestOption[] {testRequestOption});
4343
// Assert
4444
Assert.NotEmpty(testRequest.RequestOptions);
4545
Assert.Equal(testRequestOption, testRequest.RequestOptions.First());
@@ -48,5 +48,46 @@ public void AddsAndRemovesRequestOptions()
4848
testRequest.RemoveRequestOptions(testRequestOption);
4949
Assert.Empty(testRequest.RequestOptions);
5050
}
51+
[Fact]
52+
public void SetsSelectQueryParameters()
53+
{
54+
// Arrange as the request builders would
55+
var requestInfo = new RequestInformation
56+
{
57+
HttpMethod = Method.GET,
58+
UrlTemplate = "http://localhost/me{?%24select}"
59+
};
60+
Action<GetQueryParameters> q = x => x.Select = new[] { "id", "displayName" };
61+
var qParams = new GetQueryParameters();
62+
q.Invoke(qParams);
63+
64+
// Act
65+
requestInfo.AddQueryParameters(qParams);
66+
67+
// Assert
68+
Assert.True(requestInfo.QueryParameters.ContainsKey("%24select"));
69+
Assert.False(requestInfo.QueryParameters.ContainsKey("select"));
70+
Assert.Equal("%24select",requestInfo.QueryParameters.First().Key);
71+
}
72+
}
73+
74+
/// <summary>The messages in a mailbox or folder. Read-only. Nullable.</summary>
75+
internal class GetQueryParameters
76+
{
77+
/// <summary>Select properties to be returned</summary>\
78+
[QueryParameter("%24select")]
79+
public string[] Select { get; set; }
80+
/// <summary>Include count of items</summary>
81+
[QueryParameter("%24count")]
82+
public bool? Count { get; set; }
83+
/// <summary>Expand related entities</summary>
84+
[QueryParameter("%24filter")]
85+
public string Filter { get; set; }
86+
/// <summary>Order items by property values</summary>
87+
[QueryParameter("%24orderby")]
88+
public string[] Orderby { get; set; }
89+
/// <summary>Search items by search phrases</summary>
90+
[QueryParameter("%24search")]
91+
public string Search { get; set; }
5192
}
5293
}

src/Microsoft.Kiota.Abstractions.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<EmbedUntrackedSources>true</EmbedUntrackedSources>
1515
<Deterministic>true</Deterministic>
1616
<VersionPrefix>1.0.0</VersionPrefix>
17-
<VersionSuffix>preview.5</VersionSuffix>
17+
<VersionSuffix>preview.6</VersionSuffix>
1818
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
1919
<SignAssembly>false</SignAssembly>
2020
<DelaySign>false</DelaySign>
@@ -23,7 +23,7 @@
2323
<!-- Enable this line once we go live to prevent breaking changes -->
2424
<!-- <PackageValidationBaselineVersion>1.0.0</PackageValidationBaselineVersion> -->
2525
<PackageReleaseNotes>
26-
- [Breaking] Change target runtime to netstandard 2.0
26+
- Adds support for api surface revamp for query parameters
2727
</PackageReleaseNotes>
2828
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
2929
<PackageLicenseFile>LICENSE</PackageLicenseFile>

src/QueryParametersBase.cs

Lines changed: 0 additions & 39 deletions
This file was deleted.

src/RequestInformation.cs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,42 @@ public Uri URI {
7575
/// </summary>
7676
public IDictionary<string, object> QueryParameters { get; set; } = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
7777
/// <summary>
78+
/// Vanity method to add the query parameters to the request query parameters dictionary.
79+
/// </summary>
80+
/// <param name="source">The query parameters to add.</param>
81+
public void AddQueryParameters(object source)
82+
{
83+
if(source == null) return;
84+
foreach(var property in source.GetType()
85+
.GetProperties()
86+
.Select(
87+
x => (
88+
Name: x.GetCustomAttributes(false)
89+
.OfType<QueryParameterAttribute>()
90+
.FirstOrDefault()?.TemplateName ?? x.Name.ToFirstCharacterLowerCase(),
91+
Value: x.GetValue(source)
92+
)
93+
)
94+
.Where(x => x.Value != null && !QueryParameters.ContainsKey(x.Name)))
95+
{
96+
QueryParameters.AddOrReplace(property.Name, property.Value);
97+
}
98+
}
99+
/// <summary>
78100
/// The Request Headers.
79101
/// </summary>
80102
public IDictionary<string, string> Headers { get; set; } = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
81103
/// <summary>
104+
/// Adds request headers to the request.
105+
/// </summary>
106+
/// <param name="source">The request headers to add.</param>
107+
public void AddHeaders(IDictionary<string, string> source)
108+
{
109+
if(source == null) return;
110+
foreach(var header in source)
111+
Headers.AddOrReplace(header.Key, header.Value);
112+
}
113+
/// <summary>
82114
/// The Request Body.
83115
/// </summary>
84116
public Stream Content { get; set; }
@@ -91,12 +123,11 @@ public Uri URI {
91123
/// Adds an option to the request.
92124
/// </summary>
93125
/// <param name="options">The option to add.</param>
94-
public void AddRequestOptions(params IRequestOption[] options)
126+
public void AddRequestOptions(IEnumerable<IRequestOption> options)
95127
{
96-
if(!(options?.Any() ?? false)) return; // it's a no-op if there are no options and this avoid having to check in the code gen.
128+
if(options == null) return;
97129
foreach(var option in options.Where(x => x != null))
98-
if(!_requestOptions.TryAdd(option.GetType().FullName, option))
99-
_requestOptions[option.GetType().FullName] = option;
130+
_requestOptions.AddOrReplace(option.GetType().FullName, option);
100131
}
101132
/// <summary>
102133
/// Removes given options from the current request.

src/extensions/IDictionaryExtensions.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ public static bool TryAdd<TKey, TValue>(this IDictionary<TKey, TValue> dictionar
2828
{
2929
throw new ArgumentNullException(nameof(dictionary));
3030
}
31+
32+
if(key == null)
33+
{
34+
throw new ArgumentNullException(nameof(key));
35+
}
3136

3237
if(!dictionary.ContainsKey(key))
3338
{
@@ -37,6 +42,25 @@ public static bool TryAdd<TKey, TValue>(this IDictionary<TKey, TValue> dictionar
3742

3843
return false;
3944
}
45+
/// <summary>
46+
/// Adds or replaces the element to the <see cref="IDictionary"/> instance.
47+
/// </summary>
48+
/// <typeparam name="TKey"> The type of the key</typeparam>
49+
/// <typeparam name="TValue">The type of the value</typeparam>
50+
/// <param name="dictionary">The dictionary to add to.</param>
51+
/// <param name="key">The key parameter.</param>
52+
/// <param name="value">The value</param>
53+
/// <returns>The previous value if any</returns>
54+
public static TValue AddOrReplace<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
55+
{
56+
if(!dictionary.TryAdd(key, value))
57+
{
58+
var oldValue = dictionary[key];
59+
dictionary[key] = value;
60+
return oldValue;
61+
}
62+
return default(TValue);
63+
}
4064

4165
}
4266
}

0 commit comments

Comments
 (0)