create_project.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // Script to create projects with sharelatex history for testing
  2. // Example:
  3. // node scripts/create_project.js --user-id=5dca84e11e71ae002ff73bd4 --name="My Test Project" --old-history
  4. const fs = require('fs')
  5. const path = require('path')
  6. const _ = require('underscore')
  7. const parseArgs = require('minimist')
  8. const OError = require('@overleaf/o-error')
  9. const { waitForDb } = require('../app/src/infrastructure/mongodb')
  10. const { User } = require('../app/src/models/User')
  11. const ProjectCreationHandler = require('../app/src/Features/Project/ProjectCreationHandler')
  12. const ProjectEntityUpdateHandler = require('../app/src/Features/Project/ProjectEntityUpdateHandler')
  13. const argv = parseArgs(process.argv.slice(2), {
  14. string: ['user-id', 'name'],
  15. boolean: ['old-history'],
  16. unknown: function (arg) {
  17. console.error('unrecognised argument', arg)
  18. process.exit(1)
  19. },
  20. })
  21. console.log('argv', argv)
  22. const userId = argv['user-id']
  23. const projectName = argv.name || `Test Project ${new Date().toISOString()}`
  24. const oldHistory = argv['old-history']
  25. console.log('userId', userId)
  26. async function _createRootDoc(project, ownerId, docLines) {
  27. try {
  28. const { doc } = await ProjectEntityUpdateHandler.promises.addDoc(
  29. project._id,
  30. project.rootFolder[0]._id,
  31. 'main.tex',
  32. docLines,
  33. ownerId,
  34. null
  35. )
  36. await ProjectEntityUpdateHandler.promises.setRootDoc(project._id, doc._id)
  37. } catch (error) {
  38. throw OError.tag(error, 'error adding root doc when creating project')
  39. }
  40. }
  41. async function _addDefaultExampleProjectFiles(ownerId, projectName, project) {
  42. const mainDocLines = await _buildTemplate(
  43. 'example-project/main.tex',
  44. ownerId,
  45. projectName
  46. )
  47. await _createRootDoc(project, ownerId, mainDocLines)
  48. const bibDocLines = await _buildTemplate(
  49. 'example-project/sample.bib',
  50. ownerId,
  51. projectName
  52. )
  53. await ProjectEntityUpdateHandler.promises.addDoc(
  54. project._id,
  55. project.rootFolder[0]._id,
  56. 'sample.bib',
  57. bibDocLines,
  58. ownerId,
  59. null
  60. )
  61. const frogPath = path.join(
  62. __dirname,
  63. '/../app/templates/project_files/example-project/frog.jpg'
  64. )
  65. await ProjectEntityUpdateHandler.promises.addFile(
  66. project._id,
  67. project.rootFolder[0]._id,
  68. 'frog.jpg',
  69. frogPath,
  70. null,
  71. ownerId,
  72. null
  73. )
  74. }
  75. async function _buildTemplate(templateName, userId, projectName) {
  76. const user = await User.findById(userId, 'first_name last_name')
  77. const templatePath = path.join(
  78. __dirname,
  79. `/../app/templates/project_files/${templateName}`
  80. )
  81. const template = fs.readFileSync(templatePath)
  82. const data = {
  83. project_name: projectName,
  84. user,
  85. year: new Date().getUTCFullYear(),
  86. month: new Date().getUTCMonth(),
  87. }
  88. const output = _.template(template.toString())(data)
  89. return output.split('\n')
  90. }
  91. async function createProject() {
  92. await waitForDb()
  93. const user = await User.findById(userId)
  94. console.log('Will create project')
  95. console.log('user_id:', userId, '=>', user.email)
  96. console.log('project name:', projectName)
  97. const attributes = oldHistory ? { overleaf: {} } : {}
  98. const project = await ProjectCreationHandler.promises.createBlankProject(
  99. userId,
  100. projectName,
  101. attributes
  102. )
  103. await _addDefaultExampleProjectFiles(userId, projectName, project)
  104. return project
  105. }
  106. createProject()
  107. .then(project => {
  108. console.log('Created project', project._id)
  109. process.exit()
  110. })
  111. .catch(err => {
  112. console.error(err)
  113. process.exit(1)
  114. })