Feature request: validator Middy.js middleware for JSON Schema validation · Issue #3609 · aws-powertools/powertools-lambda-typescript (original) (raw)

Use case

To continue the implementation of the Validation utility started in #3607, we should implement a validator Middy.js middleware that can be used by customers who are already invested in Middy.js to wrap a function handler and validate both inputs and outputs against a set of JSON Schemas.

Solution/User Experience

The middleware will use the validate function implemented in #3607 under the hood, and as such it should accept similar parameters to that function, albeit with some changes to accommodate the fact that 1/ it's a middleware, and 2/ it can validate both input and outputs of the decorated method.

The middleware will take a single params object that has the following items:

Both inboundSchema and outboundSchema are optional, this is intentional because we want to allow customers to validate one, the other, or both. When one of them is provided, the corresponding onBefore and onAfter hooks in the middleware will be no-ops.

In terms of implementation, the validator decorator will set two Middy.js hooks:

I'm unsure if it's even possible, but if it is, the middleware should be a generic function and accept types for both the event and response, and set these types on the handler - as I mentioned, I am unsure if this is doable. If not, or too time consuming, feel free to skip it for now and prioritize the overall implementation.

As part of the implementation the implementer should also write unit tests to cover 100% of the files, lines, branches of the code added as part of this issue. All the dependencies needed should already be present in the workspace, ideally the implementation should follow existing project conventions as much as possible. The middleware should be in its own file, i.e. packages/validation/src/middleware.ts.

When it comes to references, you can find an example of how this middleware would be used in the docs/utilities/validation.md file.

If instead you're unfamiliar with how to implement Middy.js middlewares, I've added an example below

const validator = (params: ValidatorOptions) => { const before = async (request) => { // if no inbound schema is not present, return undefined here // validate inbound schema here // replace request.event with the result of the validate call }

const after = async (request) => { // if no inbound schema is not present, return undefined here // validate outbound schema here }

return { before, after, } }

Additionally, you can also refer to the Middy.js guide on how to write middlewares.

Alternative solutions

Acknowledgment

Future readers

Please react with 👍 and your use case to help us understand customer demand.