overleaf/services/web/app/coffee/Features/ThirdPartyDataStore/TpdsUpdateSender.coffee

137 lines
5.5 KiB
CoffeeScript
Raw Normal View History

2014-02-12 05:23:40 -05:00
settings = require('settings-sharelatex')
logger = require('logger-sharelatex')
path = require('path')
Project = require('../../models/Project').Project
keys = require('../../infrastructure/Keys')
metrics = require("../../infrastructure/Metrics")
request = require("request")
CollaboratorsHandler = require('../Collaborators/CollaboratorsHandler')
2014-02-12 05:23:40 -05:00
buildPath = (user_id, project_name, filePath)->
projectPath = path.join(project_name, "/", filePath)
projectPath = encodeURIComponent(projectPath)
fullPath = path.join("/user/", "#{user_id}", "/entity/",projectPath)
return fullPath
tpdsworkerEnabled = -> settings.apis.tpdsworker?.url?
if !tpdsworkerEnabled()
logger.log "tpdsworker is not enabled, request will not be sent to it"
module.exports = TpdsUpdateSender =
_enqueue: (group, method, job, callback)->
if !tpdsworkerEnabled()
return callback()
opts =
2015-06-23 06:13:05 -04:00
uri:"#{settings.apis.tpdsworker.url}/enqueue/web_to_tpds_http_requests"
json :
group:group
method:method
job:job
method:"post"
timeout: (5 * 1000)
request opts, (err)->
if err?
logger.err err:err, "error queuing something in the tpdsworker"
callback(err)
else
logger.log group:group, "successfully queued up job for tpdsworker"
callback()
2014-10-15 09:11:02 -04:00
_addEntity: (options, callback = (err)->)->
2014-02-12 05:23:40 -05:00
getProjectsUsersIds options.project_id, (err, user_id, allUserIds)->
if err?
logger.err err:err, options:options, "error getting projects user ids"
return callback(err)
2014-10-15 09:11:02 -04:00
logger.log project_id: options.project_id, user_id:user_id, path: options.path, uri:options.uri, rev:options.rev, "sending file to third party data store"
2014-02-12 05:23:40 -05:00
postOptions =
method : "post"
2014-10-15 09:11:02 -04:00
headers:
2014-02-12 05:23:40 -05:00
sl_entity_rev:options.rev
sl_project_id:options.project_id
sl_all_user_ids:JSON.stringify(allUserIds)
uri : "#{settings.apis.thirdPartyDataStore.url}#{buildPath(user_id, options.project_name, options.path)}"
title: "addFile"
streamOrigin : options.streamOrigin
TpdsUpdateSender._enqueue options.project_id, "pipeStreamFrom", postOptions, (err)->
if err?
logger.err err:err, project_id: options.project_id, user_id:user_id, path: options.path, uri:options.uri, rev:options.rev, "error sending file to third party data store queued up for processing"
return callback(err)
2014-10-15 09:11:02 -04:00
logger.log project_id: options.project_id, user_id:user_id, path: options.path, uri:options.uri, rev:options.rev, "sending file to third party data store queued up for processing"
callback(err)
2014-10-15 09:11:02 -04:00
addFile : (options, callback = (err)->)->
metrics.inc("tpds.add-file")
options.streamOrigin = settings.apis.filestore.url + path.join("/project/#{options.project_id}/file/","#{options.file_id}")
2014-10-15 09:11:02 -04:00
@_addEntity(options, callback)
2014-02-12 05:23:40 -05:00
2014-10-15 09:11:02 -04:00
addDoc : (options, callback = (err)->)->
2014-02-12 05:23:40 -05:00
metrics.inc("tpds.add-doc")
options.streamOrigin = settings.apis.docstore.pubUrl + path.join("/project/#{options.project_id}/doc/","#{options.doc_id}/raw")
2014-10-15 09:11:02 -04:00
@_addEntity(options, callback)
2014-02-12 05:23:40 -05:00
  
2014-10-15 09:11:02 -04:00
moveEntity : (options, callback = (err)->)->
2014-02-12 05:23:40 -05:00
metrics.inc("tpds.move-entity")
if options.newProjectName?
startPath = path.join("/#{options.project_name}/")
endPath = path.join("/#{options.newProjectName}/")
else
startPath = mergeProjectNameAndPath(options.project_name, options.startPath)
endPath = mergeProjectNameAndPath(options.project_name, options.endPath)
getProjectsUsersIds options.project_id, (err, user_id, allUserIds)->
2014-10-15 09:11:02 -04:00
logger.log project_id: options.project_id, user_id:user_id, startPath:startPath, endPath:endPath, uri:options.uri, "moving entity in third party data store"
2014-02-12 05:23:40 -05:00
moveOptions =
method : "put"
title:"moveEntity"
uri : "#{settings.apis.thirdPartyDataStore.url}/user/#{user_id}/entity"
headers:
sl_project_id:options.project_id,
sl_entity_rev:options.rev
sl_all_user_ids:JSON.stringify(allUserIds)
json :
user_id : user_id
endPath: endPath
startPath: startPath
TpdsUpdateSender._enqueue options.project_id, "standardHttpRequest", moveOptions, callback
2014-02-12 05:23:40 -05:00
2014-10-15 09:11:02 -04:00
deleteEntity : (options, callback = (err)->)->
2014-02-12 05:23:40 -05:00
metrics.inc("tpds.delete-entity")
getProjectsUsersIds options.project_id, (err, user_id, allUserIds)->
2014-10-15 09:11:02 -04:00
logger.log project_id: options.project_id, user_id:user_id, path: options.path, uri:options.uri, "deleting entity in third party data store"
2014-02-12 05:23:40 -05:00
deleteOptions =
method : "DELETE"
2014-10-15 09:11:02 -04:00
headers:
2014-02-12 05:23:40 -05:00
sl_project_id:options.project_id
sl_all_user_ids:JSON.stringify(allUserIds)
uri : "#{settings.apis.thirdPartyDataStore.url}#{buildPath(user_id, options.project_name, options.path)}"
title:"deleteEntity"
sl_all_user_ids:JSON.stringify(allUserIds)
TpdsUpdateSender._enqueue options.project_id, "standardHttpRequest", deleteOptions, callback
2014-08-13 12:26:18 -04:00
pollDropboxForUser: (user_id, callback = (err) ->) ->
metrics.inc("tpds.poll-dropbox")
logger.log user_id: user_id, "polling dropbox for user"
options =
method: "POST"
uri:"#{settings.apis.thirdPartyDataStore.url}/user/poll"
json:
user_ids: [user_id]
TpdsUpdateSender._enqueue "poll-dropbox:#{user_id}", "standardHttpRequest", options, callback
2014-02-12 05:23:40 -05:00
getProjectsUsersIds = (project_id, callback = (err, owner_id, allUserIds)->)->
Project.findById project_id, "_id owner_ref", (err, project) ->
return callback(err) if err?
CollaboratorsHandler.getMemberIds project_id, (err, member_ids) ->
return callback(err) if err?
2016-03-15 10:15:25 -04:00
callback err, project?.owner_ref, member_ids
2014-02-12 05:23:40 -05:00
mergeProjectNameAndPath = (project_name, path)->
if(path.indexOf('/') == 0)
path = path.substring(1)
fullPath = "/#{project_name}/#{path}"
return fullPath