| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- /* eslint-disable
- camelcase,
- handle-callback-err,
- max-len,
- */
- // TODO: This file was created by bulk-decaffeinate.
- // Fix any style issues and re-enable lint.
- /*
- * decaffeinate suggestions:
- * DS102: Remove unnecessary code created because of implicit returns
- * DS207: Consider shorter variations of null checks
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
- let parseParams
- const tpdsUpdateHandler = require('./TpdsUpdateHandler')
- const UpdateMerger = require('./UpdateMerger')
- const logger = require('logger-sharelatex')
- const Path = require('path')
- const metrics = require('metrics-sharelatex')
- const NotificationsBuilder = require('../Notifications/NotificationsBuilder')
- const AuthenticationController = require('../Authentication/AuthenticationController')
- const TpdsQueueManager = require('./TpdsQueueManager').promises
- 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')
- const { filePath, user_id, projectName } = parseParams(req)
- const source = req.headers['x-sl-update-source'] || 'unknown'
- return tpdsUpdateHandler.newUpdate(
- user_id,
- projectName,
- filePath,
- req,
- source,
- function(err) {
- if (err != null) {
- if (err.name === 'TooManyRequestsError') {
- logger.warn(
- { err, user_id, filePath },
- 'tpds update failed to be processed, too many requests'
- )
- return res.sendStatus(429)
- } else if (err.name === 'ProjectIsArchivedOrTrashedError') {
- logger.info(
- { err, user_id, filePath, projectName },
- 'tpds project is archived'
- )
- return res.sendStatus(409)
- } else if (err.message === 'project_has_too_many_files') {
- logger.warn(
- { err, user_id, filePath },
- 'tpds trying to append to project over file limit'
- )
- NotificationsBuilder.tpdsFileLimit(user_id).create(projectName)
- return res.sendStatus(400)
- } else {
- logger.err(
- { err, user_id, filePath },
- 'error reciving update from tpds'
- )
- return res.sendStatus(500)
- }
- } else {
- return res.sendStatus(200)
- }
- }
- )
- },
- deleteUpdate(req, res) {
- metrics.inc('tpds.delete-update')
- const { filePath, user_id, projectName } = parseParams(req)
- const source = req.headers['x-sl-update-source'] || 'unknown'
- return tpdsUpdateHandler.deleteUpdate(
- user_id,
- projectName,
- filePath,
- source,
- function(err) {
- if (err != null) {
- logger.err(
- { err, user_id, filePath },
- 'error reciving update from tpds'
- )
- return res.sendStatus(500)
- } else {
- return 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) {
- if (next == null) {
- next = function(error) {}
- }
- const { project_id } = req.params
- const path = `/${req.params[0]}` // UpdateMerger expects leading slash
- const source = req.headers['x-sl-update-source'] || 'unknown'
- return UpdateMerger.mergeUpdate(
- null,
- project_id,
- path,
- req,
- source,
- function(error) {
- if (error != null) {
- return next(error)
- }
- return res.sendStatus(200)
- }
- )
- },
- deleteProjectContents(req, res, next) {
- if (next == null) {
- next = function(error) {}
- }
- const { project_id } = req.params
- const path = `/${req.params[0]}` // UpdateMerger expects leading slash
- const source = req.headers['x-sl-update-source'] || 'unknown'
- return UpdateMerger.deleteUpdate(null, project_id, path, source, function(
- error
- ) {
- if (error != null) {
- return next(error)
- }
- return res.sendStatus(200)
- })
- },
- async getQueues(req, res, next) {
- const userId = AuthenticationController.getLoggedInUserId(req)
- try {
- res.json(await TpdsQueueManager.getQueues(userId))
- } catch (err) {
- next(err)
- }
- },
- parseParams: (parseParams = function(req) {
- let filePath, projectName
- let path = req.params[0]
- const { user_id } = req.params
- 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, user_id, projectName }
- })
- }
|