installer.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 Config = models.Config;
  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.deleteIndex();
  16. await search.buildIndex();
  17. await search.addAllPages();
  18. }
  19. async function createInitialPages(owner, lang) {
  20. const promises = [];
  21. // create portal page for '/'
  22. const welcomeMarkdownPath = path.join(crowi.localeDir, lang, 'welcome.md');
  23. const welcomeMarkdown = fs.readFileSync(welcomeMarkdownPath);
  24. promises.push(Page.create('/', welcomeMarkdown, owner, {}));
  25. // create /Sandbox
  26. const sandboxMarkdownPath = path.join(crowi.localeDir, lang, 'sandbox.md');
  27. const sandboxMarkdown = fs.readFileSync(sandboxMarkdownPath);
  28. promises.push(Page.create('/Sandbox', sandboxMarkdown, owner, {}));
  29. // create /Sandbox/Bootstrap3
  30. const bs3MarkdownPath = path.join(crowi.localeDir, 'en-US', 'sandbox-bootstrap3.md');
  31. const bs3Markdown = fs.readFileSync(bs3MarkdownPath);
  32. promises.push(Page.create('/Sandbox/Bootstrap3', bs3Markdown, owner, {}));
  33. await Promise.all(promises);
  34. try {
  35. await initSearchIndex();
  36. }
  37. catch (err) {
  38. logger.error('Failed to build Elasticsearch Indices', err);
  39. }
  40. }
  41. actions.index = function(req, res) {
  42. return res.render('installer');
  43. };
  44. actions.install = async function(req, res, next) {
  45. const registerForm = req.body.registerForm || {};
  46. if (!req.form.isValid) {
  47. return res.render('installer');
  48. }
  49. const name = registerForm.name;
  50. const username = registerForm.username;
  51. const email = registerForm.email;
  52. const password = registerForm.password;
  53. const language = registerForm['app:globalLang'] || 'en-US';
  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. Config.applicationInstall((err, configs) => {
  64. if (err) {
  65. logger.error(err);
  66. return;
  67. }
  68. // save the globalLang config, and update the config cache
  69. Config.updateNamespaceByArray('crowi', { 'app:globalLang': language }, (err, config) => {
  70. Config.updateConfigCache('crowi', config);
  71. });
  72. // login with passport
  73. req.logIn(adminUser, (err) => {
  74. if (err) { return next() }
  75. req.flash('successMessage', 'GROWI のインストールが完了しました!はじめに、このページで各種設定を確認してください。');
  76. return res.redirect('/admin/app');
  77. });
  78. });
  79. // create initial pages
  80. await createInitialPages(adminUser, language);
  81. };
  82. return actions;
  83. };