installer.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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.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. await appService.initDB(language);
  55. // create first admin user
  56. let adminUser;
  57. try {
  58. adminUser = await User.createUser(name, username, email, password, language);
  59. await adminUser.asyncMakeAdmin();
  60. }
  61. catch (err) {
  62. req.form.errors.push(`管理ユーザーの作成に失敗しました。${err.message}`);
  63. return res.render('installer');
  64. }
  65. // create initial pages
  66. await createInitialPages(adminUser, language);
  67. // login with passport
  68. req.logIn(adminUser, (err) => {
  69. if (err) { return next() }
  70. req.flash('successMessage', 'GROWI のインストールが完了しました!はじめに、このページで各種設定を確認してください。');
  71. return res.redirect('/admin/app');
  72. });
  73. };
  74. return actions;
  75. };