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
						
					
					
				'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
 |