From 22aad599bad89657ccf94616e77e172dea83e374 Mon Sep 17 00:00:00 2001 From: Jakob Ackermann Date: Mon, 12 Jul 2021 12:40:45 +0200 Subject: [PATCH] Merge pull request #4308 from overleaf/bg-allow-creating-projects-with-old-history add script to create projects with sharelatex history GitOrigin-RevId: bc5eae5d16cc65fca60b9155b35b7f5e2c663870 --- .../Project/ProjectCreationHandler.js | 5 +- services/web/scripts/create_project.js | 118 ++++++++++++++++++ 2 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 services/web/scripts/create_project.js diff --git a/services/web/app/src/Features/Project/ProjectCreationHandler.js b/services/web/app/src/Features/Project/ProjectCreationHandler.js index 8f9fd70286..3a0887fa26 100644 --- a/services/web/app/src/Features/Project/ProjectCreationHandler.js +++ b/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) { diff --git a/services/web/scripts/create_project.js b/services/web/scripts/create_project.js new file mode 100644 index 0000000000..0220c9ce9e --- /dev/null +++ b/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) + })