Răsfoiți Sursa

Merge pull request #4308 from overleaf/bg-allow-creating-projects-with-old-history

add script to create projects with sharelatex history

GitOrigin-RevId: bc5eae5d16cc65fca60b9155b35b7f5e2c663870
Jakob Ackermann 5 ani în urmă
părinte
comite
22aad599ba

+ 4 - 1
services/web/app/src/Features/Project/ProjectCreationHandler.js

@@ -181,7 +181,10 @@ async function _createBlankProject(ownerId, projectName, attributes = {}) {
 
   Object.assign(project, attributes)
 
-  if (Settings.apis.project_history.displayHistoryForNewProjects) {
+  // only display full project history when the project has the overleaf history id attribute
+  // (to allow scripted creation of projects without full project history)
+  const historyId = _.get(attributes, ['overleaf', 'history', 'id'])
+  if (Settings.apis.project_history.displayHistoryForNewProjects && historyId) {
     project.overleaf.history.display = true
   }
   if (Settings.currentImageName) {

+ 118 - 0
services/web/scripts/create_project.js

@@ -0,0 +1,118 @@
+// Script to create projects with sharelatex history for testing
+// Example:
+// node scripts/create_project.js --user-id=5dca84e11e71ae002ff73bd4 --name="My Test Project" --old-history
+
+const fs = require('fs')
+const path = require('path')
+const _ = require('underscore')
+const parseArgs = require('minimist')
+const OError = require('@overleaf/o-error')
+const { waitForDb } = require('../app/src/infrastructure/mongodb')
+const { User } = require('../app/src/models/User')
+const ProjectCreationHandler = require('../app/src/Features/Project/ProjectCreationHandler')
+const ProjectEntityUpdateHandler = require('../app/src/Features/Project/ProjectEntityUpdateHandler')
+
+const argv = parseArgs(process.argv.slice(2), {
+  string: ['user-id', 'name'],
+  boolean: ['old-history'],
+  unknown: function (arg) {
+    console.error('unrecognised argument', arg)
+    process.exit(1)
+  },
+})
+
+console.log('argv', argv)
+
+const userId = argv['user-id']
+const projectName = argv.name || `Test Project ${new Date().toISOString()}`
+const oldHistory = argv['old-history']
+
+console.log('userId', userId)
+
+async function _createRootDoc(project, ownerId, docLines) {
+  try {
+    const { doc } = await ProjectEntityUpdateHandler.promises.addDoc(
+      project._id,
+      project.rootFolder[0]._id,
+      'main.tex',
+      docLines,
+      ownerId
+    )
+    await ProjectEntityUpdateHandler.promises.setRootDoc(project._id, doc._id)
+  } catch (error) {
+    throw OError.tag(error, 'error adding root doc when creating project')
+  }
+}
+
+async function _addDefaultExampleProjectFiles(ownerId, projectName, project) {
+  const mainDocLines = await _buildTemplate('main.tex', ownerId, projectName)
+  await _createRootDoc(project, ownerId, mainDocLines)
+
+  const referenceDocLines = await _buildTemplate(
+    'references.bib',
+    ownerId,
+    projectName
+  )
+  await ProjectEntityUpdateHandler.promises.addDoc(
+    project._id,
+    project.rootFolder[0]._id,
+    'references.bib',
+    referenceDocLines,
+    ownerId
+  )
+
+  const universePath = path.resolve(
+    __dirname + '/../app/templates/project_files/universe.jpg'
+  )
+  await ProjectEntityUpdateHandler.promises.addFile(
+    project._id,
+    project.rootFolder[0]._id,
+    'universe.jpg',
+    universePath,
+    null,
+    ownerId
+  )
+}
+
+async function _buildTemplate(templateName, userId, projectName) {
+  const user = await User.findById(userId, 'first_name last_name')
+
+  const templatePath = path.resolve(
+    __dirname + `/../app/templates/project_files/${templateName}`
+  )
+  const template = fs.readFileSync(templatePath)
+  const data = {
+    project_name: projectName,
+    user,
+    year: new Date().getUTCFullYear(),
+    month: new Date().getUTCMonth(),
+  }
+  const output = _.template(template.toString())(data)
+  return output.split('\n')
+}
+
+async function createProject() {
+  await waitForDb()
+  const user = await User.findById(userId)
+  console.log('Will create project')
+  console.log('user_id:', userId, '=>', user.email)
+  console.log('project name:', projectName)
+  const attributes = oldHistory ? { overleaf: {} } : {}
+  const project = await ProjectCreationHandler.promises.createBlankProject(
+    userId,
+    projectName,
+    attributes
+  )
+  await _addDefaultExampleProjectFiles(userId, projectName, project)
+  return project
+}
+
+createProject()
+  .then(project => {
+    console.log('Created project', project._id)
+    process.exit()
+  })
+  .catch(err => {
+    console.error(err)
+    process.exit(1)
+  })