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
							 |