loopbackio / loopbackio/loopback-next

example or examples keywords in jsonSchema is causing ajv validation to fail

Ouverte
#7,848 2 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug OpenAPI
Langage dominant
TypeScript
Étoiles
5.1k
Forks
1.1k
Merge moyen
2 j 21 h
PR mergées (30 j)
27

Description

Steps to reproduce

Define a model w/ property values samples expressed in jsonSchema as follow :
`import {Entity, model, property} from '@loopback/repository';

@model()
export class Basic extends Entity {
@property({
jsonSchema: {
type: 'string',
example: 'simple',
// examples: [{'simple-sample': {value: 'simple'}}],
},
required: true,
})
name: string;

@property({
type: 'string',
id: true,
generated: true,
})
id?: string;

constructor(data?: Partial) {
super(data);
}
}

export interface BasicRelations {
// describe navigational properties here
}

export type BasicWithRelations = Basic & BasicRelations;`

Reference this entity as the request body in a route :

@post('/basics') @response(200, { description: 'Basic model instance', content: {'application/json': {schema: getModelSchemaRef(Basic)}}, }) async create( @requestBody({ content: { 'application/json': { schema: getModelSchemaRef(Basic, { title: 'NewBasic', }), }, }, }) basic: Basic, ): Promise<Basic> { return this.basicRepository.create(basic); }

Current Behavior

Ajv validation fail when trying to call the route
w/ DEBUG='loopback:rest:validation'

` BasicController
loopback:rest:validation Request body schema: { '$ref': '#/components/schemas/NewBasic' } +0ms
loopback:rest:validation referencing: {
title: 'NewBasic',
type: 'object',
description: "(tsType: Basic, schemaOptions: { title: 'NewBasic' })",
properties: {
name: { type: 'string', example: 'simple' },
id: { type: 'string' }
},
required: [ 'name' ],
additionalProperties: false,
'x-typescript-type': 'Basic'
} +1ms
loopback:rest:validation Converted OpenAPI schema to JSON schema: { '$ref': '#/components/schemas/NewBasic' } +102ms

Request POST /basics failed with status code 500. Error: strict mode: unknown keyword: "example"
at checkStrictMode (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/util.ts:211:28)
at checkUnknownRules (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/util.ts:27:22)
at Object.alwaysValidSchema (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/util.ts:17:3)
at /home/fgeslin/simple-lb4-app/node_modules/ajv/lib/vocabularies/applicator/properties.ts:23:48
at Array.filter ()
at Object.code (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/vocabularies/applicator/properties.ts:23:33)
at keywordCode (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:523:9)
at /home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:265:9
at CodeGen.code (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/codegen/index.ts:525:33)
at CodeGen.block (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/codegen/index.ts:680:20)
at iterateKeywords (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:262:7)
at groupKeywords (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:241:7)
at /home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:233:38
at CodeGen.code (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/codegen/index.ts:525:33)
at CodeGen.block (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/codegen/index.ts:680:20)
at schemaKeywords (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:232:7)
at typeAndKeywords (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:161:3)
at subSchemaObjCode (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:147:3)
at subschemaCode (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:124:7)
at KeywordCxt.subschema (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:491:5)
at inlineRefSchema (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/vocabularies/core/ref.ts:40:26)
at Object.code (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/vocabularies/core/ref.ts:21:12)
at keywordCode (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:523:9)
at /home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:228:21
at CodeGen.code (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/codegen/index.ts:525:33)
at CodeGen.block (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/codegen/index.ts:680:20)
at schemaKeywords (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:228:9)
at typeAndKeywords (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:161:3)
at /home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts💯5
at CodeGen.code (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/codegen/index.ts:525:33)
at /home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:61:45
at CodeGen.code (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/codegen/index.ts:525:33)
at CodeGen.func (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/codegen/index.ts:699:24)
at validateFunction (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:60:9)
at topSchemaObjCode (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:94:3)
at Object.validateFunctionCode (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/validate/index.ts:42:7)
at Ajv.compileSchema (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/compile/index.ts:163:5)
at Ajv._compileSchemaEnv (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/core.ts:718:24)
at Ajv.compile (/home/fgeslin/simple-lb4-app/node_modules/ajv/lib/core.ts:370:34)
at createValidator (/home/fgeslin/simple-lb4-app/node_modules/@loopback/rest/src/validation/request-body.validator.ts:235:18)
at validateValueAgainstSchema (/home/fgeslin/simple-lb4-app/node_modules/@loopback/rest/src/validation/request-body.validator.ts:150:16)
at Object.validateRequestBody (/home/fgeslin/simple-lb4-app/node_modules/@loopback/rest/src/validation/request-body.validator.ts:76:9)
at buildOperationArguments (/home/fgeslin/simple-lb4-app/node_modules/@loopback/rest/src/parser.ts:92:9)
at Object.parseOperationArgs (/home/fgeslin/simple-lb4-app/node_modules/@loopback/rest/src/parser.ts:48:10)
at processTicksAndRejections (internal/process/task_queues.js:95:5)
at /home/fgeslin/simple-lb4-app/node_modules/@loopback/rest/src/providers/parse-params.provider.ts:68:22
at /home/fgeslin/simple-lb4-app/node_modules/@loopback/express/src/middleware-interceptor.ts:131:19
at /home/fgeslin/simple-lb4-app/node_modules/@loopback/express/src/middleware-interceptor.ts:131:19
at /home/fgeslin/simple-lb4-app/node_modules/@loopback/rest/src/providers/send.provider.ts:46:24
at MySequence.handle (/home/fgeslin/simple-lb4-app/node_modules/@loopback/rest/src/sequence.ts:291:5)
at HttpHandler._handleRequest (/home/fgeslin/simple-lb4-app/node_modules/@loopback/rest/src/http-handler.ts:115:5)
1) invokes POST /basics
`

Expected Behavior

Ajv validation OK

Link to reproduction sandbox

n/a

Additional information

Related Issues

n/a

See Reporting Issues for more tips on writing good issues

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par @loopback/rest/src/validation/request-body.validator.ts et suivez la conversion du schéma du corps de la requête vers AJV, en utilisant le modèle Basic et la reproduction de POST /basics décrite ici. Vérifiez comment les mots-clés example et examples du schéma OpenAPI sont traités, puis vérifiez que la requête POST aboutit avec la validation AJV activée.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
api
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
52/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.