diff --git a/packages/geoprocessing/src/aws/GeoprocessingHandler.ts b/packages/geoprocessing/src/aws/GeoprocessingHandler.ts index c521650819..3a063ae01c 100644 --- a/packages/geoprocessing/src/aws/GeoprocessingHandler.ts +++ b/packages/geoprocessing/src/aws/GeoprocessingHandler.ts @@ -435,20 +435,19 @@ export class GeoprocessingHandler< } /** - * Parses request event and returns GeoprocessingRequest. + * Parses event and returns GeoprocessingRequestModel object. */ parseRequest(event: APIGatewayProxyEvent): GeoprocessingRequestModel { let request: GeoprocessingRequestModel; - if ("geometry" in event) { - // POST request or aws console, so already in internal model form + if ("geometry" in event || "geometryUri" in event) { + // Is direct aws invocation, so should already be in internal model form request = event as GeoprocessingRequestModel; } else if ( event.queryStringParameters && event.queryStringParameters["geometryUri"] ) { - // GET request with query string parameters to merge - - // Extract extraParams from query string if necessary, though gateway lambda integration seems to do it for us + // Is GET request with query string parameters + // parse extraParams object from query string if necessary, though gateway lambda integration seems to do it for us const extraString = event.queryStringParameters["extraParams"]; let extraParams: P | undefined; if (typeof extraString === "string") { @@ -465,6 +464,7 @@ export class GeoprocessingHandler< extraParams, }; } else if (event.body && typeof event.body === "string") { + // Is POST request request = JSON.parse(event.body); } else { throw new Error("Could not interpret incoming request"); diff --git a/packages/geoprocessing/src/datasources/seasketch.ts b/packages/geoprocessing/src/datasources/seasketch.ts index 8be2c97017..f049f5f65b 100644 --- a/packages/geoprocessing/src/datasources/seasketch.ts +++ b/packages/geoprocessing/src/datasources/seasketch.ts @@ -5,8 +5,8 @@ import { Sketch, SketchCollection, Geometry, + GeoprocessingRequest, } from "../types/index.js"; -import { GeoprocessingRequest } from "../types/index.js"; import isHostedOnLambda from "./isHostedOnLambda.js"; // Seasketch client diff --git a/packages/geoprocessing/src/types/service.ts b/packages/geoprocessing/src/types/service.ts index 3e5acbd2c0..12f3f393c6 100644 --- a/packages/geoprocessing/src/types/service.ts +++ b/packages/geoprocessing/src/types/service.ts @@ -1,6 +1,17 @@ import { JSONValue } from "./base.js"; -import { Polygon, LineString, Point, Feature } from "./geojson.js"; -import { Sketch, SketchProperties } from "./sketch.js"; +import { + Polygon, + MultiPolygon, + LineString, + Point, + Feature, +} from "./geojson.js"; +import { + Sketch, + SketchCollection, + SketchGeometryTypes, + SketchProperties, +} from "./sketch.js"; interface ClientCode { uri: string; // public bundle location @@ -99,13 +110,15 @@ export interface PreprocessingHandlerOptions { } /** - * Represents geoprocessing request via HTTP method, fully packed + * Represents geoprocessing request via HTTP method, fully packed (stringified JSON) parameters */ -export interface GeoprocessingRequest { +export interface GeoprocessingRequest< + G = Polygon | MultiPolygon | LineString | Point, +> { /** URL to fetch Sketch JSON */ geometryUri?: string; // must be https /** Sketch JSON */ - geometry?: Sketch; + geometry?: Sketch | SketchCollection; /** Additional runtime parameters, as escaped JSON string */ extraParams?: string; token?: string; @@ -118,13 +131,13 @@ export interface GeoprocessingRequest { export type GeoprocessingRequestParams = Record; /** - * Represents geoprocessing request internally, fully unpacked + * Represents geoprocessing request internally, fully unpacked parameters */ -export interface GeoprocessingRequestModel { +export interface GeoprocessingRequestModel { /** URL to fetch Sketch JSON */ geometryUri?: string; // must be https /** Sketch JSON */ - geometry?: Sketch; + geometry?: Sketch | SketchCollection; /** Additional runtime parameters */ extraParams?: GeoprocessingRequestParams; token?: string;