mahaplatform/backframe

View on GitHub
src/backframe.js

Summary

Maintainability
A
45 mins
Test Coverage
import NotFoundRoute from './not_found_route'
import Component from './component'
import _ from 'lodash'

class Backframe extends Component {

  plugins = []

  routes = []

  constructor(config = {}) {
    super(config)
    this.setDefaultFormat(config.defaultFormat || 'json')
    this.setDefaultLimit(config.defaultLimit || 100)
    if(config.knex) this.setKnex(config.knex)
    if(config.logger) this.setLogger(config.logger)
    if(config.plugins) this.setPlugins(config.plugins)
    if(config.redis) this.setRedis(config.redis)
    if(config.routes) this.setRoutes(config.routes)
    if(config.reporter) this.setReporter(config.reporter)
  }

  setDefaultFormat(defaultFormat) {
    this._setOption('defaultFormat', defaultFormat)
  }

  setDefaultLimit(defaultLimit) {
    this._setOption('defaultLimit', defaultLimit)
  }

  setKnex(knex) {
    this._setOption('knex', knex)
  }

  setLogger(logger) {
    this._setOption('logger', logger)
  }

  setPlugins(plugins) {
    this.plugins = plugins
  }

  addPlugin(plugin) {
    this._addItem('plugins', plugin)
  }

  setRedis(redis) {
    this._setOption('redis', redis)
  }

  setReporter(reporter) {
    this._setOption('reporter', reporter)
  }

  setRoutes(routes) {
    this.routes = routes
  }

  addRoute(route) {
    this._addItem('routes', route)
  }

  render() {

    const plugins = this.plugins.reduce((items, plugin) => ({
      hooks: this._mergeHooks(items.hooks, plugin.hooks),
      options: this._mergeOptions(items.options, plugin.options)
    }), { hooks: [], options })

    const options = this._mergeOptions(this.options, plugins.options)

    const hooks = this._mergeHooks(this.options, plugins.hooks)

    return [
      ...this.routes.reduce((routes, route) => [
        ...routes,
        ..._.castArray(route.render(this.path, options, hooks))
      ], [])
    ]

  }

}

export default Backframe