tpdsUpdateHandler = require('./TpdsUpdateHandler') UpdateMerger = require "./UpdateMerger" logger = require('logger-sharelatex') Path = require('path') metrics = require("metrics-sharelatex") module.exports = # mergeUpdate and deleteUpdate are used by Dropbox, where the project is only passed as the name, as the # first part of the file path. They have to check the project exists, find it, and create it if not. # They also ignore 'noisy' files like .DS_Store, .gitignore, etc. mergeUpdate: (req, res)-> metrics.inc("tpds.merge-update") {filePath, user_id, projectName} = parseParams(req) source = req.headers["x-sl-update-source"] or "unknown" logger.log user_id:user_id, filePath:filePath, fullPath:req.params[0], projectName:projectName, source: source, "reciving update request from tpds" tpdsUpdateHandler.newUpdate user_id, projectName, filePath, req, source, (err)-> logger.log user_id:user_id, filePath:filePath, fullPath:req.params[0], "sending response that tpdsUpdate has been completed" if err? logger.err err:err, user_id:user_id, filePath:filePath, "error reciving update from tpds" res.sendStatus(500) else logger.log user_id:user_id, filePath:filePath, projectName:projectName, "telling tpds update has been processed" res.sendStatus 200 deleteUpdate: (req, res)-> metrics.inc("tpds.delete-update") {filePath, user_id, projectName} = parseParams(req) source = req.headers["x-sl-update-source"] or "unknown" logger.log user_id:user_id, filePath:filePath, projectName:projectName, fullPath:req.params[0], source: source, "reciving delete request from tpds" tpdsUpdateHandler.deleteUpdate user_id, projectName, filePath, source, (err)-> if err? logger.err err:err, user_id:user_id, filePath:filePath, "error reciving update from tpds" res.sendStatus(500) else logger.log user_id:user_id, filePath:filePath, projectName:projectName, "telling tpds delete has been processed" res.sendStatus 200 # updateProjectContents and deleteProjectContents are used by GitHub. The project_id is known so we # can skip right ahead to creating/updating/deleting the file. These methods will not ignore noisy # files like .DS_Store, .gitignore, etc because people are generally more explicit with the files they # want in git. updateProjectContents: (req, res, next = (error) ->) -> {project_id} = req.params path = "/" + req.params[0] # UpdateMerger expects leading slash source = req.headers["x-sl-update-source"] or "unknown" logger.log project_id: project_id, path: path, source: source, "received project contents update" UpdateMerger.mergeUpdate null, project_id, path, req, source, (error) -> return next(error) if error? res.sendStatus(200) deleteProjectContents: (req, res, next = (error) ->) -> {project_id} = req.params path = "/" + req.params[0] # UpdateMerger expects leading slash source = req.headers["x-sl-update-source"] or "unknown" logger.log project_id: project_id, path: path, source: source, "received project contents delete request" UpdateMerger.deleteUpdate null, project_id, path, source, (error) -> return next(error) if error? res.sendStatus(200) parseParams: parseParams = (req)-> path = req.params[0] user_id = req.params.user_id path = Path.join("/",path) if path.substring(1).indexOf('/') == -1 filePath = "/" projectName = path.substring(1) else filePath = path.substring(path.indexOf("/",1)) projectName = path.substring(0, path.indexOf("/",1)) projectName = projectName.replace("/","") return filePath:filePath, user_id:user_id, projectName:projectName