ProjectDeleter.coffee 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. Project = require('../../models/Project').Project
  2. logger = require('logger-sharelatex')
  3. documentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler')
  4. tagsHandler = require("../Tags/TagsHandler")
  5. async = require("async")
  6. FileStoreHandler = require("../FileStore/FileStoreHandler")
  7. CollaboratorsHandler = require("../Collaborators/CollaboratorsHandler")
  8. {db, ObjectId} = require("../../infrastructure/mongojs")
  9. module.exports = ProjectDeleter =
  10. markAsDeletedByExternalSource : (project_id, callback = (error) ->)->
  11. logger.log project_id:project_id, "marking project as deleted by external data source"
  12. conditions = {_id:project_id}
  13. update = {deletedByExternalDataSource:true}
  14. Project.update conditions, update, {}, (err)->
  15. require('../Editor/EditorController').notifyUsersProjectHasBeenDeletedOrRenamed project_id, ->
  16. callback()
  17. unmarkAsDeletedByExternalSource: (project_id, callback = (error) ->) ->
  18. logger.log project_id: project_id, "removing flag marking project as deleted by external data source"
  19. conditions = {_id:project_id.toString()}
  20. update = {deletedByExternalDataSource: false}
  21. Project.update conditions, update, {}, callback
  22. deleteUsersProjects: (user_id, callback)->
  23. logger.log {user_id}, "deleting users projects"
  24. ProjectDeleter._deleteUsersProjectWithMethod user_id, ProjectDeleter.deleteProject, callback
  25. softDeleteUsersProjectsForMigration: (user_id, callback)->
  26. logger.log {user_id}, "soft-deleting users projects"
  27. ProjectDeleter._deleteUsersProjectWithMethod user_id, ProjectDeleter.softDeleteProjectForMigration, callback
  28. _deleteUsersProjectWithMethod: (user_id, deleteMethod, callback) ->
  29. Project.find {owner_ref: user_id}, (error, projects) ->
  30. return callback(error) if error?
  31. async.each(
  32. projects,
  33. (project, cb) ->
  34. deleteMethod project._id, cb
  35. (err) ->
  36. return callback(err) if err?
  37. CollaboratorsHandler.removeUserFromAllProjets user_id, callback
  38. )
  39. softDeleteProjectForMigration: (project_id, callback) ->
  40. logger.log project_id: project_id, "soft-deleting project"
  41. async.waterfall [
  42. (cb) ->
  43. Project.findOne {_id: project_id}, (err, project) -> cb(err, project)
  44. (project, cb) ->
  45. return callback(new Errors.NotFoundError("project not found")) unless project?
  46. project.deletedAt = new Date()
  47. db.projectsDeletedByMigration.insert project, (err) -> cb(err)
  48. (cb) ->
  49. ProjectDeleter.deleteProject project_id, cb
  50. ], callback
  51. deleteProject: (project_id, callback = (error) ->) ->
  52. logger.log project_id: project_id, "deleting project"
  53. async.series [
  54. (cb)->
  55. documentUpdaterHandler.flushProjectToMongoAndDelete project_id, cb
  56. (cb)->
  57. CollaboratorsHandler.getMemberIds project_id, (error, member_ids = []) ->
  58. for member_id in member_ids
  59. tagsHandler.removeProjectFromAllTags member_id, project_id, (err)->
  60. cb() #doesn't matter if this fails or the order it happens in
  61. (cb) ->
  62. Project.remove _id: project_id, cb
  63. ], (err) ->
  64. if err?
  65. logger.err err:err, "problem deleting project"
  66. return callback(err)
  67. logger.log project_id:project_id, "successfully deleting project from user request"
  68. callback()
  69. archiveProject: (project_id, callback = (error) ->)->
  70. logger.log project_id:project_id, "archived project from user request"
  71. Project.update {_id:project_id}, { $set: { archived: true }}, (err)->
  72. if err?
  73. logger.err err:err, "problem archived project"
  74. return callback(err)
  75. logger.log project_id:project_id, "successfully archived project from user request"
  76. callback()
  77. restoreProject: (project_id, callback = (error) ->) ->
  78. Project.update {_id:project_id}, { $unset: { archived: true }}, callback