From 14ff0cb2626d8453ed68f5ac86e3f5537d067726 Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 11:52:52 -0700 Subject: [PATCH 01/16] Add shared_folder_id and parent_shared_folder_id to FolderMetadata --- lib/dropbox/metadata.rb | 4 +++- test/test_metadata.rb | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/dropbox/metadata.rb b/lib/dropbox/metadata.rb index ac3669f..c787ec1 100644 --- a/lib/dropbox/metadata.rb +++ b/lib/dropbox/metadata.rb @@ -34,10 +34,12 @@ def ==(cmp) # Contains the metadata (but not contents) of a folder. class FolderMetadata < Metadata - attr_reader :id + attr_reader :id, :shared_folder_id, :parent_shared_folder_id def initialize(attrs={}) @id = attrs.delete('id') + @shared_folder_id = attrs.delete('shared_folder_id') + @parent_shared_folder_id = attrs.delete('parent_shared_folder_id') super(attrs) end diff --git a/test/test_metadata.rb b/test/test_metadata.rb index 5072fe2..6ac6952 100644 --- a/test/test_metadata.rb +++ b/test/test_metadata.rb @@ -4,11 +4,13 @@ class DropboxMetadataTest < Minitest::Test def test_folder_initialize folder = Dropbox::FolderMetadata.new('id' => 'id:123', 'name' => 'child', - 'path_lower' => '/parent/middle/child', 'path_display' => '/parent/middle/child') + 'path_lower' => '/parent/middle/child', 'path_display' => '/parent/middle/child', 'shared_folder_id' => '1234', 'parent_shared_folder_id' => 'abcd') assert_equal 'id:123', folder.id assert_equal 'child', folder.name assert_equal '/parent/middle/child', folder.path_lower assert_equal '/parent/middle/child', folder.path_display + assert_equal '1234', folder.shared_folder_id + assert_equal 'abcd', folder.parent_shared_folder_id end def test_file_initialize From ad710b2fb3e9993f2ec1aecc1b831a9302bc78ed Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 11:58:24 -0700 Subject: [PATCH 02/16] Add parent_shared_folder_id to FileMetadata --- lib/dropbox/metadata.rb | 3 ++- test/test_metadata.rb | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/dropbox/metadata.rb b/lib/dropbox/metadata.rb index c787ec1..1287df8 100644 --- a/lib/dropbox/metadata.rb +++ b/lib/dropbox/metadata.rb @@ -14,7 +14,7 @@ def initialize(attrs={}) # Contains the metadata (but not contents) of a file. class FileMetadata < Metadata - attr_reader :id, :client_modified, :server_modified, :rev, :size + attr_reader :id, :client_modified, :server_modified, :rev, :size, :parent_shared_folder_id def initialize(attrs={}) @id = attrs.delete('id') @@ -24,6 +24,7 @@ def initialize(attrs={}) @server_modified = Time.parse(attrs.delete('server_modified')) @rev = attrs.delete('rev') @size = attrs.delete('size') + @parent_shared_folder_id = attrs.delete('parent_shared_folder_id') super(attrs) end diff --git a/test/test_metadata.rb b/test/test_metadata.rb index 6ac6952..28a17c8 100644 --- a/test/test_metadata.rb +++ b/test/test_metadata.rb @@ -16,12 +16,13 @@ def test_folder_initialize def test_file_initialize file = Dropbox::FileMetadata.new('id' => 'id:123', 'name' => 'file', 'path_lower' => '/folder/file', 'path_display' => '/folder/file', - 'size' => 11, 'server_modified' => '2007-07-07T00:00:00Z') + 'size' => 11, 'server_modified' => '2007-07-07T00:00:00Z', 'parent_shared_folder_id' => 'abcd') assert_equal 'id:123', file.id assert_equal 'file', file.name assert_equal '/folder/file', file.path_lower assert_equal '/folder/file', file.path_display assert_equal 11, file.size + assert_equal 'abcd', file.parent_shared_folder_id end def test_folder_equality From 504f499797cb23e991bacdb74a97e91d0bc5a937 Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 12:14:06 -0700 Subject: [PATCH 03/16] Adding SharedFolderMetadata --- lib/dropbox/metadata.rb | 8 ++++++++ test/test_metadata.rb | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/lib/dropbox/metadata.rb b/lib/dropbox/metadata.rb index 1287df8..2a1837d 100644 --- a/lib/dropbox/metadata.rb +++ b/lib/dropbox/metadata.rb @@ -52,4 +52,12 @@ def ==(cmp) # Contains the metadata of a deleted file. class DeletedMetadata < Metadata end + + class SharedFolderMetadata < Metadata + attr_reader :shared_folder_id + def initialize(attrs={}) + @shared_folder_id = attrs.delete('shared_folder_id') + super(attrs) + end + end end diff --git a/test/test_metadata.rb b/test/test_metadata.rb index 28a17c8..287247b 100644 --- a/test/test_metadata.rb +++ b/test/test_metadata.rb @@ -25,6 +25,13 @@ def test_file_initialize assert_equal 'abcd', file.parent_shared_folder_id end + def test_shared_folder_initialize + file = Dropbox::SharedFolderMetadata.new('path_lower'=>'/folder/file', 'name'=>'file', 'shared_folder_id'=>'1234') + assert_equal '/folder/file', file.path_lower + assert_equal 'file', file.name + assert_equal '1234', file.shared_folder_id + end + def test_folder_equality a = Dropbox::FolderMetadata.new('id' => 'id:123', 'name' => 'child', 'path_lower' => '/parent/middle/child', 'path_display' => '/parent/middle/child') From 44899cb6703b647d448ca906448a6436459739bd Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 12:43:18 -0700 Subject: [PATCH 04/16] Adding Client#share_folder --- lib/dropbox/client.rb | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index 2d80c2d..a0cf124 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -314,6 +314,19 @@ def get_space_usage SpaceUsage.new(resp) end + # Make a folder shared + # @param path [String] The path to the folder to be made shared + # @param member_policy [String] Can be 'anyone' or 'team'. Defaults to 'anyone'. + # @param acl_update_policy [String] Can be 'owner' or 'editors'. Defaults to 'owner'. + # @param shared_link_policy [String] Can be 'anyone' or 'editors'. Defaults to 'anyone'. + # @param force_async [Boolean] Defaults to false. + # @return [String] the job id, if the processing is asynchronous. + # @return [Dropbox::SharedFolderMetadata] if the processing is synchronous + def share_folder(path, member_policy: 'anyone', acl_update_policy: 'owner', shared_link_policy: 'anyone', force_async: false) + resp = request('/sharing/share_folder', path: path, member_policy: member_policy, acl_update_policy: acl_update_policy, shared_link_policy: shared_link_policy, force_async: force_async) + parse_tagged_response(resp) + end + private def parse_tagged_response(resp) case resp['.tag'] @@ -328,7 +341,11 @@ def parse_tagged_response(resp) when 'full_account' FullAccount.new(resp) when 'complete' - FileMetadata.new(resp) + if resp['time_invited'] + SharedFolderMetadata.new(resp) + else + FileMetadata.new(resp) + end when 'async_job_id' resp['async_job_id'] when 'in_progress' From dd51d7626b041dc1048da5eb285611800b8fee91 Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 15:17:21 -0700 Subject: [PATCH 05/16] Some API endpoints return null, so we should use resp.parse instead of JSON.parse(resp.to_s). --- lib/dropbox/client.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index a0cf124..448c43f 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -364,7 +364,7 @@ def request(action, data=nil) .post(url, json: data) raise ApiError.new(resp) if resp.code != 200 - JSON.parse(resp.to_s) + resp.parse end def content_request(action, args={}) From d22a7da61d931eed16ce49a9cc02b1960d6c9753 Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 15:19:35 -0700 Subject: [PATCH 06/16] Add Client#add_folder_member --- lib/dropbox/client.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index 448c43f..7615e07 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -327,6 +327,32 @@ def share_folder(path, member_policy: 'anyone', acl_update_policy: 'owner', shar parse_tagged_response(resp) end + # Add a member to a shared folder + # @param shared_folder_id [String] The shared_id of the folder + # @param members [Array] An array of emails as Strings. + # @param quiet [Boolean] defaults to false + # @param custom_message [String] A custom message to be sent to all of the members. Defaults to nil. + # @param access_level [String] The access level given to all members. Can be 'editor', 'viewer' or 'viewer_no_comment'. Defaults to 'editor'. + # @return [void] + def add_folder_member(shared_folder_id:, members:, quiet: false, custom_message: nil, access_level: 'editor') + params = {shared_folder_id: shared_folder_id, quiet: quiet} + params[:members] = members.map do |member| + { + 'member' => { + '.tag' => 'email', + 'email' => member + }, + 'access_level' => { + '.tag' => access_level + } + } + end + params[:custom_message] = custom_message if custom_message + + request('/sharing/add_folder_member', params) + nil + end + private def parse_tagged_response(resp) case resp['.tag'] From e2d1e8d564f4e9ad340323f74a63064b62eab404 Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 17:03:03 -0700 Subject: [PATCH 07/16] Adding tests for `share_folder` and `add_folder_member` --- test/stubs/null.json | 4 ++++ test/stubs/share_folder.json | 13 +++++++++++++ test/test_sharing.rb | 19 +++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 test/stubs/null.json create mode 100644 test/stubs/share_folder.json create mode 100644 test/test_sharing.rb diff --git a/test/stubs/null.json b/test/stubs/null.json new file mode 100644 index 0000000..4be915c --- /dev/null +++ b/test/stubs/null.json @@ -0,0 +1,4 @@ +HTTP/1.1 200 OK +Content-Type: application/json + +null diff --git a/test/stubs/share_folder.json b/test/stubs/share_folder.json new file mode 100644 index 0000000..b30ac76 --- /dev/null +++ b/test/stubs/share_folder.json @@ -0,0 +1,13 @@ +HTTP/1.1 200 OK +Content-Type: application/json + +{ + ".tag": "complete", + "access_type": {".tag": "owner"}, + "is_team_folder": false, + "policy": {"acl_update_policy": {".tag": "editors"}, "shared_link_policy": {".tag": "anyone"}}, + "path_lower": "/test/share_me", + "name": "share_me", + "shared_folder_id": "123123123", + "time_invited": "2016-09-13T23:38:32Z", + "preview_url": "https://www.dropbox.com/scl/fo/123123123/AADAASDKJASDASD"} diff --git a/test/test_sharing.rb b/test/test_sharing.rb new file mode 100644 index 0000000..a71f0a4 --- /dev/null +++ b/test/test_sharing.rb @@ -0,0 +1,19 @@ +require 'test_helper' + +class DropboxSharingTest < Minitest::Test + def setup + @client = Dropbox::Client.new('super-fake-access-token-1234567890000000000000000000000000000000') + end + + def test_share_folder + stub_request(:post, url('sharing/share_folder')).to_return(stub('share_folder')) + share = @client.share_folder('/test/share_me') + assert_equal '/test/share_me', share.path_lower + end + + def test_add_folder_member + stub_request(:post, url('sharing/add_folder_member')).to_return(stub('null')) + result = @client.add_folder_member(shared_folder_id: '123123', members: %w(one@example.com two@example.com)) + assert_equal nil, result + end +end From ec5edc62c6c08ebb778bd4879f7e4441244fb69f Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 17:18:42 -0700 Subject: [PATCH 08/16] Adding Client#mount_folder --- lib/dropbox/client.rb | 8 ++++++++ test/test_sharing.rb | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index 7615e07..6b44d53 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -353,6 +353,14 @@ def add_folder_member(shared_folder_id:, members:, quiet: false, custom_message: nil end + # Mount a folder (accept a share request) + # @param shared_folder_id [String] + # @return [Dropbox::SharedFolderMetadata] + def mount_folder(shared_folder_id) + resp = request('/sharing/mount_folder', shared_folder_id: shared_folder_id) + SharedFolderMetadata.new(resp) + end + private def parse_tagged_response(resp) case resp['.tag'] diff --git a/test/test_sharing.rb b/test/test_sharing.rb index a71f0a4..c672e62 100644 --- a/test/test_sharing.rb +++ b/test/test_sharing.rb @@ -16,4 +16,10 @@ def test_add_folder_member result = @client.add_folder_member(shared_folder_id: '123123', members: %w(one@example.com two@example.com)) assert_equal nil, result end + + def test_mount_folder + stub_request(:post, url('sharing/mount_folder')).to_return(stub('share_folder')) + share = @client.mount_folder('123123') + assert_equal '/test/share_me', share.path_lower + end end From f255659d5da9f7138664b144ac1debf0d034eb8d Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 17:39:35 -0700 Subject: [PATCH 09/16] Adding Client#list_folder_members --- lib/dropbox/account.rb | 2 +- lib/dropbox/client.rb | 8 ++++++++ test/stubs/list_folder_members.json | 11 +++++++++++ test/test_sharing.rb | 7 +++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 test/stubs/list_folder_members.json diff --git a/lib/dropbox/account.rb b/lib/dropbox/account.rb index 2476ae4..80ab580 100644 --- a/lib/dropbox/account.rb +++ b/lib/dropbox/account.rb @@ -4,7 +4,7 @@ class Account def initialize(attrs={}) @account_id = attrs['account_id'] - @display_name = attrs['name']['display_name'] + @display_name = attrs['name']['display_name'] if attrs['name'] @email = attrs['email'] @email_verified = attrs['email_verified'] @disabled = attrs['disabled'] diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index 6b44d53..224485c 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -361,6 +361,14 @@ def mount_folder(shared_folder_id) SharedFolderMetadata.new(resp) end + # List members of a shared folder + # @param shared_folder_id [String] + # @return [Array] + def list_folder_members(shared_folder_id) + resp = request('/sharing/list_folder_members', shared_folder_id: shared_folder_id) + resp['users'].map {|user| BasicAccount.new(user['user'])} + end + private def parse_tagged_response(resp) case resp['.tag'] diff --git a/test/stubs/list_folder_members.json b/test/stubs/list_folder_members.json new file mode 100644 index 0000000..63d46c9 --- /dev/null +++ b/test/stubs/list_folder_members.json @@ -0,0 +1,11 @@ +HTTP/1.1 200 OK +Content-Type: application/json + +{ + "users": + [{"access_type": {".tag": "owner"}, "is_inherited": false, "user": {"account_id": "dbid:user1", "same_team": false}}, + {"access_type": {".tag": "editor"}, "is_inherited": false, "user": {"account_id": "dbid:user2", "same_team": false}}, + {"access_type": {".tag": "editor"}, "is_inherited": false, "user": {"account_id": "dbid:user3", "same_team": false}}], + "groups": [], + "invitees": [] +} diff --git a/test/test_sharing.rb b/test/test_sharing.rb index c672e62..c14667c 100644 --- a/test/test_sharing.rb +++ b/test/test_sharing.rb @@ -22,4 +22,11 @@ def test_mount_folder share = @client.mount_folder('123123') assert_equal '/test/share_me', share.path_lower end + + def test_list_folder_members + stub_request(:post, url('sharing/list_folder_members')).to_return(stub('list_folder_members')) + list = @client.list_folder_members('123123') + assert_equal 3, list.length + assert_equal 'dbid:user1', list.first.account_id + end end From d6f710890ceb3e2990aee3697596636e4728be77 Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 19:33:04 -0700 Subject: [PATCH 10/16] Adding Client#transfer_folder --- lib/dropbox/client.rb | 9 +++++++++ test/test_sharing.rb | 8 +++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index 224485c..a5b6b39 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -369,6 +369,15 @@ def list_folder_members(shared_folder_id) resp['users'].map {|user| BasicAccount.new(user['user'])} end + # Transfer ownership of a shared folder to another member of the folder + # @param shared_folder_id [String] + # @param to_dropbox_id [String] + # @return [void] + def transfer_folder(shared_folder_id, to_dropbox_id) + request('/sharing/transfer_folder', shared_folder_id: shared_folder_id, to_dropbox_id: to_dropbox_id) + nil + end + private def parse_tagged_response(resp) case resp['.tag'] diff --git a/test/test_sharing.rb b/test/test_sharing.rb index c14667c..dbd1553 100644 --- a/test/test_sharing.rb +++ b/test/test_sharing.rb @@ -14,7 +14,7 @@ def test_share_folder def test_add_folder_member stub_request(:post, url('sharing/add_folder_member')).to_return(stub('null')) result = @client.add_folder_member(shared_folder_id: '123123', members: %w(one@example.com two@example.com)) - assert_equal nil, result + assert_nil result end def test_mount_folder @@ -29,4 +29,10 @@ def test_list_folder_members assert_equal 3, list.length assert_equal 'dbid:user1', list.first.account_id end + + def test_transfer_folder + stub_request(:post, url('sharing/transfer_folder')).to_return(stub('null')) + result = @client.transfer_folder('123123123', '123123aaa') + assert_nil result + end end From 52a089d217337ee249bc285f7a8fcc99c0ecce7e Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 19:43:50 -0700 Subject: [PATCH 11/16] Add Client#relinquish_folder_membership --- lib/dropbox/client.rb | 14 +++++++++++++- test/stubs/complete.json | 6 ++++++ test/test_sharing.rb | 6 ++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 test/stubs/complete.json diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index a5b6b39..1b39b0e 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -369,6 +369,16 @@ def list_folder_members(shared_folder_id) resp['users'].map {|user| BasicAccount.new(user['user'])} end + # Relinquish membership of a shared folder you are a member of + # @param shared_folder_id [String] + # @param leave_a_copy [String] default false + # @return [String] 'complete' if the processing is complete + # @return [String] the job id, if the processing is asynchronous. + def relinquish_folder_membership(shared_folder_id, leave_a_copy = false) + resp = request('/sharing/relinquish_folder_membership', shared_folder_id: shared_folder_id, leave_a_copy: leave_a_copy) + parse_tagged_response(resp) + end + # Transfer ownership of a shared folder to another member of the folder # @param shared_folder_id [String] # @param to_dropbox_id [String] @@ -394,8 +404,10 @@ def parse_tagged_response(resp) when 'complete' if resp['time_invited'] SharedFolderMetadata.new(resp) - else + elsif resp['client_modified'] FileMetadata.new(resp) + else + 'complete' end when 'async_job_id' resp['async_job_id'] diff --git a/test/stubs/complete.json b/test/stubs/complete.json new file mode 100644 index 0000000..d77ed64 --- /dev/null +++ b/test/stubs/complete.json @@ -0,0 +1,6 @@ +HTTP/1.1 200 OK +Content-Type: application/json + +{ + ".tag": "complete" +} diff --git a/test/test_sharing.rb b/test/test_sharing.rb index dbd1553..69de9d1 100644 --- a/test/test_sharing.rb +++ b/test/test_sharing.rb @@ -35,4 +35,10 @@ def test_transfer_folder result = @client.transfer_folder('123123123', '123123aaa') assert_nil result end + + def test_relinquish_membership + stub_request(:post, url('sharing/relinquish_folder_membership')).to_return(stub('complete')) + result = @client.relinquish_folder_membership('123123') + assert_equal 'complete', result + end end From 5b9d1b368623a86ba9e96f2ec6739e438c8f7a2e Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 20:27:05 -0700 Subject: [PATCH 12/16] Adding integration specs for sharing --- test/test_integration.rb | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/test/test_integration.rb b/test/test_integration.rb index 2d36446..b154e2c 100644 --- a/test/test_integration.rb +++ b/test/test_integration.rb @@ -5,10 +5,15 @@ def setup WebMock.allow_net_connect! @client = Dropbox::Client.new(ENV['DROPBOX_SDK_ACCESS_TOKEN']) @box = @client.create_folder('/integration_test_container') + if ENV['DROPBOX_SDK_ACCESS_TOKEN_2'] + @client2 = Dropbox::Client.new(ENV['DROPBOX_SDK_ACCESS_TOKEN_2']) + @box2 = @client2.create_folder('/integration_test_container') + end end def teardown @client.delete(@box.path_lower) + @client2.delete(@box2.path_lower) if @client2 WebMock.disable_net_connect! end @@ -96,4 +101,34 @@ def test_upload_session assert_instance_of Dropbox::FileMetadata, file assert_equal 75, file.size end + + def test_sharing + skip('Please provide a second access token with the DROPBOX_SDK_ACCESS_TOKEN_2 environment variable to run the sharing tests') unless @client2 + folder = @client.create_folder(@box.path_lower + '/testing_share') + shared = @client.share_folder(folder.path_lower) + client1_account = @client.get_current_account + client2_account = @client2.get_current_account + + # @client shares a folder with @client2, and client2 accepts the share + @client.add_folder_member(shared_folder_id: shared.shared_folder_id, members: [client2_account.email]) + @client2.mount_folder(shared.shared_folder_id) + @client2.move('/testing_share', @box2.path_lower + '/testing_share') + folder_members = @client2.list_folder_members(shared.shared_folder_id) + assert_equal 2, folder_members.length + assert_includes folder_members.map(&:account_id), client2_account.account_id + assert_includes folder_members.map(&:account_id), client1_account.account_id + + # @client2 uploads a file, and @client can see it + uploaded_path = @box.path_lower + '/testing_share/uploaded.txt' + @client2.upload(uploaded_path, 'uploaded') + files = @client.list_folder(@box.path_lower + '/testing_share') + assert_equal files.first.name, 'uploaded.txt' + + # @client transfers ownership to @client2 and then @client + # removes themselves from the folder + @client.transfer_folder(shared.shared_folder_id, client2_account.account_id) + @client.relinquish_folder_membership(shared.shared_folder_id, false) + folder_members = @client2.list_folder_members(shared.shared_folder_id) + assert_equal 1, folder_members.length + end end From 0dc516a4e9052d8c688bdde40336a36377353924 Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Tue, 13 Sep 2016 21:50:11 -0700 Subject: [PATCH 13/16] Fixing signatures for the new sharing methods Make required parameters just plain old params, and all optional parameters named params with a default. --- lib/dropbox/client.rb | 4 ++-- test/test_integration.rb | 4 ++-- test/test_sharing.rb | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index 1b39b0e..5b05335 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -334,7 +334,7 @@ def share_folder(path, member_policy: 'anyone', acl_update_policy: 'owner', shar # @param custom_message [String] A custom message to be sent to all of the members. Defaults to nil. # @param access_level [String] The access level given to all members. Can be 'editor', 'viewer' or 'viewer_no_comment'. Defaults to 'editor'. # @return [void] - def add_folder_member(shared_folder_id:, members:, quiet: false, custom_message: nil, access_level: 'editor') + def add_folder_member(shared_folder_id, members, quiet: false, custom_message: nil, access_level: 'editor') params = {shared_folder_id: shared_folder_id, quiet: quiet} params[:members] = members.map do |member| { @@ -374,7 +374,7 @@ def list_folder_members(shared_folder_id) # @param leave_a_copy [String] default false # @return [String] 'complete' if the processing is complete # @return [String] the job id, if the processing is asynchronous. - def relinquish_folder_membership(shared_folder_id, leave_a_copy = false) + def relinquish_folder_membership(shared_folder_id, leave_a_copy: false) resp = request('/sharing/relinquish_folder_membership', shared_folder_id: shared_folder_id, leave_a_copy: leave_a_copy) parse_tagged_response(resp) end diff --git a/test/test_integration.rb b/test/test_integration.rb index b154e2c..1855544 100644 --- a/test/test_integration.rb +++ b/test/test_integration.rb @@ -110,7 +110,7 @@ def test_sharing client2_account = @client2.get_current_account # @client shares a folder with @client2, and client2 accepts the share - @client.add_folder_member(shared_folder_id: shared.shared_folder_id, members: [client2_account.email]) + @client.add_folder_member(shared.shared_folder_id, [client2_account.email]) @client2.mount_folder(shared.shared_folder_id) @client2.move('/testing_share', @box2.path_lower + '/testing_share') folder_members = @client2.list_folder_members(shared.shared_folder_id) @@ -127,7 +127,7 @@ def test_sharing # @client transfers ownership to @client2 and then @client # removes themselves from the folder @client.transfer_folder(shared.shared_folder_id, client2_account.account_id) - @client.relinquish_folder_membership(shared.shared_folder_id, false) + @client.relinquish_folder_membership(shared.shared_folder_id, leave_a_copy: false) folder_members = @client2.list_folder_members(shared.shared_folder_id) assert_equal 1, folder_members.length end diff --git a/test/test_sharing.rb b/test/test_sharing.rb index 69de9d1..1d7ad69 100644 --- a/test/test_sharing.rb +++ b/test/test_sharing.rb @@ -13,7 +13,7 @@ def test_share_folder def test_add_folder_member stub_request(:post, url('sharing/add_folder_member')).to_return(stub('null')) - result = @client.add_folder_member(shared_folder_id: '123123', members: %w(one@example.com two@example.com)) + result = @client.add_folder_member('123123', %w(one@example.com two@example.com)) assert_nil result end From 68577a5b543371cb08fb647118377457b59bd833 Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Wed, 14 Sep 2016 09:27:38 -0700 Subject: [PATCH 14/16] Client#list_folder_members returns an array of UserMembershipInfo --- lib/dropbox/account.rb | 10 ++++++++++ lib/dropbox/client.rb | 4 ++-- test/test_sharing.rb | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/dropbox/account.rb b/lib/dropbox/account.rb index 80ab580..823673a 100644 --- a/lib/dropbox/account.rb +++ b/lib/dropbox/account.rb @@ -44,4 +44,14 @@ def initialize(attrs={}) @allocated = attrs['allocation']['allocated'] # Space allocated in bytes end end + + class UserMembershipInfo + attr_reader :access_type, :account_id, :same_team, :team_member_id + + def initialize(attrs={}) + @access_type = attrs['access_type']['.tag'] + @account_id = attrs['user']['account_id'] + @same_team = attrs['user']['same_team'] + end + end end diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index 5b05335..6bbd229 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -363,10 +363,10 @@ def mount_folder(shared_folder_id) # List members of a shared folder # @param shared_folder_id [String] - # @return [Array] + # @return [Array] def list_folder_members(shared_folder_id) resp = request('/sharing/list_folder_members', shared_folder_id: shared_folder_id) - resp['users'].map {|user| BasicAccount.new(user['user'])} + resp['users'].map {|user| UserMembershipInfo.new(user)} end # Relinquish membership of a shared folder you are a member of diff --git a/test/test_sharing.rb b/test/test_sharing.rb index 1d7ad69..19098f9 100644 --- a/test/test_sharing.rb +++ b/test/test_sharing.rb @@ -28,6 +28,8 @@ def test_list_folder_members list = @client.list_folder_members('123123') assert_equal 3, list.length assert_equal 'dbid:user1', list.first.account_id + assert_equal false, list.first.same_team + assert_equal 'owner', list.first.access_type end def test_transfer_folder From f4af249d278a1209306afd91548eceef750d6ebe Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Wed, 14 Sep 2016 09:57:43 -0700 Subject: [PATCH 15/16] Add Client#list_shared_folders and Client#continue_list_shared_folders --- lib/dropbox/client.rb | 20 ++++++++++++++++++++ test/stubs/list_shared_folders.json | 23 +++++++++++++++++++++++ test/test_sharing.rb | 18 ++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 test/stubs/list_shared_folders.json diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index 6bbd229..59c510f 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -314,6 +314,26 @@ def get_space_usage SpaceUsage.new(resp) end + # List shared folders owned by the current user + # @param limit [Integer] The maximum number of results to return. Defaults to 1000 + # @return [Array] entries + # @return [String] cursor + def list_shared_folders(limit = 1000) + resp = request('/sharing/list_folders', limit: limit) + entries = resp['entries'].map { |entry| FolderMetadata.new(entry) } + [entries, resp['cursor']] + end + + # Continue the list of shared folders + # @param cursor [String] + # @return [Array] entries + # @return [String] cursor + def continue_list_shared_folders(cursor) + resp = request('/sharing/list_folders/continue', cursor: cursor) + entries = resp['entries'].map { |entry| FolderMetadata.new(entry) } + [entries, resp['cursor']] + end + # Make a folder shared # @param path [String] The path to the folder to be made shared # @param member_policy [String] Can be 'anyone' or 'team'. Defaults to 'anyone'. diff --git a/test/stubs/list_shared_folders.json b/test/stubs/list_shared_folders.json new file mode 100644 index 0000000..4c1d37e --- /dev/null +++ b/test/stubs/list_shared_folders.json @@ -0,0 +1,23 @@ +HTTP/1.1 200 OK +Content-Type: application/json + + {"entries": + [{"access_type": {".tag": "editor"}, + "is_team_folder": false, + "policy": {"acl_update_policy": {".tag": "editors"}, "shared_link_policy": {".tag": "anyone"}}, + "path_lower": "/shared_file_1", + "name": "shared_file_1", + "shared_folder_id": "1234", + "permissions": [], + "time_invited": "2016-09-12T23:07:11Z", + "preview_url": "https://www.dropbox.com/scl/fo/abcd/1234"}, + {"access_type": {".tag": "owner"}, + "is_team_folder": false, + "policy": {"acl_update_policy": {".tag": "editors"}, "shared_link_policy": {".tag": "anyone"}}, + "path_lower": "/shared_file_2", + "name": "shared_file_2", + "shared_folder_id": "1235", + "permissions": [], + "time_invited": "2016-09-12T22:36:20Z", + "preview_url": "https://www.dropbox.com/scl/fo/abce/1235"}], + "cursor": "cursor123"} diff --git a/test/test_sharing.rb b/test/test_sharing.rb index 19098f9..1797e42 100644 --- a/test/test_sharing.rb +++ b/test/test_sharing.rb @@ -5,6 +5,24 @@ def setup @client = Dropbox::Client.new('super-fake-access-token-1234567890000000000000000000000000000000') end + def test_list_shared_folders + stub_request(:post, url('sharing/list_folders')).to_return(stub('list_shared_folders')) + folders, cursor = @client.list_shared_folders + folders.each do |folder| + assert_instance_of Dropbox::FolderMetadata, folder + end + assert_equal 'cursor123', cursor + end + + def test_continue_list_shared_folders + stub_request(:post, url('sharing/list_folders/continue')).to_return(stub('list_shared_folders')) + folders, cursor = @client.continue_list_shared_folders('cursor') + folders.each do |folder| + assert_instance_of Dropbox::FolderMetadata, folder + end + assert_equal 'cursor123', cursor + end + def test_share_folder stub_request(:post, url('sharing/share_folder')).to_return(stub('share_folder')) share = @client.share_folder('/test/share_me') From 63642f31eb07f737150ca0b19719789294b9a098 Mon Sep 17 00:00:00 2001 From: Scott Patten Date: Mon, 26 Sep 2016 15:26:00 -0700 Subject: [PATCH 16/16] Adding update_folder_policy method --- lib/dropbox/client.rb | 15 +++++++++++++++ test/test_sharing.rb | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index 59c510f..3b4b8b5 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -347,6 +347,21 @@ def share_folder(path, member_policy: 'anyone', acl_update_policy: 'owner', shar parse_tagged_response(resp) end + # Update the sharing policies for a shared folder. + # @params shared_folder_id [String] The shared_id of the folder + # @params member_policy [String]. Can be nil, 'anyone' or 'team'. Defaults to nil + # @params acl_update_policy [String]. Can be nil, 'owner' or 'editors'. Defaults to nil. + # @params shared_link_policy [String]. Can be nil, 'anyone' or 'members'. Defaults to nil. + # @return [Dropbox::SharedFolderMetadata] + def update_folder_policy(shared_folder_id, member_policy: nil, acl_update_policy: nil, shared_link_policy: nil) + data = {shared_folder_id: shared_folder_id} + data[:member_policy] = member_policy if member_policy + data[:acl_update_policy] = acl_update_policy if acl_update_policy + data[:shared_link_policy] = shared_link_policy if shared_link_policy + resp = request('/sharing/update_folder_policy', data) + SharedFolderMetadata.new(resp) + end + # Add a member to a shared folder # @param shared_folder_id [String] The shared_id of the folder # @param members [Array] An array of emails as Strings. diff --git a/test/test_sharing.rb b/test/test_sharing.rb index 1797e42..c6ed4e0 100644 --- a/test/test_sharing.rb +++ b/test/test_sharing.rb @@ -61,4 +61,10 @@ def test_relinquish_membership result = @client.relinquish_folder_membership('123123') assert_equal 'complete', result end + + def test_update_folder_policy + stub_request(:post, url('sharing/update_folder_policy')).to_return(stub('share_folder')) + result = @client.update_folder_policy('123123', acl_update_policy: 'editors') + assert_equal '/test/share_me', result.path_lower + end end