diff --git a/lib/dropbox.rb b/lib/dropbox.rb index e1ed43a..068bf22 100644 --- a/lib/dropbox.rb +++ b/lib/dropbox.rb @@ -3,6 +3,8 @@ require_relative 'dropbox/account' require_relative 'dropbox/metadata' require_relative 'dropbox/upload_session_cursor' +require_relative 'dropbox/team' +require_relative 'dropbox/link_permissions' # A small library for accessing the new Dropbox API. All of the Dropbox API # endpoints are implemented as methods on {Dropbox::Client}. diff --git a/lib/dropbox/client.rb b/lib/dropbox/client.rb index 2d80c2d..3c16f3c 100644 --- a/lib/dropbox/client.rb +++ b/lib/dropbox/client.rb @@ -314,6 +314,24 @@ def get_space_usage SpaceUsage.new(resp) end + # Create a shared link with custom settings. + # + # @param [String] path + # @return [Dropbox::FileLinkMetadata, Dropbox::FolderLinkMetadata] entry + def create_shared_link_with_settings(path) + resp = request('/sharing/create_shared_link_with_settings', path: path) + case resp['.tag'] + when 'file' + FileLinkMetadata.new(resp) + when 'folder' + FolderLinkMetadata.new(resp) + when 'failed' + resp['failed']['.tag'] + else + raise ClientError.unknown_response_type(resp['.tag']) + end + end + private def parse_tagged_response(resp) case resp['.tag'] diff --git a/lib/dropbox/link_permissions.rb b/lib/dropbox/link_permissions.rb new file mode 100644 index 0000000..541921f --- /dev/null +++ b/lib/dropbox/link_permissions.rb @@ -0,0 +1,34 @@ +module Dropbox + class Visibility + attr_reader :tag + + def initialize(attrs={}) + @tag = attrs['.tag'] + end + end + + class SharedLinkAccessFailureReason + attr_reader :tag + + def initialize(attrs={}) + @tag = attrs['.tag'] + end + end + + class LinkPermissions + attr_reader :can_revoke, :resolved_visibility, :requested_visibility, :revoke_failure_reason + + def initialize(attrs={}) + @can_revoke = attrs['can_revoke'] + if visibility = attrs.delete('resolved_visibility') + @resolved_visibility = visibility + end + if visibility = attrs.delete('requested_visibility') + @requested_visibility = visibility + end + if reason = attrs.delete('revoke_failure_reason') + @revoke_failure_reason = reason + end + end + end +end diff --git a/lib/dropbox/metadata.rb b/lib/dropbox/metadata.rb index ac3669f..d637e78 100644 --- a/lib/dropbox/metadata.rb +++ b/lib/dropbox/metadata.rb @@ -49,4 +49,38 @@ def ==(cmp) # Contains the metadata of a deleted file. class DeletedMetadata < Metadata end + + # Contains the metadata of a sharing content. + module SharingMetadata + def self.included(base) + base.class_eval do + attr_reader :url, :link_permissions, :expires, :team_member_info, :content_owner_team_info + end + end + + def initialize(attrs={}) + super(attrs) + @url = attrs['url'] + @link_permissions = LinkPermissions.new(attrs['link_permissions']) + if expires = attrs.delete('expires') + @expires= Time.parse(expires) + end + if team_member_info = attrs.delete('team_member_info') + @team_member_info = TeamMemberInfo.new(team_member_info) + end + if content_owner_team_info = attrs.delete('content_owner_team_info') + @content_owner_team_info = TeamMemberInfo.new(content_owner_team_info) + end + end + end + + # Contains the metadata of a shared file. + class FileLinkMetadata < FileMetadata + include SharingMetadata + end + + # Contains the metadata of a shared folder. + class FolderLinkMetadata < FolderMetadata + include SharingMetadata + end end diff --git a/lib/dropbox/team.rb b/lib/dropbox/team.rb new file mode 100644 index 0000000..465b08a --- /dev/null +++ b/lib/dropbox/team.rb @@ -0,0 +1,20 @@ +module Dropbox + class Team + attr_reader :id, :name + + def initialize(attrs={}) + @id = attrs['id'] + @name = attrs['name'] + end + end + + class TeamMemberInfo + attr_reader :team_info, :display_name, :memeber_id + + def initialize(attrs={}) + @team_info = Team.new(attrs['team_info']) + @display_name = attrs['display_name'] + @member_id = attrs['member_id'] + end + end +end diff --git a/test/stubs/create_shared_file_link_with_settings.json b/test/stubs/create_shared_file_link_with_settings.json new file mode 100644 index 0000000..4b1eccf --- /dev/null +++ b/test/stubs/create_shared_file_link_with_settings.json @@ -0,0 +1,31 @@ +HTTP/1.1 200 OK +Content-Type: application/json + +{ + ".tag": "file", + "url": "https://www.dropbox.com/s/2sn712vy1ovegw8/Prime_Numbers.txt?dl=0", + "name": "Prime_Numbers.txt", + "link_permissions": { + "can_revoke": false, + "resolved_visibility": { + ".tag": "public" + }, + "revoke_failure_reason": { + ".tag": "owner_only" + } + }, + "client_modified": "2015-05-12T15:50:38Z", + "server_modified": "2015-05-12T15:50:38Z", + "rev": "a1c10ce0dd78", + "size": 7212, + "id": "id:a4ayc_80_OEAAAAAAAAAXw", + "path_lower": "/homework/math/prime_numbers.txt", + "team_member_info": { + "team_info": { + "id": "dbtid:AAFdgehTzw7WlXhZJsbGCLePe8RvQGYDr-I", + "name": "Acme, Inc." + }, + "display_name": "Roger Rabbit", + "member_id": "dbmid:abcd1234" + } +} diff --git a/test/stubs/create_shared_folder_link_with_settings.json b/test/stubs/create_shared_folder_link_with_settings.json new file mode 100644 index 0000000..86695fe --- /dev/null +++ b/test/stubs/create_shared_folder_link_with_settings.json @@ -0,0 +1,27 @@ +HTTP/1.1 200 OK +Content-Type: application/json + +{ + ".tag": "folder", + "url": "https://www.dropbox.com/sh/s6fvw6ol7rmqo1x/AAAgWRSbjmYDvPpDB30Sykjfa?dl=0", + "name": "Math", + "link_permissions": { + "can_revoke": false, + "resolved_visibility": { + ".tag": "public" + }, + "revoke_failure_reason": { + ".tag": "owner_only" + } + }, + "id": "id:a4ayc_80_OEAAAAAAAAAXw", + "path_lower": "/homework/math", + "team_member_info": { + "team_info": { + "id": "dbtid:AAFdgehTzw7WlXhZJsbGCLePe8RvQGYDr-I", + "name": "Acme, Inc." + }, + "display_name": "Roger Rabbit", + "member_id": "dbmid:abcd1234" + } +} diff --git a/test/test_sharing.rb b/test/test_sharing.rb new file mode 100644 index 0000000..8916584 --- /dev/null +++ b/test/test_sharing.rb @@ -0,0 +1,35 @@ +require 'test_helper' + +class DropboxSharingTest < Minitest::Test + def setup + @client = Dropbox::Client.new('super-fake-access-token-1234567890000000000000000000000000000000') + end + + def test_create_shared_link_with_setting_for_file + stub_request(:post, url('sharing/create_shared_link_with_settings')).to_return(stub('create_shared_file_link_with_settings')) + file = @client.create_shared_link_with_settings('/Homework/Prime_Numbers.txt') + + assert file.is_a?(Dropbox::FileLinkMetadata) + assert_equal 'https://www.dropbox.com/s/2sn712vy1ovegw8/Prime_Numbers.txt?dl=0', file.url + assert_match /^id:[a-z0-9_-]+$/i, file.id + assert_equal 'Prime_Numbers.txt', file.name + assert file.server_modified.is_a?(Time) + assert_match /^[a-z0-9_-]+$/i, file.rev + assert_equal 7212, file.size + assert file.link_permissions.is_a?(Dropbox::LinkPermissions) + assert file.team_member_info.is_a?(Dropbox::TeamMemberInfo) + end + + def test_create_shared_link_with_setting_for_folder + stub_request(:post, url('sharing/create_shared_link_with_settings')).to_return(stub('create_shared_folder_link_with_settings')) + folder = @client.create_shared_link_with_settings('/Homework/math') + + assert folder.is_a?(Dropbox::FolderLinkMetadata) + assert_equal 'https://www.dropbox.com/sh/s6fvw6ol7rmqo1x/AAAgWRSbjmYDvPpDB30Sykjfa?dl=0', folder.url + assert_match /^id:[a-z0-9_-]+$/i, folder.id + assert_equal 'Math', folder.name + assert folder.link_permissions.is_a?(Dropbox::LinkPermissions) + assert folder.team_member_info.is_a?(Dropbox::TeamMemberInfo) + end +end +