Skip to content

Commit ad5c638

Browse files
Copilotjongalloway
andcommitted
Update endpoints to use TypedResults for better type safety
Co-authored-by: jongalloway <[email protected]>
1 parent 6cfa4e7 commit ad5c638

File tree

2 files changed

+52
-45
lines changed

2 files changed

+52
-45
lines changed

src/NLWebNet/Endpoints/AskEndpoints.cs

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.AspNetCore.Http;
2+
using Microsoft.AspNetCore.Http.HttpResults;
23
using Microsoft.AspNetCore.Mvc;
34
using Microsoft.AspNetCore.Builder;
45
using Microsoft.AspNetCore.Routing;
@@ -64,7 +65,7 @@ public static RouteGroupBuilder MapAskEndpoints(this IEndpointRouteBuilder app)
6465
/// <param name="loggerFactory">The logger factory</param>
6566
/// <param name="cancellationToken">Cancellation token</param>
6667
/// <returns>NLWeb response with results</returns>
67-
private static async Task<IResult> ProcessQueryAsync(
68+
private static async Task<Results<Ok<NLWebResponse>, BadRequest<ProblemDetails>, StatusCodeHttpResult>> ProcessQueryAsync(
6869
[FromBody] NLWebRequest request,
6970
INLWebService nlWebService, ILoggerFactory loggerFactory,
7071
CancellationToken cancellationToken = default)
@@ -83,7 +84,7 @@ private static async Task<IResult> ProcessQueryAsync(
8384
if (request == null)
8485
{
8586
logger.LogWarning("Received null request");
86-
return Results.BadRequest(new ProblemDetails
87+
return TypedResults.BadRequest(new ProblemDetails
8788
{
8889
Title = "Bad Request",
8990
Detail = "Request body is required",
@@ -94,7 +95,7 @@ private static async Task<IResult> ProcessQueryAsync(
9495
if (string.IsNullOrWhiteSpace(request.Query))
9596
{
9697
logger.LogWarning("Received request with empty query");
97-
return Results.BadRequest(new ProblemDetails
98+
return TypedResults.BadRequest(new ProblemDetails
9899
{
99100
Title = "Bad Request",
100101
Detail = "Query parameter is required and cannot be empty",
@@ -112,12 +113,12 @@ private static async Task<IResult> ProcessQueryAsync(
112113
response.QueryId, response.Results?.Count ?? 0);
113114

114115
logger.LogInformation("[EXIT] /ask POST ProcessQueryAsync for QueryId={QueryId}", response.QueryId);
115-
return Results.Ok(response);
116+
return TypedResults.Ok(response);
116117
}
117118
catch (ValidationException ex)
118119
{
119120
logger.LogWarning(ex, "Validation error processing query: {Message}", ex.Message);
120-
return Results.BadRequest(new ProblemDetails
121+
return TypedResults.BadRequest(new ProblemDetails
121122
{
122123
Title = "Validation Error",
123124
Detail = ex.Message,
@@ -127,7 +128,7 @@ private static async Task<IResult> ProcessQueryAsync(
127128
catch (Exception ex)
128129
{
129130
logger.LogError(ex, "[FAIL] Error processing NLWeb query: {Message}", ex.Message);
130-
return Results.StatusCode(StatusCodes.Status500InternalServerError);
131+
return TypedResults.StatusCode(StatusCodes.Status500InternalServerError);
131132
}
132133
} /// <summary>
133134
/// Process a streaming natural language query with server-sent events.
@@ -141,7 +142,7 @@ private static async Task<IResult> ProcessQueryAsync(
141142
/// <param name="queryId">Optional query ID for correlation</param>
142143
/// <param name="cancellationToken">Cancellation token</param>
143144
/// <returns>Streaming response</returns>
144-
private static Task<IResult> ProcessStreamingQueryAsync(
145+
private static Task<Results<BadRequest<ProblemDetails>, PushStreamHttpResult>> ProcessStreamingQueryAsync(
145146
[FromQuery] string query,
146147
INLWebService nlWebService,
147148
ILoggerFactory loggerFactory,
@@ -159,7 +160,7 @@ private static Task<IResult> ProcessStreamingQueryAsync(
159160
if (string.IsNullOrWhiteSpace(query))
160161
{
161162
logger.LogWarning("Received streaming request with empty query");
162-
return Task.FromResult<IResult>(Results.BadRequest(new ProblemDetails
163+
return Task.FromResult<Results<BadRequest<ProblemDetails>, PushStreamHttpResult>>(TypedResults.BadRequest(new ProblemDetails
163164
{
164165
Title = "Bad Request",
165166
Detail = "Query parameter is required and cannot be empty",
@@ -172,7 +173,7 @@ private static Task<IResult> ProcessStreamingQueryAsync(
172173
{
173174
if (!Enum.TryParse<QueryMode>(mode, true, out queryMode))
174175
{
175-
return Task.FromResult<IResult>(Results.BadRequest(new ProblemDetails
176+
return Task.FromResult<Results<BadRequest<ProblemDetails>, PushStreamHttpResult>>(TypedResults.BadRequest(new ProblemDetails
176177
{
177178
Title = "Bad Request",
178179
Detail = $"Invalid mode '{mode}'. Valid values are: {string.Join(", ", Enum.GetNames<QueryMode>())}",
@@ -199,7 +200,7 @@ private static Task<IResult> ProcessStreamingQueryAsync(
199200
var streamingResults = nlWebService.ProcessRequestStreamAsync(request, cancellationToken);
200201
logger.LogDebug("ProcessRequestStreamAsync in NLWebService started for QueryId={QueryId}", request.QueryId);
201202

202-
return Task.FromResult<IResult>(Results.Stream(async stream =>
203+
return Task.FromResult<Results<BadRequest<ProblemDetails>, PushStreamHttpResult>>(TypedResults.Stream(async stream =>
203204
{
204205
var writer = new StreamWriter(stream);
205206
await writer.WriteLineAsync("Content-Type: text/event-stream");
@@ -232,7 +233,7 @@ private static Task<IResult> ProcessStreamingQueryAsync(
232233
catch (ValidationException ex)
233234
{
234235
logger.LogWarning(ex, "Validation error processing streaming query: {Message}", ex.Message);
235-
return Task.FromResult<IResult>(Results.BadRequest(new ProblemDetails
236+
return Task.FromResult<Results<BadRequest<ProblemDetails>, PushStreamHttpResult>>(TypedResults.BadRequest(new ProblemDetails
236237
{
237238
Title = "Validation Error",
238239
Detail = ex.Message,
@@ -242,7 +243,12 @@ private static Task<IResult> ProcessStreamingQueryAsync(
242243
catch (Exception ex)
243244
{
244245
logger.LogError(ex, "[FAIL] Error processing streaming NLWeb query: {Message}", ex.Message);
245-
return Task.FromResult<IResult>(Results.StatusCode(StatusCodes.Status500InternalServerError));
246+
return Task.FromResult<Results<BadRequest<ProblemDetails>, PushStreamHttpResult>>(TypedResults.BadRequest(new ProblemDetails
247+
{
248+
Title = "Internal Server Error",
249+
Detail = "An error occurred while processing the streaming request",
250+
Status = StatusCodes.Status500InternalServerError
251+
}));
246252
}
247253
} /// <summary>
248254
/// Process a simple query via GET request with query parameters.
@@ -257,7 +263,7 @@ private static Task<IResult> ProcessStreamingQueryAsync(
257263
/// <param name="queryId">Optional query ID for correlation</param>
258264
/// <param name="cancellationToken">Cancellation token</param>
259265
/// <returns>NLWeb response with results</returns>
260-
private static async Task<IResult> ProcessSimpleQueryAsync(
266+
private static async Task<Results<Ok<NLWebResponse>, BadRequest<ProblemDetails>, StatusCodeHttpResult>> ProcessSimpleQueryAsync(
261267
[FromQuery] string query,
262268
INLWebService nlWebService,
263269
ILoggerFactory loggerFactory,
@@ -275,7 +281,7 @@ private static async Task<IResult> ProcessSimpleQueryAsync(
275281
if (string.IsNullOrWhiteSpace(query))
276282
{
277283
logger.LogWarning("Received simple request with empty query");
278-
return Results.BadRequest(new ProblemDetails
284+
return TypedResults.BadRequest(new ProblemDetails
279285
{
280286
Title = "Bad Request",
281287
Detail = "Query parameter is required and cannot be empty",
@@ -288,7 +294,7 @@ private static async Task<IResult> ProcessSimpleQueryAsync(
288294
{
289295
if (!Enum.TryParse<QueryMode>(mode, true, out queryMode))
290296
{
291-
return Results.BadRequest(new ProblemDetails
297+
return TypedResults.BadRequest(new ProblemDetails
292298
{
293299
Title = "Bad Request",
294300
Detail = $"Invalid mode '{mode}'. Valid values are: {string.Join(", ", Enum.GetNames<QueryMode>())}",
@@ -319,12 +325,12 @@ private static async Task<IResult> ProcessSimpleQueryAsync(
319325
response.QueryId, response.Results?.Count ?? 0);
320326

321327
logger.LogInformation("[EXIT] /ask GET ProcessSimpleQueryAsync for QueryId={QueryId}", response.QueryId);
322-
return Results.Ok(response);
328+
return TypedResults.Ok(response);
323329
}
324330
catch (ValidationException ex)
325331
{
326332
logger.LogWarning(ex, "Validation error processing simple query: {Message}", ex.Message);
327-
return Results.BadRequest(new ProblemDetails
333+
return TypedResults.BadRequest(new ProblemDetails
328334
{
329335
Title = "Validation Error",
330336
Detail = ex.Message,
@@ -334,7 +340,7 @@ private static async Task<IResult> ProcessSimpleQueryAsync(
334340
catch (Exception ex)
335341
{
336342
logger.LogError(ex, "[FAIL] Error processing simple NLWeb query: {Message}", ex.Message);
337-
return Results.StatusCode(StatusCodes.Status500InternalServerError);
343+
return TypedResults.StatusCode(StatusCodes.Status500InternalServerError);
338344
}
339345
}
340346
}

0 commit comments

Comments
 (0)