route in progress, region stitching is disabled by default

This commit is contained in:
Anton Martynenko
2025-11-01 15:55:41 +01:00
parent b532f1335e
commit 8714a4817d
23 changed files with 743 additions and 18 deletions
+56 -3
View File
@@ -25,6 +25,7 @@ builder.Services.Configure<ProcessingConfig>(builder.Configuration.GetSection("P
builder.Services.AddSingleton<ITileRepository>(sp => new TileRepository(connectionString));
builder.Services.AddSingleton<IRegionRepository>(sp => new RegionRepository(connectionString));
builder.Services.AddSingleton<IRouteRepository>(sp => new RouteRepository(connectionString));
builder.Services.AddHttpClient();
builder.Services.AddSingleton<GoogleMapsDownloaderV2>();
@@ -34,6 +35,7 @@ var processingConfig = builder.Configuration.GetSection("ProcessingConfig").Get<
builder.Services.AddSingleton<IRegionRequestQueue>(sp => new RegionRequestQueue(processingConfig.QueueCapacity));
builder.Services.AddSingleton<IRegionService, RegionService>();
builder.Services.AddHostedService<RegionProcessingService>();
builder.Services.AddSingleton<IRouteService, RouteService>();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
@@ -103,6 +105,12 @@ app.MapPost("/api/satellite/request", RequestRegion)
app.MapGet("/api/satellite/region/{id:guid}", GetRegionStatus)
.WithOpenApi(op => new(op) { Summary = "Get region status and file paths" });
app.MapPost("/api/satellite/route", CreateRoute)
.WithOpenApi(op => new(op) { Summary = "Create a route with intermediate points" });
app.MapGet("/api/satellite/route/{id:guid}", GetRoute)
.WithOpenApi(op => new(op) { Summary = "Get route information with calculated points" });
app.Run();
IResult GetSatelliteTilesByLatLon(double lat, double lon, double squareSideMeters)
@@ -187,15 +195,16 @@ async Task<IResult> RequestRegion([FromBody] RequestRegionRequest request, IRegi
return Results.BadRequest(new { error = "Size must be between 100 and 10000 meters" });
}
logger.LogInformation("Region request received: ID={Id}, Lat={Lat}, Lon={Lon}, Size={Size}m, Zoom={Zoom}",
request.Id, request.Latitude, request.Longitude, request.SizeMeters, request.ZoomLevel);
logger.LogInformation("Region request received: ID={Id}, Lat={Lat}, Lon={Lon}, Size={Size}m, Zoom={Zoom}, Stitch={Stitch}",
request.Id, request.Latitude, request.Longitude, request.SizeMeters, request.ZoomLevel, request.StitchTiles);
var status = await regionService.RequestRegionAsync(
request.Id,
request.Latitude,
request.Longitude,
request.SizeMeters,
request.ZoomLevel);
request.ZoomLevel,
request.StitchTiles);
return Results.Ok(status);
}
@@ -226,6 +235,48 @@ async Task<IResult> GetRegionStatus(Guid id, IRegionService regionService, ILogg
}
}
async Task<IResult> CreateRoute([FromBody] CreateRouteRequest request, IRouteService routeService, ILogger<Program> logger)
{
try
{
logger.LogInformation("Route creation request: ID={Id}, Name={Name}, Points={PointCount}, RegionSize={RegionSize}m, Zoom={Zoom}",
request.Id, request.Name, request.Points.Count, request.RegionSizeMeters, request.ZoomLevel);
var route = await routeService.CreateRouteAsync(request);
return Results.Ok(route);
}
catch (ArgumentException ex)
{
logger.LogWarning(ex, "Invalid route request");
return Results.BadRequest(new { error = ex.Message });
}
catch (Exception ex)
{
logger.LogError(ex, "Failed to create route");
return Results.Problem(detail: ex.Message, statusCode: 500);
}
}
async Task<IResult> GetRoute(Guid id, IRouteService routeService, ILogger<Program> logger)
{
try
{
var route = await routeService.GetRouteAsync(id);
if (route == null)
{
return Results.NotFound(new { error = $"Route {id} not found" });
}
return Results.Ok(route);
}
catch (Exception ex)
{
logger.LogError(ex, "Failed to get route");
return Results.Problem(detail: ex.Message, statusCode: 500);
}
}
public record GetSatelliteTilesResponse
{
public List<SatelliteTile> Tiles { get; set; } = new();
@@ -317,6 +368,8 @@ public record RequestRegionRequest
[Required]
public int ZoomLevel { get; set; } = 18;
public bool StitchTiles { get; set; } = false;
}
public class ParameterDescriptionFilter : IOperationFilter