OpenVeo Core server

API Docs for: 7.0.0
Show:

File: app/server/plugin/CorePlugin.js

'use strict';

/**
 * @module core-plugin
 */

var util = require('util');
var async = require('async');
var express = require('express');
var openVeoApi = require('@openveo/api');
var CorePluginApi = process.require('app/server/plugin/CorePluginApi.js');
var ClientProvider = process.require('app/server/providers/ClientProvider.js');
var RoleProvider = process.require('app/server/providers/RoleProvider.js');
var TokenProvider = process.require('app/server/providers/TokenProvider.js');
var UserProvider = process.require('app/server/providers/UserProvider.js');
var GroupProvider = process.require('app/server/providers/GroupProvider.js');
var TaxonomyProvider = process.require('app/server/providers/TaxonomyProvider.js');
var SettingProvider = process.require('app/server/providers/SettingProvider.js');
var storage = process.require('app/server/storage.js');
var listener = process.require('app/server/plugin/listener.js');

/**
 * Defines the Core Plugin.
 *
 * In some way, the core act just like any other plugins, it has a 3 routers (public, private and web service) and
 * a configuration file. Core plugin can be loaded just like any plugin.
 *
 * @class CorePlugin
 * @extends Plugin
 * @constructor
 */
function CorePlugin() {
  CorePlugin.super_.call(this);

  Object.defineProperties(this, {

    /**
     * Core plugin name.
     *
     * @property name
     * @type String
     */
    name: {value: 'core', writable: true, enumerable: true},

    /**
     * Core plugin path.
     *
     * @property path
     * @type String
     * @final
     */
    path: {value: process.root},

    /**
     * Core plugin mount path.
     *
     * @property mountPath
     * @type String
     * @final
     */
    mountPath: {value: '/'},

    /**
     * Core APIs.
     *
     * @property api
     * @type PluginApi
     * @final
     */
    api: {value: new CorePluginApi()},

    /**
     * Core public router.
     *
     * @property router
     * @type Router
     * @final
     */
    router: {value: express.Router()},

    /**
     * Core private router.
     *
     * @property router
     * @type Router
     * @final
     */
    privateRouter: {value: express.Router()},

    /**
     * Core web service router.
     *
     * @property router
     * @type Router
     * @final
     */
    webServiceRouter: {value: express.Router()}

  });
}

module.exports = CorePlugin;
util.inherits(CorePlugin, openVeoApi.plugin.Plugin);

/**
 * Sets listeners on core hooks.
 *
 * @method setCoreListeners
 * @private
 */
function setCoreListeners() {
  var coreApi = process.api.getCoreApi();
  var CORE_HOOKS = coreApi.getHooks();
  coreApi.registerAction(CORE_HOOKS.ROLES_DELETED, listener.onRolesDeleted);
  coreApi.registerAction(CORE_HOOKS.GROUPS_ADDED, listener.onGroupsAdded);
  coreApi.registerAction(CORE_HOOKS.GROUP_UPDATED, listener.onGroupUpdated);
  coreApi.registerAction(CORE_HOOKS.GROUPS_DELETED, listener.onGroupsDeleted);
}

/**
 * Prepares plugin by creating required database indexes.
 *
 * This is automatically called by core application after plugin is loaded.
 *
 * @method init
 * @async
 * @param {Function} callback Function to call when it's done with:
 *  - **Error** An error if something went wrong, null otherwise
 */
CorePlugin.prototype.init = function(callback) {
  var database = storage.getDatabase();
  var asyncFunctions = [];
  var providers = [
    new ClientProvider(database),
    new RoleProvider(database),
    new TaxonomyProvider(database),
    new TokenProvider(database),
    new UserProvider(database),
    new GroupProvider(database),
    new SettingProvider(database)
  ];

  setCoreListeners.call(this);

  providers.forEach(function(provider) {
    if (provider.createIndexes) {
      asyncFunctions.push(function(callback) {
        provider.createIndexes(callback);
      });
    }
  });

  async.parallel(asyncFunctions, function(error, results) {
    callback(error);
  });
};