This commit is contained in:
Henry Oswald
2014-10-16 16:34:25 +01:00
15 changed files with 64 additions and 48 deletions
@@ -123,8 +123,7 @@ module.exports = DocumentUpdaterHandler =
url: url
json:
lines: docLines
headers:
"x-sl-update-source": source
source: source
logger.log project_id:project_id, doc_id: doc_id, source: source, "setting doc in document updater"
request.post body, (error, res, body)->
timer.done()
@@ -184,9 +184,9 @@ module.exports = EditorController =
replaceFile: (project_id, file_id, fsPath, source, callback = (error) ->)->
ProjectEntityHandler.replaceFile project_id, file_id, fsPath, callback
addFolder: (project_id, folder_id, folderName, callback = (error, folder)->)->
addFolder: (project_id, folder_id, folderName, source, callback = (error, folder)->)->
folderName = folderName.trim()
logger.log {project_id, folder_id, folderName}, "sending new folder to project"
logger.log {project_id, folder_id, folderName, source}, "sending new folder to project"
Metrics.inc "editor.add-folder"
ProjectEntityHandler.addFolder project_id, folder_id, folderName, (err, folder, folder_id)=>
@p.notifyProjectUsersOfNewFolder project_id, folder_id, folder, (error) ->
@@ -33,7 +33,7 @@ module.exports = EditorHttpController =
project_id = req.params.Project_id
name = req.body.name
parent_folder_id = req.body.parent_folder_id
EditorController.addFolder project_id, parent_folder_id, name, (error, doc) ->
EditorController.addFolder project_id, parent_folder_id, name, "editor", (error, doc) ->
return next(error) if error?
res.json doc
@@ -11,15 +11,19 @@ templates.welcome =
layout: PersonalEmailLayout
type:"lifecycle"
compiledTemplate: _.template '''
Hi <%= first_name %>, thanks for signing up to ShareLaTeX. If you ever get lost, you can log in again <a href="<%= siteUrl %>/login">here</a>.
<p>
Im the co-founder of ShareLaTeX and I love talking to our users about our service. Please feel free to get in touch by replying to this email and I will get back to you within a day.
<p>Hi <%= first_name %>,</p>
<p>Thanks for signing up to ShareLaTeX! If you ever get lost, you can log in again <a href="<%= siteUrl %>/login">here</a>.</p>
<p>If you're new to LaTeX, take a look at our <a href="<%= siteUrl %>/learn">Help Guides</a> and <a href="<%= siteUrl %>/templates">Templates</a>.</p>
<p>
Regards, <br>
Henry <br>
ShareLaTeX Co-founder
</p>
<p>PS. We love talking to our users about ShareLaTeX. Reply to this email to get in touch us with us directly, whatever the reason. Questions, comments, problems, suggestions, all welcome!<p>
'''
templates.canceledSubscription =
@@ -27,15 +31,16 @@ templates.canceledSubscription =
layout: PersonalEmailLayout
type:"lifecycle"
compiledTemplate: _.template '''
Hi <%= first_name %>,
<p>Hi <%= first_name %>,</p>
I am sorry to see you cancelled your premium account. I wondered if you would mind giving me some advice on what the site is lacking at the moment? Criticism from our users about what is missing is the best thing for us to help improve the tool.
<p>I'm sorry to see you cancelled your ShareLaTeX premium account. Would you mind giving me some advice on what the site is lacking at the moment? Feedback from our users is the only way we can improve ShareLaTeX.</p>
Thank you in advance.
<p>Thank you in advance.</p>
<p>
Henry <br>
ShareLaTeX Co-founder
</p>
'''
templates.passwordResetRequested =
@@ -10,7 +10,7 @@ module.exports = _.template '''
<meta property="og:title" />
</head>
<body leftmargin="0" marginwidth="0" topmargin="0" marginheight="0" offset="0">
<body>
<%= body %>
</body>
</html>
@@ -8,8 +8,9 @@ module.exports =
mergeUpdate: (req, res)->
metrics.inc("tpds.merge-update")
{filePath, user_id, projectName} = parseParams(req)
logger.log user_id:user_id, filePath:filePath, fullPath:req.params[0], projectName:projectName, "reciving update request from tpds"
tpdsUpdateHandler.newUpdate user_id, projectName, filePath, req, (err)->
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"
@@ -23,8 +24,9 @@ module.exports =
deleteUpdate: (req, res)->
metrics.inc("tpds.delete-update")
{filePath, user_id, projectName} = parseParams(req)
logger.log user_id:user_id, filePath:filePath, projectName:projectName, fullPath:req.params[0], "reciving delete request from tpds"
tpdsUpdateHandler.deleteUpdate user_id, projectName, filePath, (err)->
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.send(500)
@@ -36,7 +38,7 @@ module.exports =
updateProjectContents: (req, res, next = (error) ->) ->
{project_id} = req.params
path = "/" + req.params[0] # UpdateMerger expects leading slash
source = req.headers["x-sl-update-source"]
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 project_id, path, req, source, (error) ->
return next(error) if error?
@@ -46,7 +48,7 @@ module.exports =
deleteProjectContents: (req, res, next = (error) ->) ->
{project_id} = req.params
path = "/" + req.params[0] # UpdateMerger expects leading slash
source = req.headers["x-sl-update-source"]
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 project_id, path, source, (error) ->
return next(error) if error?
@@ -9,7 +9,7 @@ commitMessage = "Before update from Dropbox"
module.exports =
newUpdate: (user_id, projectName, path, updateRequest, callback)->
newUpdate: (user_id, projectName, path, updateRequest, source, callback)->
getOrCreateProject = (cb)=>
projectLocator.findUsersProjectByName user_id, projectName, (err, project)=>
logger.log user_id:user_id, filePath:path, projectName:projectName, "handling new update from tpds"
@@ -22,11 +22,11 @@ module.exports =
else
cb err, project
getOrCreateProject (err, project)->
updateMerger.mergeUpdate project._id, path, updateRequest, (err)->
updateMerger.mergeUpdate project._id, path, updateRequest, source, (err)->
callback(err)
deleteUpdate: (user_id, projectName, path, callback)->
deleteUpdate: (user_id, projectName, path, source, callback)->
logger.log user_id:user_id, filePath:path, "handling delete update from tpds"
projectLocator.findUsersProjectByName user_id, projectName, (err, project)->
if !project?
@@ -36,7 +36,7 @@ module.exports =
logger.log user_id:user_id, filePath:path, projectName:projectName, project_id:project._id, "project found for delete update, path is root so marking project as deleted"
return projectDeleter.markAsDeletedByExternalSource project._id, callback
else
updateMerger.deleteUpdate project._id, path, (err)->
updateMerger.deleteUpdate project._id, path, source, (err)->
callback(err)
@@ -210,10 +210,10 @@ define [
_bindToShareJsDocEvents: () ->
@doc.on "error", (error, meta) => @_onError error, meta
@doc.on "externalUpdate", () =>
@doc.on "externalUpdate", (update) =>
@ide.pushEvent "externalUpdate",
doc_id: @doc_id
@trigger "externalUpdate"
@trigger "externalUpdate", update
@doc.on "remoteop", () =>
@ide.pushEvent "remoteop",
doc_id: @doc_id
@@ -84,7 +84,8 @@ define [
"Sorry, this file has gone out of sync and we need to do a full refresh. Please let us know if this happens frequently."
)
sharejs_doc.on "externalUpdate", () =>
sharejs_doc.on "externalUpdate", (update) =>
return if @_ignoreExternalUpdates
@ide.showGenericMessageModal(
"Document Updated Externally"
"This document was just updated externally. Any recent changes you have made may have been overwritten. To see previous versions please look in the history."
@@ -98,3 +99,9 @@ define [
getCurrentDocId: () ->
@$scope.editor.open_doc_id
startIgnoringExternalUpdates: () ->
@_ignoreExternalUpdates = true
stopIgnoringExternalUpdates: () ->
@_ignoreExternalUpdates = false
@@ -57,7 +57,7 @@ define [
@_handleError(error)
if message?.meta?.type == "external"
@trigger "externalUpdate"
@trigger "externalUpdate", message
catchUp: (updates) ->
for update, i in updates
@@ -227,8 +227,7 @@ describe 'Flushing documents :', ->
url: url
json:
lines: @lines
headers:
"x-sl-update-source": @source
source: @source
})
.should.equal true
@@ -526,7 +526,7 @@ describe "EditorController", ->
it 'should add the folder using the project entity handler', (done)->
mock = sinon.mock(@ProjectEntityHandler).expects("addFolder").withArgs(@project_id, @folder_id, @folderName).callsArg(3)
@EditorController.addFolder @project_id, @folder_id, @folderName, ->
@EditorController.addFolder @project_id, @folder_id, @folderName, @source, ->
mock.verify()
done()
@@ -534,7 +534,7 @@ describe "EditorController", ->
@ProjectEntityHandler.addFolder = (project_id, folder_id, folderName, callback)=> callback(null, @folder, @folder_id)
mock = sinon.mock(@EditorController.p).expects('notifyProjectUsersOfNewFolder').withArgs(@project_id, @folder_id, @folder).callsArg(3)
@EditorController.addFolder @project_id, @folder_id, @folderName, ->
@EditorController.addFolder @project_id, @folder_id, @folderName, @source, ->
mock.verify()
done()
@@ -547,7 +547,7 @@ describe "EditorController", ->
it 'should return the folder in the callback', (done) ->
@ProjectEntityHandler.addFolder = (project_id, folder_id, folderName, callback)=> callback(null, @folder, @folder_id)
@EditorController.addFolder @project_id, @folder_id, @folderName, (error, folder) =>
@EditorController.addFolder @project_id, @folder_id, @folderName, @source, (error, folder) =>
folder.should.equal @folder
done()
@@ -76,12 +76,12 @@ describe "EditorHttpController", ->
@req.body =
name: @name = "folder-name"
parent_folder_id: @parent_folder_id
@EditorController.addFolder = sinon.stub().callsArgWith(3, null, @folder)
@EditorController.addFolder = sinon.stub().callsArgWith(4, null, @folder)
@EditorHttpController.addFolder @req, @res
it "should call EditorController.addFolder", ->
@EditorController.addFolder
.calledWith(@project_id, @parent_folder_id, @name)
.calledWith(@project_id, @parent_folder_id, @name, "editor")
.should.equal true
it "should send the folder back as JSON", ->
@@ -25,9 +25,11 @@ describe 'TpdsController', ->
params:{0:path, "user_id":@user_id}
session:
destroy:->
@TpdsUpdateHandler.newUpdate = sinon.stub().callsArg(4)
headers:
"x-sl-update-source": @source = "dropbox"
@TpdsUpdateHandler.newUpdate = sinon.stub().callsArg(5)
res = send: =>
@TpdsUpdateHandler.newUpdate.calledWith(@user_id, "projectName","/here.txt", req).should.equal true
@TpdsUpdateHandler.newUpdate.calledWith(@user_id, "projectName","/here.txt", req, @source).should.equal true
done()
@TpdsController.mergeUpdate req, res
@@ -38,9 +40,11 @@ describe 'TpdsController', ->
params:{0:path, "user_id":@user_id}
session:
destroy:->
@TpdsUpdateHandler.deleteUpdate = sinon.stub().callsArg(3)
headers:
"x-sl-update-source": @source = "dropbox"
@TpdsUpdateHandler.deleteUpdate = sinon.stub().callsArg(4)
res = send: =>
@TpdsUpdateHandler.deleteUpdate.calledWith(@user_id, "projectName", "/here.txt").should.equal true
@TpdsUpdateHandler.deleteUpdate.calledWith(@user_id, "projectName", "/here.txt", @source).should.equal true
done()
@TpdsController.deleteUpdate req, res
@@ -7,8 +7,8 @@ describe 'TpdsUpdateHandler', ->
beforeEach ->
@requestQueuer = {}
@updateMerger =
deleteUpdate: (user_id, path, cb)->cb()
mergeUpdate:(user_id, path, update, cb)->cb()
deleteUpdate: (user_id, path, source, cb)->cb()
mergeUpdate:(user_id, path, update, source, cb)->cb()
@editorController = {}
@project_id = "dsjajilknaksdn"
@project = {_id:@project_id, name:"projectNameHere"}
@@ -33,15 +33,15 @@ describe 'TpdsUpdateHandler', ->
path = "/path/here"
update = {}
@updateMerger.mergeUpdate = sinon.stub()
@updateMerger.mergeUpdate.withArgs(@project_id, path, update).callsArg(3)
@handler.newUpdate @user_id, @project.name, path, update, =>
@updateMerger.mergeUpdate.withArgs(@project_id, path, update, @source).callsArg(4)
@handler.newUpdate @user_id, @project.name, path, update, @source, =>
@projectCreationHandler.createBlankProject.called.should.equal false
done()
it 'should create a new project if one does not already exit', (done)->
@projectLocator.findUsersProjectByName = sinon.stub().callsArgWith(2)
path = "/"
@handler.newUpdate @user_id, @project.name, path, {}, =>
@handler.newUpdate @user_id, @project.name, path, {}, @source, =>
@projectCreationHandler.createBlankProject.calledWith(@user_id, @project.name).should.equal true
done()
@@ -49,7 +49,7 @@ describe 'TpdsUpdateHandler', ->
@projectLocator.findUsersProjectByName = sinon.stub().callsArgWith(2)
@handler._rootDocTimeoutLength = 0
path = "/"
@handler.newUpdate @user_id, @project.name, path, {}, =>
@handler.newUpdate @user_id, @project.name, path, {}, @source, =>
setTimeout (=>
@rootDocManager.setRootDocAutomatically.calledWith(@project._id).should.equal true
done()
@@ -61,16 +61,16 @@ describe 'TpdsUpdateHandler', ->
it 'should call deleteEntity in the collaberation manager', (done)->
path = "/delete/this"
update = {}
@updateMerger.deleteUpdate = sinon.stub().callsArg(2)
@updateMerger.deleteUpdate = sinon.stub().callsArg(3)
@handler.deleteUpdate @user_id, @project.name, path, =>
@handler.deleteUpdate @user_id, @project.name, path, @source, =>
@projectDeleter.markAsDeletedByExternalSource.calledWith(@project._id).should.equal false
@updateMerger.deleteUpdate.calledWith(@project_id, path).should.equal true
@updateMerger.deleteUpdate.calledWith(@project_id, path, @source).should.equal true
done()
it 'should mark the project as deleted by external source if path is a single slash', (done)->
path = "/"
@handler.deleteUpdate @user_id, @project.name, path, =>
@handler.deleteUpdate @user_id, @project.name, path, @source, =>
@projectDeleter.markAsDeletedByExternalSource.calledWith(@project._id).should.equal true
done()