// 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, null ) 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( 'example-project/main.tex', ownerId, projectName ) await _createRootDoc(project, ownerId, mainDocLines) const bibDocLines = await _buildTemplate( 'example-project/sample.bib', ownerId, projectName ) await ProjectEntityUpdateHandler.promises.addDoc( project._id, project.rootFolder[0]._id, 'sample.bib', bibDocLines, ownerId, null ) const frogPath = path.join( __dirname, '/../app/templates/project_files/example-project/frog.jpg' ) await ProjectEntityUpdateHandler.promises.addFile( project._id, project.rootFolder[0]._id, 'frog.jpg', frogPath, null, ownerId, null ) } async function _buildTemplate(templateName, userId, projectName) { const user = await User.findById(userId, 'first_name last_name') const templatePath = path.join( __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) })