UNPKG

3.87 kBJavaScriptView Raw
1"use strict";
2// Copyright IBM Corp. and LoopBack contributors 2017,2020. All Rights Reserved.
3// Node module: @loopback/rest
4// This file is licensed under the MIT License.
5// License text available at https://opensource.org/licenses/MIT
6Object.defineProperty(exports, "__esModule", { value: true });
7exports.parseOperationArgs = void 0;
8const tslib_1 = require("tslib");
9const openapi_v3_1 = require("@loopback/openapi-v3");
10const debug_1 = tslib_1.__importDefault(require("debug"));
11const body_parsers_1 = require("./body-parsers");
12const coerce_parameter_1 = require("./coercion/coerce-parameter");
13const rest_http_error_1 = require("./rest-http-error");
14const ajv_factory_provider_1 = require("./validation/ajv-factory.provider");
15const request_body_validator_1 = require("./validation/request-body.validator");
16const debug = (0, debug_1.default)('loopback:rest:parser');
17/**
18 * Parses the request to derive arguments to be passed in for the Application
19 * controller method
20 *
21 * @param request - Incoming HTTP request
22 * @param route - Resolved Route
23 */
24async function parseOperationArgs(request, route, requestBodyParser = new body_parsers_1.RequestBodyParser(), options = ajv_factory_provider_1.DEFAULT_AJV_VALIDATION_OPTIONS) {
25 debug('Parsing operation arguments for route %s', route.describe());
26 const operationSpec = route.spec;
27 const pathParams = route.pathParams;
28 const body = await requestBodyParser.loadRequestBodyIfNeeded(operationSpec, request);
29 return buildOperationArguments(operationSpec, request, pathParams, body, route.schemas, options);
30}
31exports.parseOperationArgs = parseOperationArgs;
32async function buildOperationArguments(operationSpec, request, pathParams, body, globalSchemas, options = ajv_factory_provider_1.DEFAULT_AJV_VALIDATION_OPTIONS) {
33 var _a;
34 let requestBodyIndex = -1;
35 if (operationSpec.requestBody) {
36 // the type of `operationSpec.requestBody` could be `RequestBodyObject`
37 // or `ReferenceObject`, resolving a `$ref` value is not supported yet.
38 if ((0, openapi_v3_1.isReferenceObject)(operationSpec.requestBody)) {
39 throw new Error('$ref requestBody is not supported yet.');
40 }
41 const i = operationSpec.requestBody[openapi_v3_1.REQUEST_BODY_INDEX];
42 requestBodyIndex = i != null ? i : 0;
43 }
44 const paramArgs = [];
45 for (const paramSpec of (_a = operationSpec.parameters) !== null && _a !== void 0 ? _a : []) {
46 if ((0, openapi_v3_1.isReferenceObject)(paramSpec)) {
47 // TODO(bajtos) implement $ref parameters
48 // See https://github.com/loopbackio/loopback-next/issues/435
49 throw new Error('$ref parameters are not supported yet.');
50 }
51 const spec = paramSpec;
52 const rawValue = getParamFromRequest(spec, request, pathParams);
53 const coercedValue = await (0, coerce_parameter_1.coerceParameter)(rawValue, spec, options);
54 paramArgs.push(coercedValue);
55 }
56 debug('Validating request body - value %j', body);
57 await (0, request_body_validator_1.validateRequestBody)(body, operationSpec.requestBody, globalSchemas, options);
58 if (requestBodyIndex >= 0) {
59 paramArgs.splice(requestBodyIndex, 0, body.value);
60 }
61 return paramArgs;
62}
63function getParamFromRequest(spec, request, pathParams) {
64 switch (spec.in) {
65 case 'query':
66 return request.query[spec.name];
67 case 'path':
68 return pathParams[spec.name];
69 case 'header':
70 // @jannyhou TBD: check edge cases
71 return request.headers[spec.name.toLowerCase()];
72 // TODO(jannyhou) to support `cookie`,
73 // see issue https://github.com/loopbackio/loopback-next/issues/997
74 default:
75 throw rest_http_error_1.RestHttpErrors.invalidParamLocation(spec.in);
76 }
77}
78//# sourceMappingURL=parser.js.map
\No newline at end of file