You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					120 lines
				
				3.5 KiB
			
		
		
			
		
	
	
					120 lines
				
				3.5 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const { buildSchemas } = require('./schemas') | ||
|  | const { serializerCompiler } = require('./schema-compilers') | ||
|  | const ValidatorSelector = require('@fastify/ajv-compiler') | ||
|  | 
 | ||
|  | /** | ||
|  |  * Called at every fastify context that is being created. | ||
|  |  * @param {object} parentSchemaCtrl: the SchemaController instance of the Fastify parent context | ||
|  |  * @param {object} opts: the `schemaController` server option. It can be undefined when a parentSchemaCtrl is set | ||
|  |  * @return {object}:a new SchemaController | ||
|  |  */ | ||
|  | function buildSchemaController (parentSchemaCtrl, opts) { | ||
|  |   if (parentSchemaCtrl) { | ||
|  |     return new SchemaController(parentSchemaCtrl, opts) | ||
|  |   } | ||
|  | 
 | ||
|  |   let compilersFactory = { | ||
|  |     buildValidator: ValidatorSelector(), | ||
|  |     buildSerializer: serializerCompiler | ||
|  |   } | ||
|  |   if (opts && opts.compilersFactory) { | ||
|  |     compilersFactory = Object.assign(compilersFactory, opts.compilersFactory) | ||
|  |   } | ||
|  | 
 | ||
|  |   const option = { | ||
|  |     bucket: (opts && opts.bucket) || buildSchemas, | ||
|  |     compilersFactory | ||
|  |   } | ||
|  | 
 | ||
|  |   return new SchemaController(undefined, option) | ||
|  | } | ||
|  | 
 | ||
|  | class SchemaController { | ||
|  |   constructor (parent, options) { | ||
|  |     this.opts = options || (parent && parent.opts) | ||
|  |     this.addedSchemas = false | ||
|  | 
 | ||
|  |     this.compilersFactory = this.opts.compilersFactory | ||
|  | 
 | ||
|  |     if (parent) { | ||
|  |       this.schemaBucket = this.opts.bucket(parent.getSchemas()) | ||
|  |       this.validatorCompiler = parent.getValidatorCompiler() | ||
|  |       this.serializerCompiler = parent.getSerializerCompiler() | ||
|  |       this.parent = parent | ||
|  |     } else { | ||
|  |       this.schemaBucket = this.opts.bucket() | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   // Bucket interface
 | ||
|  |   add (schema) { | ||
|  |     this.addedSchemas = true | ||
|  |     return this.schemaBucket.add(schema) | ||
|  |   } | ||
|  | 
 | ||
|  |   getSchema (schemaId) { | ||
|  |     return this.schemaBucket.getSchema(schemaId) | ||
|  |   } | ||
|  | 
 | ||
|  |   getSchemas () { | ||
|  |     return this.schemaBucket.getSchemas() | ||
|  |   } | ||
|  | 
 | ||
|  |   // Schema Controller compilers holder
 | ||
|  |   setValidatorCompiler (validatorCompiler) { | ||
|  |     this.validatorCompiler = validatorCompiler | ||
|  |   } | ||
|  | 
 | ||
|  |   setSerializerCompiler (serializerCompiler) { | ||
|  |     this.serializerCompiler = serializerCompiler | ||
|  |   } | ||
|  | 
 | ||
|  |   getValidatorCompiler () { | ||
|  |     return this.validatorCompiler || (this.parent && this.parent.getValidatorCompiler()) | ||
|  |   } | ||
|  | 
 | ||
|  |   getSerializerCompiler () { | ||
|  |     return this.serializerCompiler || (this.parent && this.parent.getSerializerCompiler()) | ||
|  |   } | ||
|  | 
 | ||
|  |   getSerializerBuilder () { | ||
|  |     return this.compilersFactory.buildSerializer || (this.parent && this.parent.getSerializerBuilder()) | ||
|  |   } | ||
|  | 
 | ||
|  |   getValidatorBuilder () { | ||
|  |     return this.compilersFactory.buildValidator || (this.parent && this.parent.getValidatorBuilder()) | ||
|  |   } | ||
|  | 
 | ||
|  |   /** | ||
|  |    * This method will be called when a validator must be setup. | ||
|  |    * Do not setup the compiler more than once | ||
|  |    * @param {object} serverOptions: the fastify server option | ||
|  |    */ | ||
|  |   setupValidator (serverOption) { | ||
|  |     const isReady = this.validatorCompiler !== undefined && !this.addedSchemas | ||
|  |     if (isReady) { | ||
|  |       return | ||
|  |     } | ||
|  |     this.validatorCompiler = this.getValidatorBuilder()(this.schemaBucket.getSchemas(), serverOption.ajv) | ||
|  |   } | ||
|  | 
 | ||
|  |   /** | ||
|  |    * This method will be called when a serializer must be setup. | ||
|  |    * Do not setup the compiler more than once | ||
|  |    * @param {object} serverOptions: the fastify server option | ||
|  |    */ | ||
|  |   setupSerializer (serverOption) { | ||
|  |     const isReady = this.serializerCompiler !== undefined && !this.addedSchemas | ||
|  |     if (isReady) { | ||
|  |       return | ||
|  |     } | ||
|  | 
 | ||
|  |     this.serializerCompiler = this.getSerializerBuilder()(this.schemaBucket.getSchemas(), serverOption.serializerOpts) | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | SchemaController.buildSchemaController = buildSchemaController | ||
|  | module.exports = SchemaController |