Skip to content

Commit 34882ae

Browse files
committed
2 parents fda6c90 + bd09a32 commit 34882ae

75 files changed

Lines changed: 399 additions & 294 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/BuildAndTest.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ env:
3636
jobs:
3737
test:
3838
#needs: build
39+
40+
# Prevent concurrent job runners changing the very same data on the remote DMS test server
41+
concurrency: teamwork_test_server
42+
3943
runs-on: ${{ matrix.os }}
4044

4145
strategy:
@@ -119,7 +123,7 @@ jobs:
119123
check_name: Unit Test Results (${{matrix.os}}) - NET 5.0
120124
report_individual_runs: true
121125

122-
- name: Unit Test Results (Linux) - NET Framework 4.8
126+
- name: Publish Unit Test Results (Linux) - NET Framework 4.8
123127
uses: EnricoMi/publish-unit-test-result-action@v1
124128
if: always() && startsWith(matrix.os, 'ubuntu')
125129
with:
@@ -130,7 +134,7 @@ jobs:
130134
check_name: Unit Test Results (${{matrix.os}}) - NET Framework 4.8
131135
report_individual_runs: true
132136

133-
- name: Unit Test Results (Win/Mac) - NET Framework 4.8
137+
- name: Publish Unit Test Results (Win/Mac) - NET Framework 4.8
134138
uses: EnricoMi/publish-unit-test-result-action/composite@v1
135139
if: always() && (!(startsWith(matrix.os, 'ubuntu')))
136140
with:

CenterDevice.Rest/CenterDevice.Rest.csproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@
5252
</None>
5353
</ItemGroup>
5454
<ItemGroup>
55-
<PackageReference Include="log4net" Version="2.0.12" />
55+
<PackageReference Include="log4net" Version="2.0.14" />
5656
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
5757
<PackageReference Include="Ninject" Version="3.3.4.0" />
58-
<PackageReference Include="RestSharp" Version="106.12.0" />
58+
<PackageReference Include="RestSharp" Version="107.3.0" />
59+
<PackageReference Include="System.Net.Http" Version="4.3.4" />
60+
<PackageReference Include="System.Text.Json" Version="6.0.3" />
5961
</ItemGroup>
6062
</Project>

CenterDevice.Rest/Rest/Clients/CenterDeviceRestClient.cs

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -43,45 +43,44 @@ protected CenterDeviceRestClient(IOAuthInfoProvider oauthInfo, IRestClientConfig
4343
this.errorHandler = errorHandler;
4444
this.oAuthInfoProvider = oauthInfo;
4545
this.ApiVersionPrefix = apiVersionPrefix;
46-
client = new RestClient(configuration.BaseAddress)
46+
var options = new RestClientOptions(configuration.BaseAddress)
4747
{
48-
UserAgent = configuration.UserAgent,
48+
UserAgent = configuration.UserAgent
4949
};
50+
client = new RestClient(options);
5051
//remove all XML deserializers since response is always expected as JSON, never XML
51-
client.RemoveHandler("");
52-
client.RemoveHandler("*"); //remove default handler which is XML instead of JSON!
53-
client.RemoveHandler("application/xml");
54-
client.RemoveHandler("text/xml");
55-
client.RemoveHandler("text/javascript");
56-
}
52+
client.UseJson();
5753

58-
protected string GetBaseAddress()
59-
{
60-
return client.BaseUrl.AbsoluteUri;
54+
CustomOptionBaseAddress = options.BaseUrl.AbsoluteUri;
55+
CustomOptionUserAgent = options.UserAgent;
6156
}
6257

63-
protected virtual IRestResponse Execute(OAuthInfo oAuthInfo, IRestRequest request)
58+
protected readonly string CustomOptionUserAgent;
59+
60+
protected readonly string CustomOptionBaseAddress;
61+
62+
protected virtual RestResponse Execute(OAuthInfo oAuthInfo, RestRequest request)
6463
{
6564
PrepareRequest(oAuthInfo, request);
6665

67-
return HandleResponseSync(oAuthInfo, request, client.Execute(request));
66+
return HandleResponseSync(oAuthInfo, request, client.ExecuteAsync(request).Result);
6867
}
6968

70-
protected virtual IRestResponse<T> Execute<T>(OAuthInfo oAuthInfo, IRestRequest request) where T : new()
69+
protected virtual RestResponse<T> Execute<T>(OAuthInfo oAuthInfo, RestRequest request) where T : new()
7170
{
7271
PrepareRequest(oAuthInfo, request);
7372

74-
return HandleResponseSync(oAuthInfo, request, client.Execute<T>(request));
73+
return HandleResponseSync(oAuthInfo, request, client.ExecuteAsync<T>(request).Result);
7574
}
7675

77-
private void PrepareRequest(OAuthInfo oAuthInfo, IRestRequest request)
76+
private void PrepareRequest(OAuthInfo oAuthInfo, RestRequest request)
7877
{
7978
offlineModeSimulator?.ThrowIfOffline();
8079

8180
AddAuthorizationHeader(oAuthInfo, request);
8281
}
8382

84-
protected TimeSpan? ExtractDelay(IRestResponse result)
83+
protected TimeSpan? ExtractDelay(RestResponse result)
8584
{
8685
return ExtractDelay((string)result.Headers.FirstOrDefault(parameter => parameter.Name.Equals(RETRY_AFTER, StringComparison.OrdinalIgnoreCase))?.Value);
8786
}
@@ -102,12 +101,12 @@ private void PrepareRequest(OAuthInfo oAuthInfo, IRestRequest request)
102101
return null;
103102
}
104103

105-
private bool IsRateLimitExceeded(IRestResponse result)
104+
private bool IsRateLimitExceeded(RestResponse result)
106105
{
107106
return (int)result.StatusCode == TOO_MANY_REQUESTS;
108107
}
109108

110-
private IRestResponse<T> HandleResponseSync<T>(OAuthInfo oAuthInfo, IRestRequest request, IRestResponse<T> result) where T : new()
109+
private RestResponse<T> HandleResponseSync<T>(OAuthInfo oAuthInfo, RestRequest request, RestResponse<T> result) where T : new()
111110
{
112111
if (IsExpiredToken(result))
113112
{
@@ -119,7 +118,7 @@ private bool IsRateLimitExceeded(IRestResponse result)
119118

120119
SwapAuthorizationHeader(refreshOAuthInfo, request);
121120

122-
return client.Execute<T>(request);
121+
return client.ExecuteAsync<T>(request).Result;
123122
}
124123
else if (IsRateLimitExceeded(result))
125124
{
@@ -139,7 +138,7 @@ private bool IsRateLimitExceeded(IRestResponse result)
139138
}
140139
}
141140

142-
private IRestResponse HandleResponseSync(OAuthInfo oAuthInfo, IRestRequest request, IRestResponse result)
141+
private RestResponse HandleResponseSync(OAuthInfo oAuthInfo, RestRequest request, RestResponse result)
143142
{
144143
if (IsExpiredToken(result))
145144
{
@@ -151,7 +150,7 @@ private IRestResponse HandleResponseSync(OAuthInfo oAuthInfo, IRestRequest reque
151150

152151
SwapAuthorizationHeader(refreshOAuthInfo, request);
153152

154-
return client.Execute(request);
153+
return client.ExecuteAsync(request).Result;
155154
}
156155
else if (IsRateLimitExceeded(result))
157156
{
@@ -171,7 +170,7 @@ private IRestResponse HandleResponseSync(OAuthInfo oAuthInfo, IRestRequest reque
171170
}
172171
}
173172

174-
private bool IsNotConnected(IRestResponse result)
173+
private bool IsNotConnected(RestResponse result)
175174
{
176175
var exception = result.ErrorException as WebException;
177176
if (exception == null)
@@ -182,14 +181,14 @@ private bool IsNotConnected(IRestResponse result)
182181
return exception.Status == WebExceptionStatus.ConnectFailure || exception.Status == WebExceptionStatus.NameResolutionFailure;
183182
}
184183

185-
protected void ValidateResponse(IRestResponse result, BaseResponseHandler handler)
184+
protected void ValidateResponse(RestResponse result, BaseResponseHandler handler)
186185
{
187186
errorHandler?.ValidateResponse(result);
188187

189188
handler.ValidateResponse(result);
190189
}
191190

192-
protected T UnwrapResponse<T>(IRestResponse<T> result, DataResponseHandler<T> handler)
191+
protected T UnwrapResponse<T>(RestResponse<T> result, DataResponseHandler<T> handler)
193192
{
194193
errorHandler?.ValidateResponse(result);
195194

@@ -217,6 +216,7 @@ protected OAuthInfo GetOAuthInfo(string userId)
217216

218217
protected RestRequest AddContentTypeHeader(RestRequest request, string contentType)
219218
{
219+
if (request.Method == Method.Get) throw new ArgumentException("Adding header Content-Type not supported for GET requests", nameof(request));
220220
request.AddHeader(CONTENT_TYPE, contentType);
221221
return request;
222222
}
@@ -231,30 +231,30 @@ protected string GetAuthorizationBearer(OAuthInfo oAuthInfo)
231231
return BEARER + oAuthInfo.access_token;
232232
}
233233

234-
private void AddAuthorizationHeader(OAuthInfo oAuthInfo, IRestRequest request)
234+
private void AddAuthorizationHeader(OAuthInfo oAuthInfo, RestRequest request)
235235
{
236236
request.AddHeader(AUTHORIZATION, GetAuthorizationBearer(oAuthInfo));
237237
}
238238

239-
private void SwapAuthorizationHeader(OAuthInfo newOAuthInfo, IRestRequest request)
239+
private void SwapAuthorizationHeader(OAuthInfo newOAuthInfo, RestRequest request)
240240
{
241241
RemoveAuthorizationHeader(request);
242242
AddAuthorizationHeader(newOAuthInfo, request);
243243
}
244244

245-
private void RemoveAuthorizationHeader(IRestRequest request)
245+
private void RemoveAuthorizationHeader(RestRequest request)
246246
{
247247
((List<Parameter>)((RestRequest)request).GetType().GetProperty(PARAMETERS).GetValue(request))
248248
.RemoveAll(parameter => parameter.Name == AUTHORIZATION);
249249
}
250250

251-
private bool IsExpiredToken(IRestResponse result)
251+
private bool IsExpiredToken(RestResponse result)
252252
{
253253
return result.StatusCode == HttpStatusCode.Unauthorized
254254
&& (result.Content == UNKNOWN_OR_EXPIRED_TOKEN || result.Content == EXPIRED_TENANT);
255255
}
256256

257-
private bool IsOperationTimedOut(IRestResponse result)
257+
private bool IsOperationTimedOut(RestResponse result)
258258
{
259259
if (result.ErrorMessage != null)
260260
{

CenterDevice.Rest/Rest/Clients/Collections/CollectionEraseResponse.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
using RestSharp.Deserializers;
1+
using System.Text.Json.Serialization;
22
using System.Collections.Generic;
33

44
#pragma warning disable CS1591 // Fehledes XML-Kommentar für öffentlich sichtbaren Typ oder Element
55
namespace CenterDevice.Rest.Clients.Collections
66
{
77
public class CollectionEraseResponse
88
{
9-
[DeserializeAs(Name = RestApiConstants.REMOVED_FROM_COLLECTION)]
9+
[JsonPropertyName(RestApiConstants.REMOVED_FROM_COLLECTION)]
1010
public List<string> RemovedFromCollection { get; set; }
1111

12-
[DeserializeAs(Name = RestApiConstants.DOCUMENTS_NOT_DELETED)]
12+
[JsonPropertyName(RestApiConstants.DOCUMENTS_NOT_DELETED)]
1313
public List<string> DocumentsRemainedInCollection { get; set; }
1414

15-
[DeserializeAs(Name = RestApiConstants.FOLDERS_NOT_DELETED)]
15+
[JsonPropertyName(RestApiConstants.FOLDERS_NOT_DELETED)]
1616
public List<string> FoldersRemainedCollection { get; set; }
1717
}
1818
}

CenterDevice.Rest/Rest/Clients/Collections/CollectionRestClient.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public DocumentSharingResponse RemoveDocumentFromCollection(string userId, strin
2727
List<string> documents = new List<string>();
2828
documents.Add(documentId);
2929

30-
var request = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.POST, ContentType.APPLICATION_JSON);
30+
var request = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.Post, ContentType.APPLICATION_JSON);
3131
request.AddJsonBody(new { action = RestApiConstants.REMOVE_DOCUMENTS, @params = new { documents = documents } });
3232

3333
return UnwrapResponse(Execute<DocumentSharingResponse>(GetOAuthInfo(userId), request), new StatusCodeResponseHandler<DocumentSharingResponse>(HttpStatusCode.NoContent, HttpStatusCode.OK));
@@ -38,15 +38,15 @@ public DocumentSharingResponse AddDocumentToCollection(string userId, string doc
3838
List<string> documents = new List<string>();
3939
documents.Add(documentId);
4040

41-
var request = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.POST, ContentType.APPLICATION_JSON);
41+
var request = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.Post, ContentType.APPLICATION_JSON);
4242
request.AddJsonBody(new { action = RestApiConstants.ADD_DOCUMENTS, @params = new { documents = documents } });
4343

4444
return UnwrapResponse(Execute<DocumentSharingResponse>(GetOAuthInfo(userId), request), new StatusCodeResponseHandler<DocumentSharingResponse>(HttpStatusCode.NoContent, HttpStatusCode.OK));
4545
}
4646

4747
public CollectionEraseResponse EraseCollection(string userId, string collectionId, bool onlyOwnedDocuments)
4848
{
49-
var request = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.POST, ContentType.APPLICATION_JSON);
49+
var request = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.Post, ContentType.APPLICATION_JSON);
5050

5151
var parameters = new JObject();
5252
parameters[RestApiConstants.ACTION] = RestApiConstants.ERASE;
@@ -68,7 +68,7 @@ public SharingResponse UnshareCollection(string userId, string collectionId, IEn
6868

6969
private SharingResponse UpdateCollectionSharing(string userId, string collectionId, IEnumerable<string> users, IEnumerable<string> groups, string sHARE)
7070
{
71-
var request = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.POST, ContentType.APPLICATION_JSON);
71+
var request = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.Post, ContentType.APPLICATION_JSON);
7272

7373
var parameters = new JObject();
7474
parameters[RestApiConstants.ACTION] = sHARE;
@@ -101,7 +101,7 @@ private static JObject CreateEraseParameters(bool onlyOwnedDocuments)
101101

102102
public void RenameCollection(string userId, string collectionId, string newName)
103103
{
104-
var collectionRequest = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.PUT, ContentType.APPLICATION_JSON);
104+
var collectionRequest = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.Put, ContentType.APPLICATION_JSON);
105105
collectionRequest.AddJsonBody(new { name = newName });
106106

107107
var result = Execute(GetOAuthInfo(userId), collectionRequest);
@@ -110,7 +110,7 @@ public void RenameCollection(string userId, string collectionId, string newName)
110110

111111
public void RenameCollection(OAuthInfo oAuthInfo, string collectionId, string newName)
112112
{
113-
var collectionRequest = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.PUT, ContentType.APPLICATION_JSON);
113+
var collectionRequest = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.Put, ContentType.APPLICATION_JSON);
114114
collectionRequest.AddJsonBody(new { name = newName });
115115

116116
var result = Execute(oAuthInfo, collectionRequest);
@@ -124,7 +124,7 @@ public Collection GetCollection(string userId, string collectionId)
124124

125125
public Collection GetCollection(string userId, string collectionId, RestRequestFields fields)
126126
{
127-
var collectionRequest = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.GET, ContentType.APPLICATION_JSON);
127+
var collectionRequest = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.Get);
128128

129129
if (fields == RestRequestFields.ALL)
130130
{
@@ -141,31 +141,31 @@ public Collection GetCollection(string userId, string collectionId, RestRequestF
141141

142142
public void DeleteCollection(string userId, string collectionId)
143143
{
144-
var createCollectionsRequest = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.DELETE);
144+
var createCollectionsRequest = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.Delete);
145145

146146
var result = Execute<CreateCollectionResponse>(GetOAuthInfo(userId), createCollectionsRequest);
147147
ValidateResponse(result, new StatusCodeResponseHandler(HttpStatusCode.NoContent));
148148
}
149149

150150
public void DeleteCollection(OAuthInfo oAuthInfo, string collectionId)
151151
{
152-
var createCollectionsRequest = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.DELETE);
152+
var createCollectionsRequest = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.Delete);
153153

154154
var result = Execute<CreateCollectionResponse>(oAuthInfo, createCollectionsRequest);
155155
ValidateResponse(result, new StatusCodeResponseHandler(HttpStatusCode.NoContent));
156156
}
157157

158158
public void ArchiveCollection(string userId, string collectionId)
159159
{
160-
var request = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.POST, ContentType.APPLICATION_JSON);
160+
var request = CreateRestRequest(URI_RESOURCE + "/" + collectionId, Method.Post, ContentType.APPLICATION_JSON);
161161

162162
var parameters = new JObject
163163
{
164164
[RestApiConstants.ACTION] = RestApiConstants.ARCHIVE
165165
};
166166
request.AddParameter(ContentType.APPLICATION_JSON, parameters.ToString(), ParameterType.RequestBody);
167167

168-
IRestResponse result = Execute(GetOAuthInfo(userId), request);
168+
RestResponse result = Execute(GetOAuthInfo(userId), request);
169169
ValidateResponse(result, new StatusCodeResponseHandler(HttpStatusCode.NoContent));
170170
}
171171
}

CenterDevice.Rest/Rest/Clients/Collections/CollectionsRestClient.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public CollectionsResults GetCollections(string userId)
2828

2929
public CollectionsResults GetCollections(string userId, IEnumerable<string> ids, bool includeHasFolders)
3030
{
31-
var searchRequest = CreateRestRequest(URI_RESOURCE, Method.GET, ContentType.APPLICATION_JSON);
31+
var searchRequest = CreateRestRequest(URI_RESOURCE, Method.Get);
3232
if (ids != null && ids.Any())
3333
{
3434
searchRequest.AddQueryParameter(RestApiConstants.IDS, string.Join(",", ids));
@@ -52,7 +52,7 @@ public CreateCollectionResponse CreateCollection(string userId, string collectio
5252

5353
public CreateCollectionResponse CreateCollection(OAuthInfo oAuthInfo, string collectionName)
5454
{
55-
var createCollectionsRequest = CreateRestRequest(URI_RESOURCE, Method.POST);
55+
var createCollectionsRequest = CreateRestRequest(URI_RESOURCE, Method.Post);
5656

5757
createCollectionsRequest.AddJsonBody(new { name = collectionName });
5858

@@ -62,7 +62,7 @@ public CreateCollectionResponse CreateCollection(OAuthInfo oAuthInfo, string col
6262

6363
public IEnumerable<string> GetCollectionIds(string userId, bool includePublic)
6464
{
65-
var searchRequest = CreateRestRequest(URI_RESOURCE, Method.GET, ContentType.APPLICATION_JSON);
65+
var searchRequest = CreateRestRequest(URI_RESOURCE, Method.Get);
6666
searchRequest.AddQueryParameter(RestApiConstants.INCLUDE_PUBLIC, includePublic.ToString());
6767
searchRequest.AddQueryParameter(RestApiConstants.FIELDS, RestApiConstants.ID);
6868

0 commit comments

Comments
 (0)