installer.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 { searchService } = crowi;
  12. if (!searchService.isReachable) {
  13. return;
  14. }
  15. await searchService.rebuildIndex();
  16. }
  17. async function createPage(filePath, pagePath, owner, lang) {
  18. try {
  19. const markdown = fs.readFileSync(filePath);
  20. return Page.create(pagePath, markdown, owner, {});
  21. }
  22. catch (err) {
  23. logger.error(`Failed to create ${pagePath}`, err);
  24. }
  25. }
  26. async function createInitialPages(owner, lang) {
  27. const promises = [];
  28. // create portal page for '/'
  29. promises.push(createPage(path.join(crowi.localeDir, lang, 'welcome.md'), '/', owner, lang));
  30. // create /Sandbox/*
  31. promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox.md'), '/Sandbox', owner, lang));
  32. promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-bootstrap4.md'), '/Sandbox/Bootstrap4', owner, lang));
  33. promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-diagrams.md'), '/Sandbox/Diagrams', owner, lang));
  34. promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-math.md'), '/Sandbox/Math', owner, lang));
  35. await Promise.all(promises);
  36. try {
  37. await initSearchIndex();
  38. }
  39. catch (err) {
  40. logger.error('Failed to build Elasticsearch Indices', err);
  41. }
  42. }
  43. actions.index = function(req, res) {
  44. return res.render('installer');
  45. };
  46. actions.install = async function(req, res, next) {
  47. const registerForm = req.body.registerForm || {};
  48. if (!req.form.isValid) {
  49. return res.render('installer');
  50. }
  51. const name = registerForm.name;
  52. const username = registerForm.username;
  53. const email = registerForm.email;
  54. const password = registerForm.password;
  55. const language = registerForm['app:globalLang'] || 'en-US';
  56. await appService.initDB(language);
  57. // create first admin user
  58. // TODO: with transaction
  59. let adminUser;
  60. try {
  61. adminUser = await User.createUser(name, username, email, password, language);
  62. await adminUser.asyncMakeAdmin();
  63. }
  64. catch (err) {
  65. req.form.errors.push(`管理ユーザーの作成に失敗しました。${err.message}`);
  66. return res.render('installer');
  67. }
  68. // create initial pages
  69. await createInitialPages(adminUser, language);
  70. // init plugins
  71. crowi.pluginService.autoDetectAndLoadPlugins();
  72. // setup routes
  73. crowi.setupRoutesAtLast(app);
  74. // login with passport
  75. req.logIn(adminUser, (err) => {
  76. if (err) { return next() }
  77. req.flash('successMessage', 'GROWI のインストールが完了しました!はじめに、このページで各種設定を確認してください。');
  78. return res.redirect('/admin/app');
  79. });
  80. };
  81. return actions;
  82. };