201 lines
5.5 KiB
C#
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
|
|
);
|