2018-02-14 10:12:46 -05:00
|
|
|
AuthenticationController = require '../Authentication/AuthenticationController'
|
|
|
|
EditorController = require '../Editor/EditorController'
|
2018-06-01 10:16:27 -04:00
|
|
|
ProjectLocator = require '../Project/ProjectLocator'
|
2018-03-01 05:17:12 -05:00
|
|
|
Settings = require 'settings-sharelatex'
|
|
|
|
logger = require 'logger-sharelatex'
|
2018-06-01 10:16:27 -04:00
|
|
|
_ = require 'underscore'
|
2018-02-14 10:12:46 -05:00
|
|
|
|
|
|
|
module.exports = LinkedFilesController = {
|
|
|
|
Agents: {
|
2018-05-03 09:29:03 -04:00
|
|
|
url: require('./UrlAgent'),
|
2018-06-08 10:33:02 -04:00
|
|
|
project_file: require('./ProjectFileAgent'),
|
|
|
|
project_output_file: require('./ProjectOutputFileAgent')
|
2018-02-14 10:12:46 -05:00
|
|
|
}
|
|
|
|
|
2018-06-01 10:16:27 -04:00
|
|
|
_getAgent: (provider) ->
|
|
|
|
if !LinkedFilesController.Agents.hasOwnProperty(provider)
|
|
|
|
return null
|
|
|
|
unless provider in Settings.enabledLinkedFileTypes
|
|
|
|
return null
|
|
|
|
LinkedFilesController.Agents[provider]
|
|
|
|
|
|
|
|
_getFileById: (project_id, file_id, callback=(err, file)->) ->
|
|
|
|
ProjectLocator.findElement {
|
|
|
|
project_id,
|
|
|
|
element_id: file_id,
|
|
|
|
type: 'file'
|
|
|
|
}, (err, file, path, parentFolder) ->
|
|
|
|
return callback(err) if err?
|
|
|
|
callback(null, file, path, parentFolder)
|
|
|
|
|
2018-02-14 10:12:46 -05:00
|
|
|
createLinkedFile: (req, res, next) ->
|
|
|
|
{project_id} = req.params
|
|
|
|
{name, provider, data, parent_folder_id} = req.body
|
|
|
|
user_id = AuthenticationController.getLoggedInUserId(req)
|
2018-03-01 05:17:12 -05:00
|
|
|
logger.log {project_id, name, provider, data, parent_folder_id, user_id}, 'create linked file request'
|
2018-02-14 10:12:46 -05:00
|
|
|
|
2018-06-01 10:16:27 -04:00
|
|
|
Agent = LinkedFilesController._getAgent(provider)
|
|
|
|
if !Agent?
|
|
|
|
return res.sendStatus(400)
|
2018-02-14 10:12:46 -05:00
|
|
|
|
|
|
|
linkedFileData = Agent.sanitizeData(data)
|
|
|
|
linkedFileData.provider = provider
|
2018-06-01 10:16:27 -04:00
|
|
|
|
|
|
|
if !Agent.canCreate(linkedFileData)
|
|
|
|
return res.status(403).send('Cannot create linked file')
|
|
|
|
|
|
|
|
LinkedFilesController._doImport(
|
|
|
|
req, res, next, Agent, project_id, user_id,
|
|
|
|
parent_folder_id, name, linkedFileData
|
|
|
|
)
|
|
|
|
|
|
|
|
refreshLinkedFile: (req, res, next) ->
|
|
|
|
{project_id, file_id} = req.params
|
|
|
|
user_id = AuthenticationController.getLoggedInUserId(req)
|
|
|
|
logger.log {project_id, file_id, user_id}, 'refresh linked file request'
|
|
|
|
|
|
|
|
LinkedFilesController._getFileById project_id, file_id, (err, file, path, parentFolder) ->
|
|
|
|
return next(err) if err?
|
|
|
|
return res.sendStatus(404) if !file?
|
|
|
|
name = file.name
|
|
|
|
linkedFileData = file.linkedFileData
|
|
|
|
if !linkedFileData? || !linkedFileData?.provider?
|
|
|
|
return res.send(409)
|
|
|
|
provider = linkedFileData.provider
|
|
|
|
parent_folder_id = parentFolder._id
|
|
|
|
Agent = LinkedFilesController._getAgent(provider)
|
|
|
|
if !Agent?
|
|
|
|
return res.sendStatus(400)
|
|
|
|
LinkedFilesController._doImport(
|
|
|
|
req, res, next, Agent, project_id, user_id,
|
|
|
|
parent_folder_id, name, linkedFileData
|
|
|
|
)
|
|
|
|
|
|
|
|
_doImport: (req, res, next, Agent, project_id, user_id, parent_folder_id, name, linkedFileData) ->
|
2018-05-29 05:05:50 -04:00
|
|
|
Agent.checkAuth project_id, linkedFileData, user_id, (err, allowed) ->
|
2018-05-25 11:01:11 -04:00
|
|
|
return Agent.handleError(err, req, res, next) if err?
|
|
|
|
return res.sendStatus(403) if !allowed
|
2018-05-29 05:07:31 -04:00
|
|
|
Agent.decorateLinkedFileData linkedFileData, (err, newLinkedFileData) ->
|
|
|
|
return Agent.handleError(err) if err?
|
|
|
|
linkedFileData = newLinkedFileData
|
2018-06-01 10:16:27 -04:00
|
|
|
Agent.writeIncomingFileToDisk project_id,
|
|
|
|
linkedFileData,
|
|
|
|
user_id,
|
|
|
|
(error, fsPath) ->
|
|
|
|
if error?
|
|
|
|
logger.error(
|
|
|
|
{err: error, project_id, name, linkedFileData, parent_folder_id, user_id},
|
|
|
|
'error writing linked file to disk'
|
|
|
|
)
|
|
|
|
return Agent.handleError(error, req, res, next)
|
|
|
|
EditorController.upsertFile project_id,
|
|
|
|
parent_folder_id,
|
|
|
|
name,
|
|
|
|
fsPath,
|
|
|
|
linkedFileData,
|
|
|
|
"upload",
|
|
|
|
user_id,
|
|
|
|
(error, file) ->
|
|
|
|
return next(error) if error?
|
|
|
|
res.json(new_file_id: file._id) # created
|
|
|
|
|
2018-05-29 05:07:31 -04:00
|
|
|
}
|