Skip to content

Commit f96f3d0

Browse files
authored
Merge pull request #208 from atc-net/feature/security
Security fixes and updates for NotFound response types
2 parents b5d4e31 + bbfabff commit f96f3d0

File tree

313 files changed

+651
-1695
lines changed

Some content is hidden

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

313 files changed

+651
-1695
lines changed

src/Atc.Rest.ApiGenerator.Client.CSharp/ContentGenerators/ContentGeneratorClientEndpoint.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,16 @@ public string Generate()
117117
case HttpStatusCode.OK:
118118
AppendAddSuccessResponseForStatusCodeOk(sb, responseModel);
119119
break;
120+
case HttpStatusCode.NotFound:
121+
if (string.IsNullOrEmpty(customErrorResponseModel))
122+
{
123+
sb.AppendLine(8, $"responseBuilder.AddErrorResponse<string?>(HttpStatusCode.{responseModel.StatusCode});");
124+
}
125+
else
126+
{
127+
sb.AppendLine(8, $"responseBuilder.AddErrorResponse<{customErrorResponseModel}>(HttpStatusCode.{responseModel.StatusCode});");
128+
}
129+
break;
120130
case HttpStatusCode.BadRequest:
121131
if (string.IsNullOrEmpty(customErrorResponseModel))
122132
{
@@ -153,7 +163,6 @@ public string Generate()
153163
case HttpStatusCode.Unauthorized:
154164
case HttpStatusCode.PaymentRequired:
155165
case HttpStatusCode.Forbidden:
156-
case HttpStatusCode.NotFound:
157166
case HttpStatusCode.MethodNotAllowed:
158167
case HttpStatusCode.NotAcceptable:
159168
case HttpStatusCode.ProxyAuthenticationRequired:

src/Atc.Rest.ApiGenerator.Client.CSharp/ContentGenerators/ContentGeneratorClientEndpointResult.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,13 @@ private void AppendContentWithProblemDetails(
236236
sb.AppendLine();
237237
AppendMethodContentStatusCodeOk(sb, responseModel);
238238
break;
239+
case HttpStatusCode.NotFound:
240+
sb.AppendLine();
241+
sb.AppendLine(4, $"public string? {responseModel.StatusCode.ToNormalizedString()}Content");
242+
sb.AppendLine(8, $"=> Is{responseModel.StatusCode.ToNormalizedString()} && ContentObject is string result");
243+
sb.AppendLine(12, "? result");
244+
sb.AppendLine(12, $": throw new InvalidOperationException(\"Content is not the expected type - please use the Is{responseModel.StatusCode.ToNormalizedString()} property first.\");");
245+
break;
239246
case HttpStatusCode.BadRequest:
240247
sb.AppendLine();
241248
sb.AppendLine(4, $"public ValidationProblemDetails {responseModel.StatusCode.ToNormalizedString()}Content");
@@ -270,7 +277,6 @@ private void AppendContentWithProblemDetails(
270277
case HttpStatusCode.Unauthorized:
271278
case HttpStatusCode.PaymentRequired:
272279
case HttpStatusCode.Forbidden:
273-
case HttpStatusCode.NotFound:
274280
case HttpStatusCode.MethodNotAllowed:
275281
case HttpStatusCode.NotAcceptable:
276282
case HttpStatusCode.ProxyAuthenticationRequired:

src/Atc.Rest.ApiGenerator.Client.CSharp/ContentGenerators/ContentGeneratorClientEndpointResultInterface.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,10 @@ private void AppendContentWithProblemDetails(
211211
sb.AppendLine();
212212
AppendMethodContentStatusCodeOk(sb, responseModel);
213213
break;
214+
case HttpStatusCode.NotFound:
215+
sb.AppendLine();
216+
sb.AppendLine(4, $"string? {responseModel.StatusCode.ToNormalizedString()}Content {{ get; }}");
217+
break;
214218
case HttpStatusCode.BadRequest:
215219
sb.AppendLine();
216220
sb.AppendLine(4, $"ValidationProblemDetails {responseModel.StatusCode.ToNormalizedString()}Content {{ get; }}");
@@ -242,7 +246,6 @@ private void AppendContentWithProblemDetails(
242246
case HttpStatusCode.Unauthorized:
243247
case HttpStatusCode.PaymentRequired:
244248
case HttpStatusCode.Forbidden:
245-
case HttpStatusCode.NotFound:
246249
case HttpStatusCode.MethodNotAllowed:
247250
case HttpStatusCode.NotAcceptable:
248251
case HttpStatusCode.ProxyAuthenticationRequired:

src/Atc.Rest.ApiGenerator.Framework.Minimal/ContentGenerators/ContentGeneratorServerEndpoints.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ private static void AppendProducesWithProblemDetails(
202202
break;
203203
case HttpStatusCode.Accepted:
204204
case HttpStatusCode.Created:
205+
case HttpStatusCode.NotFound:
205206
sb.Append(12, $".Produces<string?>(StatusCodes.{responseModel.StatusCode.ToStatusCodesConstant()})");
206207
break;
207208
case HttpStatusCode.EarlyHints:
@@ -229,7 +230,6 @@ private static void AppendProducesWithProblemDetails(
229230
case HttpStatusCode.Unauthorized:
230231
case HttpStatusCode.PaymentRequired:
231232
case HttpStatusCode.Forbidden:
232-
case HttpStatusCode.NotFound:
233233
case HttpStatusCode.MethodNotAllowed:
234234
case HttpStatusCode.NotAcceptable:
235235
case HttpStatusCode.ProxyAuthenticationRequired:

src/Atc.Rest.ApiGenerator.Framework.Minimal/ContentGenerators/ContentGeneratorServerResult.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,12 @@ private void AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(
144144
case HttpStatusCode.Accepted:
145145
case HttpStatusCode.Created:
146146
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? uri = null)");
147-
sb.AppendLine(8, $"=> new(Results.Problem(uri, null, StatusCodes.{item.ResponseModel.StatusCode.ToStatusCodesConstant()}));");
147+
sb.AppendLine(8, $"=> new(TypedResults.{item.ResponseModel.StatusCode}(uri));");
148148
break;
149149
case HttpStatusCode.NotFound:
150+
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? message = null)");
151+
sb.AppendLine(8, $"=> new(TypedResults.{item.ResponseModel.StatusCode}(message));");
152+
break;
150153
case HttpStatusCode.Conflict:
151154
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? message = null)");
152155
sb.AppendLine(8, $"=> new(Results.Problem(message, null, StatusCodes.{item.ResponseModel.StatusCode.ToStatusCodesConstant()}));");

src/Atc.Rest.ApiGenerator.Framework.Minimal/ProjectGenerator/ServerApiGenerator.cs

-3
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,6 @@ public void MaintainGlobalUsings(
351351
requiredUsings.Add("Atc.Rest.MinimalApi.Filters.Endpoints");
352352
}
353353

354-
// TODO: Check for any use ??
355-
requiredUsings.Add("Microsoft.AspNetCore.Authorization");
356-
357354
if (operationSchemaMappings.Any(apiOperation => apiOperation.Model.IsShared))
358355
{
359356
requiredUsings.Add($"{projectName}.{ContentGeneratorConstants.Contracts}");

src/Atc.Rest.ApiGenerator.Framework.Mvc/ContentGenerators/ContentGeneratorServerController.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ private static void AppendProducesWithProblemDetails(
130130
case HttpStatusCode.OK:
131131
AppendProducesForOk(sb, responseModel);
132132
break;
133+
case HttpStatusCode.NotFound:
134+
sb.AppendLine(4, $"[ProducesResponseType(typeof(string), StatusCodes.{responseModel.StatusCode.ToStatusCodesConstant()})]");
135+
break;
133136
case HttpStatusCode.BadRequest:
134137
sb.AppendLine(4, $"[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.{responseModel.StatusCode.ToStatusCodesConstant()})]");
135138
break;
@@ -160,7 +163,6 @@ private static void AppendProducesWithProblemDetails(
160163
case HttpStatusCode.Unauthorized:
161164
case HttpStatusCode.PaymentRequired:
162165
case HttpStatusCode.Forbidden:
163-
case HttpStatusCode.NotFound:
164166
case HttpStatusCode.MethodNotAllowed:
165167
case HttpStatusCode.NotAcceptable:
166168
case HttpStatusCode.ProxyAuthenticationRequired:

src/Atc.Rest.ApiGenerator.Framework.Mvc/ContentGenerators/ContentGeneratorServerResult.cs

+8-5
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@ private void AppendMethodContent(
8383
{
8484
if (useProblemDetailsAsDefaultResponseBody)
8585
{
86-
AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(sb, item, resultName);
86+
AppendMethodContentForOtherStatusCodesThanOkWithProblemDetails(sb, item, resultName);
8787
}
8888
else
8989
{
90-
AppendMethodContentForOtherStatusCodesThenOkWithoutProblemDetails(sb, item, resultName);
90+
AppendMethodContentForOtherStatusCodesThanOkWithoutProblemDetails(sb, item, resultName);
9191
}
9292
}
9393
}
@@ -146,7 +146,7 @@ private void AppendMethodContentStatusCodeOk(
146146
}
147147
}
148148

149-
private void AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(
149+
private void AppendMethodContentForOtherStatusCodesThanOkWithProblemDetails(
150150
StringBuilder sb,
151151
ContentGeneratorServerResultMethodParameters item,
152152
string resultName)
@@ -160,6 +160,10 @@ private void AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(
160160
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? uri = null)");
161161
sb.AppendLine(8, $"=> new {resultName}({nameof(Results.ResultFactory)}.{nameof(Results.ResultFactory.CreateContentResult)}({nameof(HttpStatusCode)}.{item.ResponseModel.StatusCode}, uri));");
162162
break;
163+
case HttpStatusCode.NotFound:
164+
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? message = null)");
165+
sb.AppendLine(8, $"=> new {resultName}(new {item.ResponseModel.StatusCode.ToNormalizedString()}ObjectResult(message));");
166+
break;
163167
case HttpStatusCode.BadRequest:
164168
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? message = null)");
165169
sb.AppendLine(8, $"=> new {resultName}({nameof(Results.ResultFactory)}.{nameof(Results.ResultFactory.CreateContentResultWithValidationProblemDetails)}({nameof(HttpStatusCode)}.{item.ResponseModel.StatusCode}, message));");
@@ -190,7 +194,6 @@ private void AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(
190194
case HttpStatusCode.Unauthorized:
191195
case HttpStatusCode.PaymentRequired:
192196
case HttpStatusCode.Forbidden:
193-
case HttpStatusCode.NotFound:
194197
case HttpStatusCode.MethodNotAllowed:
195198
case HttpStatusCode.NotAcceptable:
196199
case HttpStatusCode.ProxyAuthenticationRequired:
@@ -233,7 +236,7 @@ private void AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(
233236
}
234237
}
235238

236-
private void AppendMethodContentForOtherStatusCodesThenOkWithoutProblemDetails(
239+
private void AppendMethodContentForOtherStatusCodesThanOkWithoutProblemDetails(
237240
StringBuilder sb,
238241
ContentGeneratorServerResultMethodParameters item,
239242
string resultName)

src/Atc.Rest.ApiGenerator.Framework/Helpers/StringBuilderEndpointHelper.cs

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public static void AppendMethodContentAuthorizationIfNeeded(
3838
var authRoles = authorizationForEndpoint.Roles is null
3939
? null
4040
: string.Join(',', authorizationForEndpoint.Roles);
41+
4142
var authSchemes = authorizationForEndpoint.AuthenticationSchemes is null
4243
? null
4344
: string.Join(',', authorizationForEndpoint.AuthenticationSchemes);

src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiDocumentExtensions.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ public static bool IsUsingRequiredForMicrosoftAspNetCoreAuthorization(
364364
foreach (var openApiPath in openApiDocument.Paths)
365365
{
366366
var isAuthenticationRequired = openApiPath.Value.Extensions.ExtractAuthenticationRequired();
367-
if (isAuthenticationRequired is not null && isAuthenticationRequired.Value)
367+
if (isAuthenticationRequired is not null)
368368
{
369369
return true;
370370
}
@@ -377,7 +377,7 @@ public static bool IsUsingRequiredForMicrosoftAspNetCoreAuthorization(
377377
}
378378

379379
var isOperationAuthenticationRequired = apiOperationPair.Value.Extensions.ExtractAuthenticationRequired();
380-
if (isOperationAuthenticationRequired is not null && isOperationAuthenticationRequired.Value)
380+
if (isOperationAuthenticationRequired is not null)
381381
{
382382
return true;
383383
}

src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiPathItemExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public static string GetApiGroupName(
5656

5757
if ((authorizationRoles is null || authorizationRoles.Count == 0) &&
5858
(authenticationSchemes is null || authenticationSchemes.Count == 0) &&
59-
authenticationRequiredForPath.HasValueAndFalse())
59+
authenticationRequiredForPath is null)
6060
{
6161
return null;
6262
}

src/Atc.Rest.ApiGenerator/Generators/ServerApiGenerator.cs

+2-4
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ public async Task<bool> Generate()
7979
serverApiGeneratorMvc.GenerateEndpoints();
8080

8181
serverApiGeneratorMvc.MaintainApiSpecification(projectOptions.DocumentFile);
82-
serverApiGeneratorMvc.MaintainGlobalUsings(
83-
projectOptions.ApiOptions.Generator.RemoveNamespaceGroupSeparatorInGlobalUsings);
82+
serverApiGeneratorMvc.MaintainGlobalUsings(projectOptions.ApiOptions.Generator.RemoveNamespaceGroupSeparatorInGlobalUsings);
8483
}
8584
else
8685
{
@@ -94,8 +93,7 @@ public async Task<bool> Generate()
9493
serverApiGeneratorMinimalApi.GenerateEndpoints();
9594

9695
serverApiGeneratorMinimalApi.MaintainApiSpecification(projectOptions.DocumentFile);
97-
serverApiGeneratorMinimalApi.MaintainGlobalUsings(
98-
projectOptions.ApiOptions.Generator.RemoveNamespaceGroupSeparatorInGlobalUsings);
96+
serverApiGeneratorMinimalApi.MaintainGlobalUsings(projectOptions.ApiOptions.Generator.RemoveNamespaceGroupSeparatorInGlobalUsings);
9997
}
10098

10199
return true;

test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/DemoSample/VerifyClient/WOPD/src/DemoSample.ApiClient.Generated/Endpoints/Accounts/Interfaces/ISetAccountNameEndpointResult.verified.cs

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//------------------------------------------------------------------------------
1+
//------------------------------------------------------------------------------
22
// This code was auto-generated by ApiGenerator x.x.x.x.
33
//
44
// Changes to this file may cause incorrect behavior and will be lost if
@@ -19,11 +19,7 @@ public interface ISetAccountNameEndpointResult : IEndpointResponse
1919

2020
bool IsBadRequest { get; }
2121

22-
bool IsUnauthorized { get; }
23-
2422
string? OkContent { get; }
2523

2624
string? BadRequestContent { get; }
27-
28-
string? UnauthorizedContent { get; }
29-
}
25+
}

test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/DemoSample/VerifyClient/WOPD/src/DemoSample.ApiClient.Generated/Endpoints/Accounts/Interfaces/IUpdateAccountNameEndpointResult.verified.cs

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//------------------------------------------------------------------------------
1+
//------------------------------------------------------------------------------
22
// This code was auto-generated by ApiGenerator x.x.x.x.
33
//
44
// Changes to this file may cause incorrect behavior and will be lost if
@@ -19,11 +19,7 @@ public interface IUpdateAccountNameEndpointResult : IEndpointResponse
1919

2020
bool IsBadRequest { get; }
2121

22-
bool IsUnauthorized { get; }
23-
2422
string? OkContent { get; }
2523

2624
string? BadRequestContent { get; }
27-
28-
string? UnauthorizedContent { get; }
29-
}
25+
}

test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/DemoSample/VerifyClient/WOPD/src/DemoSample.ApiClient.Generated/Endpoints/Accounts/SetAccountNameEndpoint.verified.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//------------------------------------------------------------------------------
1+
//------------------------------------------------------------------------------
22
// This code was auto-generated by ApiGenerator x.x.x.x.
33
//
44
// Changes to this file may cause incorrect behavior and will be lost if
@@ -42,7 +42,6 @@ public async Task<SetAccountNameEndpointResult> ExecuteAsync(
4242
var responseBuilder = httpMessageFactory.FromResponse(response);
4343
responseBuilder.AddSuccessResponse<string?>(HttpStatusCode.OK);
4444
responseBuilder.AddErrorResponse<ValidationProblemDetails>(HttpStatusCode.BadRequest);
45-
responseBuilder.AddErrorResponse<string>(HttpStatusCode.Unauthorized);
4645
return await responseBuilder.BuildResponseAsync(x => new SetAccountNameEndpointResult(x), cancellationToken);
4746
}
48-
}
47+
}

test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/DemoSample/VerifyClient/WOPD/src/DemoSample.ApiClient.Generated/Endpoints/Accounts/SetAccountNameEndpointResult.verified.cs

+2-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//------------------------------------------------------------------------------
1+
//------------------------------------------------------------------------------
22
// This code was auto-generated by ApiGenerator x.x.x.x.
33
//
44
// Changes to this file may cause incorrect behavior and will be lost if
@@ -25,9 +25,6 @@ public bool IsOk
2525
public bool IsBadRequest
2626
=> StatusCode == HttpStatusCode.BadRequest;
2727

28-
public bool IsUnauthorized
29-
=> StatusCode == HttpStatusCode.Unauthorized;
30-
3128
public string? OkContent
3229
=> IsOk && ContentObject is string result
3330
? result
@@ -37,9 +34,4 @@ public string? BadRequestContent
3734
=> IsBadRequest && ContentObject is string result
3835
? result
3936
: throw new InvalidOperationException("Content is not the expected type - please use the IsBadRequest property first.");
40-
41-
public string? UnauthorizedContent
42-
=> IsUnauthorized && ContentObject is string result
43-
? result
44-
: throw new InvalidOperationException("Content is not the expected type - please use the IsUnauthorized property first.");
45-
}
37+
}

test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/DemoSample/VerifyClient/WOPD/src/DemoSample.ApiClient.Generated/Endpoints/Accounts/UpdateAccountNameEndpoint.verified.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//------------------------------------------------------------------------------
1+
//------------------------------------------------------------------------------
22
// This code was auto-generated by ApiGenerator x.x.x.x.
33
//
44
// Changes to this file may cause incorrect behavior and will be lost if
@@ -42,7 +42,6 @@ public async Task<UpdateAccountNameEndpointResult> ExecuteAsync(
4242
var responseBuilder = httpMessageFactory.FromResponse(response);
4343
responseBuilder.AddSuccessResponse<string?>(HttpStatusCode.OK);
4444
responseBuilder.AddErrorResponse<ValidationProblemDetails>(HttpStatusCode.BadRequest);
45-
responseBuilder.AddErrorResponse<string>(HttpStatusCode.Unauthorized);
4645
return await responseBuilder.BuildResponseAsync(x => new UpdateAccountNameEndpointResult(x), cancellationToken);
4746
}
48-
}
47+
}

test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/DemoSample/VerifyClient/WOPD/src/DemoSample.ApiClient.Generated/Endpoints/Accounts/UpdateAccountNameEndpointResult.verified.cs

+2-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//------------------------------------------------------------------------------
1+
//------------------------------------------------------------------------------
22
// This code was auto-generated by ApiGenerator x.x.x.x.
33
//
44
// Changes to this file may cause incorrect behavior and will be lost if
@@ -25,9 +25,6 @@ public bool IsOk
2525
public bool IsBadRequest
2626
=> StatusCode == HttpStatusCode.BadRequest;
2727

28-
public bool IsUnauthorized
29-
=> StatusCode == HttpStatusCode.Unauthorized;
30-
3128
public string? OkContent
3229
=> IsOk && ContentObject is string result
3330
? result
@@ -37,9 +34,4 @@ public string? BadRequestContent
3734
=> IsBadRequest && ContentObject is string result
3835
? result
3936
: throw new InvalidOperationException("Content is not the expected type - please use the IsBadRequest property first.");
40-
41-
public string? UnauthorizedContent
42-
=> IsUnauthorized && ContentObject is string result
43-
? result
44-
: throw new InvalidOperationException("Content is not the expected type - please use the IsUnauthorized property first.");
45-
}
37+
}

test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/DemoSample/VerifyClient/WOPD/src/DemoSample.ApiClient.Generated/Endpoints/Addresses/GetAddressesByPostalCodesEndpoint.verified.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//------------------------------------------------------------------------------
1+
//------------------------------------------------------------------------------
22
// This code was auto-generated by ApiGenerator x.x.x.x.
33
//
44
// Changes to this file may cause incorrect behavior and will be lost if
@@ -41,8 +41,7 @@ public async Task<GetAddressesByPostalCodesEndpointResult> ExecuteAsync(
4141
var responseBuilder = httpMessageFactory.FromResponse(response);
4242
responseBuilder.AddSuccessResponse<IEnumerable<Address>>(HttpStatusCode.OK);
4343
responseBuilder.AddErrorResponse<ValidationProblemDetails>(HttpStatusCode.BadRequest);
44-
responseBuilder.AddErrorResponse<string>(HttpStatusCode.Unauthorized);
45-
responseBuilder.AddErrorResponse<string>(HttpStatusCode.NotFound);
44+
responseBuilder.AddErrorResponse<string?>(HttpStatusCode.NotFound);
4645
return await responseBuilder.BuildResponseAsync(x => new GetAddressesByPostalCodesEndpointResult(x), cancellationToken);
4746
}
48-
}
47+
}

0 commit comments

Comments
 (0)