From 7b6ec86cef8e281a9e0674838d47ac6e7397102c Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 6 Nov 2014 12:41:00 +0000 Subject: [PATCH] Access Dropbox status via HTTP end points --- .../Dropbox/DropboxProjectController.coffee | 12 ++++++ .../Features/Dropbox/DropboxRouter.coffee | 3 ++ .../controllers/DropboxController.coffee | 13 +++--- .../DropboxProjectControllerTests.coffee | 41 +++++++++++++++++++ 4 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 services/web/app/coffee/Features/Dropbox/DropboxProjectController.coffee create mode 100644 services/web/test/UnitTests/coffee/Dropbox/DropboxProjectControllerTests.coffee diff --git a/services/web/app/coffee/Features/Dropbox/DropboxProjectController.coffee b/services/web/app/coffee/Features/Dropbox/DropboxProjectController.coffee new file mode 100644 index 0000000000..0c6e804dbe --- /dev/null +++ b/services/web/app/coffee/Features/Dropbox/DropboxProjectController.coffee @@ -0,0 +1,12 @@ +DropboxHandler = require "./DropboxHandler" +ProjectGetter = require "../Project/ProjectGetter" + +module.exports = DropboxProjectController = + getStatus: (req, res, next) -> + project_id = req.params.Project_id + ProjectGetter.getProject project_id, {owner_ref: 1}, (error, project) -> + return next(error) if error? + DropboxHandler.getUserRegistrationStatus project.owner_ref, (error, status) -> + return next(error) if error? + res.json status + \ No newline at end of file diff --git a/services/web/app/coffee/Features/Dropbox/DropboxRouter.coffee b/services/web/app/coffee/Features/Dropbox/DropboxRouter.coffee index 68d8365d5e..91361685cd 100644 --- a/services/web/app/coffee/Features/Dropbox/DropboxRouter.coffee +++ b/services/web/app/coffee/Features/Dropbox/DropboxRouter.coffee @@ -1,5 +1,7 @@ DropboxUserController = require './DropboxUserController' DropboxWebhookController = require './DropboxWebhookController' +DropboxProjectController = require "./DropboxProjectController" +SecurityManager = require "../../managers/SecurityManager" module.exports = apply: (app) -> @@ -11,5 +13,6 @@ module.exports = app.post '/dropbox/webhook', DropboxWebhookController.webhook app.ignoreCsrf('post', '/dropbox/webhook') + app.get '/project/:Project_id/dropbox/status', SecurityManager.requestIsOwner, DropboxProjectController.getStatus diff --git a/services/web/public/coffee/ide/dropbox/controllers/DropboxController.coffee b/services/web/public/coffee/ide/dropbox/controllers/DropboxController.coffee index f5186f67f5..863b8a119f 100644 --- a/services/web/public/coffee/ide/dropbox/controllers/DropboxController.coffee +++ b/services/web/public/coffee/ide/dropbox/controllers/DropboxController.coffee @@ -22,17 +22,18 @@ define [ scope:$scope } - App.controller "DropboxModalController", ($scope, $modalInstance, ide, $timeout) -> + App.controller "DropboxModalController", ($scope, $modalInstance, ide, $timeout, $http) -> user_id = ide.$scope.user.id $scope.dbState = cachedState $scope.dbState.hasDropboxFeature = $scope.project.features.dropbox - ide.socket.emit "getUserDropboxLinkStatus", user_id, (err, status)=> - $scope.dbState.gotLinkStatus = true - if status.registered - $scope.dbState.userIsLinkedToDropbox = true - cachedState = $scope.dbState + $http.get("/project/#{ide.project_id}/dropbox/status") + .success (status) -> + $scope.dbState.gotLinkStatus = true + if status.registered + $scope.dbState.userIsLinkedToDropbox = true + cachedState = $scope.dbState $scope.linkToDropbox = -> window.open("/user/settings#dropboxSettings") diff --git a/services/web/test/UnitTests/coffee/Dropbox/DropboxProjectControllerTests.coffee b/services/web/test/UnitTests/coffee/Dropbox/DropboxProjectControllerTests.coffee new file mode 100644 index 0000000000..d230fff0ac --- /dev/null +++ b/services/web/test/UnitTests/coffee/Dropbox/DropboxProjectControllerTests.coffee @@ -0,0 +1,41 @@ +SandboxedModule = require('sandboxed-module') +assert = require('assert') +require('chai').should() +sinon = require('sinon') +modulePath = require('path').join __dirname, '../../../../app/js/Features/Dropbox/DropboxProjectController.js' + +describe 'DropboxProjectController', -> + beforeEach -> + @DropboxProjectController = SandboxedModule.require modulePath, requires: + './DropboxHandler': @DropboxHandler = {} + '../Project/ProjectGetter': @ProjectGetter = {} + 'logger-sharelatex': + log:-> + err:-> + + @project_id = "project-id-123" + @user_id = "user-id-123" + @req = {} + @res = + json: sinon.stub() + + describe "getStatus", -> + beforeEach -> + @req.params = + Project_id: @project_id + @ProjectGetter.getProject = sinon.stub().callsArgWith(2, null, { owner_ref: @user_id }) + @DropboxHandler.getUserRegistrationStatus = sinon.stub().callsArgWith(1, null, @status = {"mock": "status"}) + @DropboxProjectController.getStatus @req, @res + + it "should look up the project owner", -> + @ProjectGetter.getProject + .calledWith(@project_id, {owner_ref: 1}) + .should.equal true + + it "should get the owner's Dropbox status", -> + @DropboxHandler.getUserRegistrationStatus + .calledWith(@user_id) + .should.equal true + + it "should send the status to the client", -> + @res.json.calledWith(@status).should.equal true