installer.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. module.exports = function(crowi, app) {
  2. const logger = require('@alias/logger')('growi:routes:installer');
  3. const path = require('path');
  4. const fs = require('graceful-fs');
  5. const models = crowi.models;
  6. const { appService } = crowi;
  7. const User = models.User;
  8. const Page = models.Page;
  9. const actions = {};
  10. async function initSearchIndex() {
  11. const search = crowi.getSearcher();
  12. if (search == null) {
  13. return;
  14. }
  15. await search.buildIndex();
  16. }
  17. async function createInitialPages(owner, lang) {
  18. const promises = [];
  19. // create portal page for '/'
  20. const welcomeMarkdownPath = path.join(crowi.localeDir, lang, 'welcome.md');
  21. const welcomeMarkdown = fs.readFileSync(welcomeMarkdownPath);
  22. promises.push(Page.create('/', welcomeMarkdown, owner, {}));
  23. // create /Sandbox
  24. const sandboxMarkdownPath = path.join(crowi.localeDir, lang, 'sandbox.md');
  25. const sandboxMarkdown = fs.readFileSync(sandboxMarkdownPath);
  26. promises.push(Page.create('/Sandbox', sandboxMarkdown, owner, {}));
  27. // create /Sandbox/Bootstrap3
  28. const bs3MarkdownPath = path.join(crowi.localeDir, 'en-US', 'sandbox-bootstrap3.md');
  29. const bs3Markdown = fs.readFileSync(bs3MarkdownPath);
  30. promises.push(Page.create('/Sandbox/Bootstrap3', bs3Markdown, owner, {}));
  31. await Promise.all(promises);
  32. try {
  33. await initSearchIndex();
  34. }
  35. catch (err) {
  36. logger.error('Failed to build Elasticsearch Indices', err);
  37. }
  38. }
  39. actions.index = function(req, res) {
  40. return res.render('installer');
  41. };
  42. actions.install = async function(req, res, next) {
  43. const registerForm = req.body.registerForm || {};
  44. if (!req.form.isValid) {
  45. return res.render('installer');
  46. }
  47. const name = registerForm.name;
  48. const username = registerForm.username;
  49. const email = registerForm.email;
  50. const password = registerForm.password;
  51. const language = registerForm['app:globalLang'] || 'en-US';
  52. await appService.initDB(language);
  53. // create first admin user
  54. let adminUser;
  55. try {
  56. adminUser = await User.createUser(name, username, email, password, language);
  57. await adminUser.asyncMakeAdmin();
  58. }
  59. catch (err) {
  60. req.form.errors.push(`管理ユーザーの作成に失敗しました。${err.message}`);
  61. return res.render('installer');
  62. }
  63. // create initial pages
  64. await createInitialPages(adminUser, language);
  65. // init plugins
  66. crowi.pluginService.autoDetectAndLoadPlugins();
  67. // setup routes
  68. crowi.setupRoutesAtLast(app);
  69. // login with passport
  70. req.logIn(adminUser, (err) => {
  71. if (err) { return next() }
  72. req.flash('successMessage', 'GROWI のインストールが完了しました!はじめに、このページで各種設定を確認してください。');
  73. return res.redirect('/admin/app');
  74. });
  75. };
  76. return actions;
  77. };