Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 1x 1x 1x 1x 3x 3x 3x 3x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 23x 23x 23x 23x 23x 23x 3x 3x 21x 19x 19x 6x 6x 6x 5x 5x 1x 1x 23x | import { validate, ValidationResult } from 'yaschva'
import { ContractType, AuthInput, HttpMethods, Implementation, HandleResult, isContractInError } from './globalTypes.js'
const inputValidationFailed = (errors:ValidationResult, data:any) => ({
errorType: 'Input validation failed',
data,
status: 400,
errors
})
const notImplemented = (contractName:string) => ({
errorType: 'Not implemented',
data: contractName,
status: 501,
errors: [`Handler for ${contractName} was not defined`]
})
const unexpectedResult = (errors: ValidationResult, data:any) => ({
errorType: 'Unexpected result from function',
data,
status: 500,
errors
})
export const wrapHandleWithValidation = <METHOD extends HttpMethods, IMPL extends Implementation, IN, OUT>(
contract: ContractType<METHOD, IMPL, IN, OUT>,
validateOutput:boolean = true
): ((input: any, auth?: AuthInput, id?:string) => Promise<HandleResult<OUT>>) => {
return async (input: any, auth:AuthInput = {}, id?:string): Promise<HandleResult<OUT>> => {
const validationResult = validate(contract.arguments, input)
if (validationResult.result === 'fail') {
return inputValidationFailed(validationResult, input)
}
if (contract.handle) {
const result = await contract.handle(input, { ...auth }, contract, id)
if (validateOutput && !isContractInError(result)) {
const outputValidation = validate(contract.returns, result.result)
if (outputValidation.result === 'fail') return unexpectedResult(outputValidation, result.result)
}
return result
}
return notImplemented(contract.name)
}
}
|