Skip to content

Commit cc552e9

Browse files
Automatically update Dotnet SDK
1 parent f436b17 commit cc552e9

16 files changed

Lines changed: 551 additions & 13 deletions

‎.fern/metadata.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"simplify-object-dictionaries": true,
1111
"use-discriminated-unions": false
1212
},
13-
"originGitCommit": "885d82705d6aef1477e8e3db3c503783d437a659",
13+
"originGitCommit": "fc9c2289d356522ad24b9464747364dd97f31a15",
1414
"originGitCommitIsDirty": false,
1515
"invokedBy": "ci",
1616
"ciProvider": "github"

‎src/TrophyApi/Admin/AdminClient.cs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ internal AdminClient(RawClient client)
1313
Metrics = new MetricsClient(_client);
1414
Leaderboards = new LeaderboardsClient(_client);
1515
Streaks = new StreaksClient(_client);
16+
ApplicationApiKeys = new ApplicationApiKeysClient(_client);
1617
Tenants = new TenantsClient(_client);
1718
Points = new TrophyApi.Admin.Points.PointsClient(_client);
1819
}
@@ -25,6 +26,8 @@ internal AdminClient(RawClient client)
2526

2627
public IStreaksClient Streaks { get; }
2728

29+
public IApplicationApiKeysClient ApplicationApiKeys { get; }
30+
2831
public ITenantsClient Tenants { get; }
2932

3033
public Points.IPointsClient Points { get; }
Lines changed: 323 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,323 @@
1+
using global::System.Text.Json;
2+
using TrophyApi;
3+
using TrophyApi.Core;
4+
5+
namespace TrophyApi.Admin;
6+
7+
public partial class ApplicationApiKeysClient : IApplicationApiKeysClient
8+
{
9+
private readonly RawClient _client;
10+
11+
internal ApplicationApiKeysClient(RawClient client)
12+
{
13+
_client = client;
14+
}
15+
16+
private async Task<WithRawResponse<CreateApplicationKeysResponse>> CreateAsyncCore(
17+
IEnumerable<CreateApplicationKeyRequestItem> request,
18+
RequestOptions? options = null,
19+
CancellationToken cancellationToken = default
20+
)
21+
{
22+
var _queryString = new TrophyApi.Core.QueryStringBuilder.Builder(capacity: 0)
23+
.MergeAdditional(options?.AdditionalQueryParameters)
24+
.Build();
25+
var _headers = await new TrophyApi.Core.HeadersBuilder.Builder()
26+
.Add(_client.Options.Headers)
27+
.Add(_client.Options.AdditionalHeaders)
28+
.Add(options?.AdditionalHeaders)
29+
.BuildAsync()
30+
.ConfigureAwait(false);
31+
var response = await _client
32+
.SendRequestAsync(
33+
new JsonRequest
34+
{
35+
BaseUrl = _client.Options.Environment.Admin,
36+
Method = HttpMethod.Post,
37+
Path = "application-api-keys",
38+
Body = request,
39+
QueryString = _queryString,
40+
Headers = _headers,
41+
ContentType = "application/json",
42+
Options = options,
43+
},
44+
cancellationToken
45+
)
46+
.ConfigureAwait(false);
47+
if (response.StatusCode is >= 200 and < 400)
48+
{
49+
var responseBody = await response
50+
.Raw.Content.ReadAsStringAsync(cancellationToken)
51+
.ConfigureAwait(false);
52+
try
53+
{
54+
var responseData = JsonUtils.Deserialize<CreateApplicationKeysResponse>(
55+
responseBody
56+
)!;
57+
return new WithRawResponse<CreateApplicationKeysResponse>()
58+
{
59+
Data = responseData,
60+
RawResponse = new TrophyApi.RawResponse()
61+
{
62+
StatusCode = response.Raw.StatusCode,
63+
Url = response.Raw.RequestMessage?.RequestUri ?? new Uri("about:blank"),
64+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
65+
},
66+
};
67+
}
68+
catch (JsonException e)
69+
{
70+
throw new TrophyApiApiException(
71+
"Failed to deserialize response",
72+
response.StatusCode,
73+
responseBody,
74+
e,
75+
rawResponse: new TrophyApi.RawResponse()
76+
{
77+
StatusCode = response.Raw.StatusCode,
78+
Url = response.Raw.RequestMessage?.RequestUri ?? new Uri("about:blank"),
79+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
80+
}
81+
);
82+
}
83+
}
84+
{
85+
var responseBody = await response
86+
.Raw.Content.ReadAsStringAsync(cancellationToken)
87+
.ConfigureAwait(false);
88+
try
89+
{
90+
switch (response.StatusCode)
91+
{
92+
case 401:
93+
throw new UnauthorizedError(
94+
JsonUtils.Deserialize<object>(responseBody),
95+
rawResponse: new TrophyApi.RawResponse()
96+
{
97+
StatusCode = response.Raw.StatusCode,
98+
Url =
99+
response.Raw.RequestMessage?.RequestUri
100+
?? new Uri("about:blank"),
101+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
102+
}
103+
);
104+
case 403:
105+
throw new ForbiddenError(
106+
JsonUtils.Deserialize<object>(responseBody),
107+
rawResponse: new TrophyApi.RawResponse()
108+
{
109+
StatusCode = response.Raw.StatusCode,
110+
Url =
111+
response.Raw.RequestMessage?.RequestUri
112+
?? new Uri("about:blank"),
113+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
114+
}
115+
);
116+
case 422:
117+
throw new UnprocessableEntityError(
118+
JsonUtils.Deserialize<object>(responseBody),
119+
rawResponse: new TrophyApi.RawResponse()
120+
{
121+
StatusCode = response.Raw.StatusCode,
122+
Url =
123+
response.Raw.RequestMessage?.RequestUri
124+
?? new Uri("about:blank"),
125+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
126+
}
127+
);
128+
}
129+
}
130+
catch (JsonException)
131+
{
132+
// unable to map error response, throwing generic error
133+
}
134+
throw new TrophyApiApiException(
135+
$"Error with status code {response.StatusCode}",
136+
response.StatusCode,
137+
responseBody,
138+
rawResponse: new TrophyApi.RawResponse()
139+
{
140+
StatusCode = response.Raw.StatusCode,
141+
Url = response.Raw.RequestMessage?.RequestUri ?? new Uri("about:blank"),
142+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
143+
}
144+
);
145+
}
146+
}
147+
148+
private async Task<WithRawResponse<DeleteApplicationKeysResponse>> DeleteAsyncCore(
149+
ApplicationApiKeysDeleteRequest request,
150+
RequestOptions? options = null,
151+
CancellationToken cancellationToken = default
152+
)
153+
{
154+
var _queryString = new TrophyApi.Core.QueryStringBuilder.Builder(capacity: 1)
155+
.Add("ids", request.Ids)
156+
.MergeAdditional(options?.AdditionalQueryParameters)
157+
.Build();
158+
var _headers = await new TrophyApi.Core.HeadersBuilder.Builder()
159+
.Add(_client.Options.Headers)
160+
.Add(_client.Options.AdditionalHeaders)
161+
.Add(options?.AdditionalHeaders)
162+
.BuildAsync()
163+
.ConfigureAwait(false);
164+
var response = await _client
165+
.SendRequestAsync(
166+
new JsonRequest
167+
{
168+
BaseUrl = _client.Options.Environment.Admin,
169+
Method = HttpMethod.Delete,
170+
Path = "application-api-keys",
171+
QueryString = _queryString,
172+
Headers = _headers,
173+
Options = options,
174+
},
175+
cancellationToken
176+
)
177+
.ConfigureAwait(false);
178+
if (response.StatusCode is >= 200 and < 400)
179+
{
180+
var responseBody = await response
181+
.Raw.Content.ReadAsStringAsync(cancellationToken)
182+
.ConfigureAwait(false);
183+
try
184+
{
185+
var responseData = JsonUtils.Deserialize<DeleteApplicationKeysResponse>(
186+
responseBody
187+
)!;
188+
return new WithRawResponse<DeleteApplicationKeysResponse>()
189+
{
190+
Data = responseData,
191+
RawResponse = new TrophyApi.RawResponse()
192+
{
193+
StatusCode = response.Raw.StatusCode,
194+
Url = response.Raw.RequestMessage?.RequestUri ?? new Uri("about:blank"),
195+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
196+
},
197+
};
198+
}
199+
catch (JsonException e)
200+
{
201+
throw new TrophyApiApiException(
202+
"Failed to deserialize response",
203+
response.StatusCode,
204+
responseBody,
205+
e,
206+
rawResponse: new TrophyApi.RawResponse()
207+
{
208+
StatusCode = response.Raw.StatusCode,
209+
Url = response.Raw.RequestMessage?.RequestUri ?? new Uri("about:blank"),
210+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
211+
}
212+
);
213+
}
214+
}
215+
{
216+
var responseBody = await response
217+
.Raw.Content.ReadAsStringAsync(cancellationToken)
218+
.ConfigureAwait(false);
219+
try
220+
{
221+
switch (response.StatusCode)
222+
{
223+
case 401:
224+
throw new UnauthorizedError(
225+
JsonUtils.Deserialize<object>(responseBody),
226+
rawResponse: new TrophyApi.RawResponse()
227+
{
228+
StatusCode = response.Raw.StatusCode,
229+
Url =
230+
response.Raw.RequestMessage?.RequestUri
231+
?? new Uri("about:blank"),
232+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
233+
}
234+
);
235+
case 403:
236+
throw new ForbiddenError(
237+
JsonUtils.Deserialize<object>(responseBody),
238+
rawResponse: new TrophyApi.RawResponse()
239+
{
240+
StatusCode = response.Raw.StatusCode,
241+
Url =
242+
response.Raw.RequestMessage?.RequestUri
243+
?? new Uri("about:blank"),
244+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
245+
}
246+
);
247+
case 422:
248+
throw new UnprocessableEntityError(
249+
JsonUtils.Deserialize<object>(responseBody),
250+
rawResponse: new TrophyApi.RawResponse()
251+
{
252+
StatusCode = response.Raw.StatusCode,
253+
Url =
254+
response.Raw.RequestMessage?.RequestUri
255+
?? new Uri("about:blank"),
256+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
257+
}
258+
);
259+
}
260+
}
261+
catch (JsonException)
262+
{
263+
// unable to map error response, throwing generic error
264+
}
265+
throw new TrophyApiApiException(
266+
$"Error with status code {response.StatusCode}",
267+
response.StatusCode,
268+
responseBody,
269+
rawResponse: new TrophyApi.RawResponse()
270+
{
271+
StatusCode = response.Raw.StatusCode,
272+
Url = response.Raw.RequestMessage?.RequestUri ?? new Uri("about:blank"),
273+
Headers = ResponseHeaders.FromHttpResponseMessage(response.Raw),
274+
}
275+
);
276+
}
277+
}
278+
279+
/// <summary>
280+
/// Create application API keys scoped to specific users. Each key can only perform operations on behalf of the user it was created for.
281+
/// </summary>
282+
/// <example><code>
283+
/// await client.Admin.ApplicationApiKeys.CreateAsync(
284+
/// new List&lt;CreateApplicationKeyRequestItem&gt;()
285+
/// {
286+
/// new CreateApplicationKeyRequestItem { UserId = "user_123" },
287+
/// new CreateApplicationKeyRequestItem { UserId = "user_456" },
288+
/// }
289+
/// );
290+
/// </code></example>
291+
public WithRawResponseTask<CreateApplicationKeysResponse> CreateAsync(
292+
IEnumerable<CreateApplicationKeyRequestItem> request,
293+
RequestOptions? options = null,
294+
CancellationToken cancellationToken = default
295+
)
296+
{
297+
return new WithRawResponseTask<CreateApplicationKeysResponse>(
298+
CreateAsyncCore(request, options, cancellationToken)
299+
);
300+
}
301+
302+
/// <summary>
303+
/// Delete application API keys by ID.
304+
/// </summary>
305+
/// <example><code>
306+
/// await client.Admin.ApplicationApiKeys.DeleteAsync(
307+
/// new ApplicationApiKeysDeleteRequest
308+
/// {
309+
/// Ids = new List&lt;string&gt;() { "550e8400-e29b-41d4-a716-446655440000" },
310+
/// }
311+
/// );
312+
/// </code></example>
313+
public WithRawResponseTask<DeleteApplicationKeysResponse> DeleteAsync(
314+
ApplicationApiKeysDeleteRequest request,
315+
RequestOptions? options = null,
316+
CancellationToken cancellationToken = default
317+
)
318+
{
319+
return new WithRawResponseTask<DeleteApplicationKeysResponse>(
320+
DeleteAsyncCore(request, options, cancellationToken)
321+
);
322+
}
323+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using TrophyApi;
2+
3+
namespace TrophyApi.Admin;
4+
5+
public partial interface IApplicationApiKeysClient
6+
{
7+
/// <summary>
8+
/// Create application API keys scoped to specific users. Each key can only perform operations on behalf of the user it was created for.
9+
/// </summary>
10+
WithRawResponseTask<CreateApplicationKeysResponse> CreateAsync(
11+
IEnumerable<CreateApplicationKeyRequestItem> request,
12+
RequestOptions? options = null,
13+
CancellationToken cancellationToken = default
14+
);
15+
16+
/// <summary>
17+
/// Delete application API keys by ID.
18+
/// </summary>
19+
WithRawResponseTask<DeleteApplicationKeysResponse> DeleteAsync(
20+
ApplicationApiKeysDeleteRequest request,
21+
RequestOptions? options = null,
22+
CancellationToken cancellationToken = default
23+
);
24+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using global::System.Text.Json.Serialization;
2+
using TrophyApi.Core;
3+
4+
namespace TrophyApi.Admin;
5+
6+
[Serializable]
7+
public record ApplicationApiKeysDeleteRequest
8+
{
9+
/// <summary>
10+
/// Application API key IDs (UUIDs returned at creation time). Repeat the query param or provide a comma-separated list. Maximum 100 IDs per request.
11+
/// </summary>
12+
[JsonIgnore]
13+
public IEnumerable<string> Ids { get; set; } = new List<string>();
14+
15+
/// <inheritdoc />
16+
public override string ToString()
17+
{
18+
return JsonUtils.Serialize(this);
19+
}
20+
}

0 commit comments

Comments
 (0)