Kaynağa Gözat

Access Dropbox status via HTTP end points

James Allen 12 yıl önce
ebeveyn
işleme
7b6ec86cef

+ 12 - 0
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
+	

+ 3 - 0
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
 
 

+ 7 - 6
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")

+ 41 - 0
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