Просмотр исходного кода

Merge pull request #4580 from weseek/imprv/v5-compatible-installer

imprv: v5 compatible installer
Haku Mizuki 4 лет назад
Родитель
Сommit
8d78e35963

+ 1 - 1
packages/app/src/server/models/obsolete-page.js

@@ -950,7 +950,7 @@ export const getPageSchema = (crowi) => {
     }
 
     let parent = parentId;
-    if (isV5Compatible && parent == null) {
+    if (isV5Compatible && parent == null && !isTopPage(path)) {
       parent = await Page.getParentIdAndFillAncestors(path);
     }
 

+ 6 - 4
packages/app/src/server/models/page.ts

@@ -7,12 +7,14 @@ import mongoosePaginate from 'mongoose-paginate-v2';
 import uniqueValidator from 'mongoose-unique-validator';
 import nodePath from 'path';
 
-import { getOrCreateModel } from '@growi/core';
+import { getOrCreateModel, pagePathUtils } from '@growi/core';
 import loggerFactory from '../../utils/logger';
 import Crowi from '../crowi';
 import { IPage } from '~/interfaces/page';
 import { getPageSchema, PageQueryBuilder } from './obsolete-page';
 
+const { isTopPage } = pagePathUtils;
+
 const logger = loggerFactory('growi:models:page');
 
 
@@ -43,7 +45,7 @@ const schema = new Schema<PageDocument, PageModel>({
   },
   isEmpty: { type: Boolean, default: false },
   path: {
-    type: String, required: true,
+    type: String, required: true, index: true,
   },
   revision: { type: ObjectId, ref: 'Revision' },
   redirectTo: { type: String, index: true },
@@ -80,7 +82,7 @@ const collectAncestorPaths = (path: string, ancestorPaths: string[] = []): strin
   const parentPath = nodePath.dirname(path);
   ancestorPaths.push(parentPath);
 
-  if (path !== '/') return collectAncestorPaths(parentPath, ancestorPaths);
+  if (!isTopPage(path)) return collectAncestorPaths(parentPath, ancestorPaths);
 
   return ancestorPaths;
 };
@@ -134,7 +136,7 @@ schema.statics.getParentIdAndFillAncestors = async function(path: string): Promi
   ancestors.forEach(page => ancestorsMap.set(page.path, page._id));
 
   // bulkWrite to update ancestors
-  const nonRootAncestors = ancestors.filter(page => page.path !== '/');
+  const nonRootAncestors = ancestors.filter(page => !isTopPage(page.path));
   const operations = nonRootAncestors.map((page) => {
     const { path } = page;
     const parentPath = nodePath.dirname(path);

+ 20 - 12
packages/app/src/server/routes/installer.js

@@ -33,18 +33,15 @@ module.exports = function(crowi) {
   }
 
   async function createInitialPages(owner, lang) {
-    const promises = [];
-
-    // create portal page for '/'
-    promises.push(createPage(path.join(crowi.localeDir, lang, 'welcome.md'), '/', owner, lang));
-
-    // create /Sandbox/*
-    promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox.md'), '/Sandbox', owner, lang));
-    promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-bootstrap4.md'), '/Sandbox/Bootstrap4', owner, lang));
-    promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-diagrams.md'), '/Sandbox/Diagrams', owner, lang));
-    promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-math.md'), '/Sandbox/Math', owner, lang));
-
-    await Promise.all(promises);
+    /*
+     * Keep in this order to avoid creating the same pages
+     */
+    await createPage(path.join(crowi.localeDir, lang, 'sandbox.md'), '/Sandbox', owner, lang);
+    await Promise.all([
+      createPage(path.join(crowi.localeDir, lang, 'sandbox-diagrams.md'), '/Sandbox/Diagrams', owner, lang),
+      createPage(path.join(crowi.localeDir, lang, 'sandbox-bootstrap4.md'), '/Sandbox/Bootstrap4', owner, lang),
+      createPage(path.join(crowi.localeDir, lang, 'sandbox-math.md'), '/Sandbox/Math', owner, lang),
+    ]);
 
     try {
       await initSearchIndex();
@@ -73,6 +70,9 @@ module.exports = function(crowi) {
 
     await appService.initDB(language);
 
+    // create the root page before creating admin user
+    await createPage(path.join(crowi.localeDir, language, 'welcome.md'), '/', { _id: '000000000000000000000000' }, language); // use 0 as a mock user id
+
     // create first admin user
     // TODO: with transaction
     let adminUser;
@@ -84,6 +84,14 @@ module.exports = function(crowi) {
       req.form.errors.push(req.t('message.failed_to_create_admin_user', { errMessage: err.message }));
       return res.render('installer');
     }
+    // add owner after creating admin user
+    const Revision = crowi.model('Revision');
+    const rootPage = await Page.findOne({ path: '/' });
+    const rootRevision = await Revision.findOne({ path: '/' });
+    rootPage.creator = adminUser;
+    rootRevision.creator = adminUser;
+    await Promise.all([rootPage.save(), rootRevision.save()]);
+
     // create initial pages
     await createInitialPages(adminUser, language);
 

+ 2 - 2
packages/app/src/server/service/page.js

@@ -6,8 +6,8 @@ const escapeStringRegexp = require('escape-string-regexp');
 const streamToPromise = require('stream-to-promise');
 const pathlib = require('path');
 
-const logger = loggerFactory('growi:models:page');
-const debug = require('debug')('growi:models:page');
+const logger = loggerFactory('growi:services:page');
+const debug = require('debug')('growi:services:page');
 const { Writable } = require('stream');
 const { createBatchStream } = require('~/server/util/batch-stream');