Parcourir la source

Merge pull request #1160 from weseek/fix/1159-plugins-initialization

Fix/1159 plugins initialization
Yuki Takei il y a 6 ans
Parent
commit
b4f7028ca4

+ 2 - 0
CHANGES.md

@@ -3,6 +3,8 @@
 ## 3.5.9-RC
 
 * Fix: Editing table with Spreadsheet like GUI (Handsontable) is failed
+* Fix: Plugins are not initialized when first launching
+    * Introduced by 3.5.0
 * Support: Upgrade libs
     * entities
     * growi-commons

+ 0 - 15
src/server/crowi/dev.js

@@ -123,21 +123,6 @@ class CrowiDev {
     app.use(require('connect-browser-sync')(bs));
   }
 
-  loadPlugins(app) {
-    if (process.env.PLUGIN_NAMES_TOBE_LOADED !== undefined
-        && process.env.PLUGIN_NAMES_TOBE_LOADED.length > 0) {
-      const pluginNames = process.env.PLUGIN_NAMES_TOBE_LOADED.split(',');
-      logger.debug('[development] loading Plugins', pluginNames);
-
-      // merge and remove duplicates
-      if (pluginNames.length > 0) {
-        const PluginService = require('../plugins/plugin.service');
-        const pluginService = new PluginService(this.crowi, app);
-        pluginService.loadPlugins(pluginNames);
-      }
-    }
-  }
-
 }
 
 module.exports = CrowiDev;

+ 6 - 13
src/server/crowi/index.js

@@ -15,6 +15,8 @@ const mongoose = require('mongoose');
 
 const models = require('../models');
 
+const PluginService = require('../plugins/plugin.service');
+
 function Crowi(rootdir) {
   const self = this;
 
@@ -363,6 +365,10 @@ Crowi.prototype.start = async function() {
   await this.init();
   const express = await this.buildServer();
 
+  // setup plugins
+  this.pluginService = new PluginService(this, express);
+  this.pluginService.autoDetectAndLoadPlugins();
+
   const server = (this.node_env === 'development') ? this.crowiDev.setupServer(express) : express;
 
   // listen
@@ -391,19 +397,6 @@ Crowi.prototype.buildServer = function() {
 
   require('./express-init')(this, express);
 
-  // import plugins
-  const isEnabledPlugins = this.configManager.getConfig('crowi', 'plugin:isEnabledPlugins');
-  if (isEnabledPlugins) {
-    debug('Plugins are enabled');
-    const PluginService = require('../plugins/plugin.service');
-    const pluginService = new PluginService(this, express);
-    pluginService.autoDetectAndLoadPlugins();
-
-    if (env === 'development') {
-      this.crowiDev.loadPlugins(express);
-    }
-  }
-
   // use bunyan
   if (env === 'production') {
     const expressBunyanLogger = require('express-bunyan-logger');

+ 27 - 1
src/server/plugins/plugin.service.js

@@ -10,7 +10,33 @@ class PluginService {
   }
 
   autoDetectAndLoadPlugins() {
-    this.loadPlugins(this.pluginUtils.listPluginNames(this.crowi.rootDir));
+    const isEnabledPlugins = this.crowi.configManager.getConfig('crowi', 'plugin:isEnabledPlugins');
+
+    // import plugins
+    if (isEnabledPlugins) {
+      logger.debug('Plugins are enabled');
+      this.loadPlugins(this.pluginUtils.listPluginNames(this.crowi.rootDir));
+
+      // when dev
+      if (this.crowi.node_env === 'development') {
+        this.autoDetectAndLoadPluginsForDev();
+      }
+    }
+
+  }
+
+  autoDetectAndLoadPluginsForDev() {
+    if (process.env.PLUGIN_NAMES_TOBE_LOADED !== undefined
+      && process.env.PLUGIN_NAMES_TOBE_LOADED.length > 0) {
+
+      const pluginNames = process.env.PLUGIN_NAMES_TOBE_LOADED.split(',');
+      logger.debug('[development] loading Plugins', pluginNames);
+
+      // merge and remove duplicates
+      if (pluginNames.length > 0) {
+        this.crowi.pluginService.loadPlugins(pluginNames);
+      }
+    }
   }
 
   /**

+ 12 - 6
src/server/routes/index.js

@@ -29,12 +29,22 @@ module.exports = function(crowi, app) {
     csrfVerify: csrf,
   } = middlewares;
 
+  const isInstalled = crowi.configManager.getConfig('crowi', 'app:installed');
+
   /* eslint-disable max-len, comma-spacing, no-multi-spaces */
 
   app.get('/'                        , middlewares.applicationInstalled, loginRequired(false) , page.showTopPage);
 
-  app.get('/installer'               , middlewares.applicationNotInstalled , installer.index);
-  app.post('/installer'              , middlewares.applicationNotInstalled , form.register , csrf, installer.install);
+  // API v3
+  app.use('/api-docs', require('./apiv3/docs')(crowi));
+  app.use('/_api/v3', require('./apiv3')(crowi));
+
+  // installer
+  if (!isInstalled) {
+    app.get('/installer'               , middlewares.applicationNotInstalled , installer.index);
+    app.post('/installer'              , middlewares.applicationNotInstalled , form.register , csrf, installer.install);
+    return;
+  }
 
   app.get('/login/error/:reason'     , login.error);
   app.get('/login'                   , middlewares.applicationInstalled    , login.login);
@@ -229,10 +239,6 @@ module.exports = function(crowi, app) {
   app.post('/_api/hackmd.discard'        , accessTokenParser , loginRequired() , csrf, hackmd.validateForApi, hackmd.discard);
   app.post('/_api/hackmd.saveOnHackmd'   , accessTokenParser , loginRequired() , csrf, hackmd.validateForApi, hackmd.saveOnHackmd);
 
-  // API v3
-  app.use('/api-docs', require('./apiv3/docs')(crowi));
-  app.use('/_api/v3', require('./apiv3')(crowi));
-
   app.get('/*/$'                   , loginRequired(false) , page.showPageWithEndOfSlash, page.notFound);
   app.get('/*'                     , loginRequired(false) , page.showPage, page.notFound);
 };

+ 4 - 0
src/server/routes/installer.js

@@ -81,6 +81,10 @@ module.exports = function(crowi, app) {
     }
     // create initial pages
     await createInitialPages(adminUser, language);
+    // init plugins
+    crowi.pluginService.autoDetectAndLoadPlugins();
+    // setup routes
+    crowi.setupRoutesAtLast(app);
 
     // login with passport
     req.logIn(adminUser, (err) => {