installer.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import loggerFactory from '~/utils/logger';
  2. module.exports = function(crowi) {
  3. const logger = loggerFactory('growi:routes:installer');
  4. const path = require('path');
  5. const fs = require('graceful-fs');
  6. const models = crowi.models;
  7. const { appService } = crowi;
  8. const User = models.User;
  9. const Page = models.Page;
  10. const actions = {};
  11. async function initSearchIndex() {
  12. const { searchService } = crowi;
  13. if (!searchService.isReachable) {
  14. return;
  15. }
  16. await searchService.rebuildIndex();
  17. }
  18. async function createPage(filePath, pagePath, owner, lang) {
  19. try {
  20. const markdown = fs.readFileSync(filePath);
  21. return Page.create(pagePath, markdown, owner, {});
  22. }
  23. catch (err) {
  24. logger.error(`Failed to create ${pagePath}`, err);
  25. }
  26. }
  27. async function createInitialPages(owner, lang) {
  28. /*
  29. * Keep in this order to avoid creating the same pages
  30. */
  31. await createPage(path.join(crowi.localeDir, lang, 'sandbox.md'), '/Sandbox', owner, lang);
  32. await Promise.all([
  33. createPage(path.join(crowi.localeDir, lang, 'sandbox-diagrams.md'), '/Sandbox/Diagrams', owner, lang),
  34. createPage(path.join(crowi.localeDir, lang, 'sandbox-bootstrap4.md'), '/Sandbox/Bootstrap4', owner, lang),
  35. createPage(path.join(crowi.localeDir, lang, 'sandbox-math.md'), '/Sandbox/Math', owner, lang),
  36. ]);
  37. try {
  38. await initSearchIndex();
  39. }
  40. catch (err) {
  41. logger.error('Failed to build Elasticsearch Indices', err);
  42. }
  43. }
  44. actions.index = function(req, res) {
  45. return res.render('installer');
  46. };
  47. actions.install = async function(req, res, next) {
  48. const registerForm = req.body.registerForm || {};
  49. if (!req.form.isValid) {
  50. return res.render('installer');
  51. }
  52. const name = registerForm.name;
  53. const username = registerForm.username;
  54. const email = registerForm.email;
  55. const password = registerForm.password;
  56. const language = registerForm['app:globalLang'] || 'en_US';
  57. await appService.initDB(language);
  58. // create the root page before creating admin user
  59. await createPage(path.join(crowi.localeDir, language, 'welcome.md'), '/', { _id: '000000000000000000000000' }, language); // use 0 as a mock user id
  60. // create first admin user
  61. // TODO: with transaction
  62. let adminUser;
  63. try {
  64. adminUser = await User.createUser(name, username, email, password, language);
  65. await adminUser.asyncMakeAdmin();
  66. }
  67. catch (err) {
  68. req.form.errors.push(req.t('message.failed_to_create_admin_user', { errMessage: err.message }));
  69. return res.render('installer');
  70. }
  71. // add owner after creating admin user
  72. const Revision = crowi.model('Revision');
  73. const rootPage = await Page.findOne({ path: '/' });
  74. const rootRevision = await Revision.findOne({ path: '/' });
  75. rootPage.creator = adminUser;
  76. rootRevision.creator = adminUser;
  77. await Promise.all([rootPage.save(), rootRevision.save()]);
  78. // create initial pages
  79. await createInitialPages(adminUser, language);
  80. appService.setupAfterInstall();
  81. appService.publishPostInstallationMessage();
  82. // login with passport
  83. req.logIn(adminUser, (err) => {
  84. if (err) {
  85. req.flash('successMessage', req.t('message.complete_to_install1'));
  86. req.session.redirectTo = '/';
  87. return res.redirect('/login');
  88. }
  89. req.flash('successMessage', req.t('message.complete_to_install2'));
  90. return res.redirect('/');
  91. });
  92. };
  93. return actions;
  94. };