viewengine.websample/Program.cs

201 lines
5.5 KiB
C#

using ViewEngine.Client;
using ViewEngine.Client.Models;
var builder = WebApplication.CreateBuilder(args);
// Add services
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
{
policy.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
var app = builder.Build();
app.UseCors();
app.UseDefaultFiles();
app.UseStaticFiles();
// Proxy endpoint to submit retrieval request
app.MapPost("/api/retrieve", async (RetrieveRequest request) =>
{
try
{
if (string.IsNullOrEmpty(request.ApiKey))
{
return Results.BadRequest(new { error = "API key is required" });
}
using var client = new ViewEngineClient(request.ApiKey);
var submitRequest = new SubmitRetrievalRequest
{
Url = request.Url,
ForceRefresh = request.ForceRefresh,
PreferredPlatform = request.PreferredPlatform,
GenerateSummary = request.GenerateSummary
};
var response = await client.SubmitRetrievalAsync(submitRequest);
return Results.Ok(new
{
requestId = response.RequestId,
status = response.Status,
message = response.Message,
estimatedWaitTimeSeconds = response.EstimatedWaitTimeSeconds
});
}
catch (HttpRequestException ex)
{
return Results.Problem(ex.Message, statusCode: 502);
}
catch (Exception ex)
{
return Results.Problem(ex.Message);
}
});
// Get status of a retrieval request
app.MapGet("/api/status/{requestId}", async (Guid requestId, string apiKey) =>
{
try
{
if (string.IsNullOrEmpty(apiKey))
{
return Results.BadRequest(new { error = "API key is required" });
}
using var client = new ViewEngineClient(apiKey);
var status = await client.GetRetrievalStatusAsync(requestId);
return Results.Ok(new
{
requestId = status.RequestId,
url = status.Url,
status = status.Status,
message = status.Message,
error = status.Error,
content = status.Content,
createdAt = status.CreatedAt,
completedAt = status.CompletedAt
});
}
catch (HttpRequestException ex)
{
return Results.Problem(ex.Message, statusCode: 502);
}
catch (Exception ex)
{
return Results.Problem(ex.Message);
}
});
// Get page content for a completed retrieval
app.MapGet("/api/content/{requestId}", async (Guid requestId, string apiKey) =>
{
try
{
if (string.IsNullOrEmpty(apiKey))
{
return Results.BadRequest(new { error = "API key is required" });
}
using var client = new ViewEngineClient(apiKey);
var pageData = await client.GetPageContentAsync(requestId);
return Results.Ok(new
{
title = pageData.Title,
url = pageData.Url,
body = pageData.Body,
metaDescription = pageData.MetaDescription,
faviconUrl = pageData.FaviconUrl,
thumbnail = pageData.Thumbnail,
routes = pageData.Routes,
bodyRoutes = pageData.BodyRoutes,
summary = pageData.Summary,
httpStatusCode = pageData.HttpStatusCode,
isSuccess = pageData.IsSuccess,
isClientError = pageData.IsClientError,
isServerError = pageData.IsServerError
});
}
catch (HttpRequestException ex)
{
return Results.Problem(ex.Message, statusCode: 502);
}
catch (Exception ex)
{
return Results.Problem(ex.Message);
}
});
// One-shot retrieve and wait endpoint (convenience method)
app.MapPost("/api/retrieve-and-wait", async (RetrieveRequest request, CancellationToken cancellationToken) =>
{
try
{
if (string.IsNullOrEmpty(request.ApiKey))
{
return Results.BadRequest(new { error = "API key is required" });
}
using var client = new ViewEngineClient(request.ApiKey);
var submitRequest = new SubmitRetrievalRequest
{
Url = request.Url,
ForceRefresh = request.ForceRefresh,
PreferredPlatform = request.PreferredPlatform,
GenerateSummary = request.GenerateSummary,
TimeoutSeconds = 120
};
var pageData = await client.RetrieveAndWaitAsync(submitRequest, cancellationToken: cancellationToken);
return Results.Ok(new
{
title = pageData.Title,
url = pageData.Url,
body = pageData.Body,
metaDescription = pageData.MetaDescription,
faviconUrl = pageData.FaviconUrl,
thumbnail = pageData.Thumbnail,
routes = pageData.Routes,
bodyRoutes = pageData.BodyRoutes,
summary = pageData.Summary,
httpStatusCode = pageData.HttpStatusCode,
isSuccess = pageData.IsSuccess,
isClientError = pageData.IsClientError,
isServerError = pageData.IsServerError
});
}
catch (OperationCanceledException)
{
return Results.StatusCode(408); // Request Timeout
}
catch (HttpRequestException ex)
{
return Results.Problem(ex.Message, statusCode: 502);
}
catch (Exception ex)
{
return Results.Problem(ex.Message);
}
});
app.Run();
record RetrieveRequest(
string ApiKey,
string Url,
bool ForceRefresh = false,
string? PreferredPlatform = null,
bool GenerateSummary = false
);