boxr 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.env.example +9 -0
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/Rakefile +11 -0
- data/boxr.gemspec +29 -0
- data/lib/boxr.rb +38 -0
- data/lib/boxr/client.rb +215 -0
- data/lib/boxr/collaborations.rb +52 -0
- data/lib/boxr/comments.rb +45 -0
- data/lib/boxr/exceptions.rb +39 -0
- data/lib/boxr/files.rb +200 -0
- data/lib/boxr/folders.rb +105 -0
- data/lib/boxr/groups.rb +76 -0
- data/lib/boxr/metadata.rb +29 -0
- data/lib/boxr/search.rb +26 -0
- data/lib/boxr/shared_items.rb +13 -0
- data/lib/boxr/tasks.rb +77 -0
- data/lib/boxr/users.rb +92 -0
- data/lib/boxr/version.rb +3 -0
- data/spec/boxr_spec.rb +15 -0
- data/spec/spec_helper.rb +2 -0
- metadata +168 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
module Boxr
|
2
|
+
class Client
|
3
|
+
|
4
|
+
def add_comment_to_file(file_id, message: nil, tagged_message: nil)
|
5
|
+
add_comment(:file, file_id, message, tagged_message)
|
6
|
+
end
|
7
|
+
|
8
|
+
def reply_to_comment(comment_id, message: nil, tagged_message: nil)
|
9
|
+
add_comment(:comment, comment_id, message, tagged_message)
|
10
|
+
end
|
11
|
+
|
12
|
+
def change_comment(comment_id, message)
|
13
|
+
uri = "#{COMMENTS_URI}/#{comment_id}"
|
14
|
+
attributes = {message: message}
|
15
|
+
updated_comment, response = put uri, attributes
|
16
|
+
updated_comment
|
17
|
+
end
|
18
|
+
|
19
|
+
def comment_info(comment_id, fields: [])
|
20
|
+
uri ="#{COMMENTS_URI}/#{comment_id}"
|
21
|
+
comment, response = get uri
|
22
|
+
comment
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete_comment(comment_id)
|
26
|
+
uri = "#{COMMENTS_URI}/#{comment_id}"
|
27
|
+
result, response = delete uri
|
28
|
+
result
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def add_comment(type, id, message, tagged_message)
|
35
|
+
uri = COMMENTS_URI
|
36
|
+
attributes = {item: {type: type, id: id}}
|
37
|
+
attributes[:message] = message unless message.nil?
|
38
|
+
attributes[:tagged_message] = tagged_message unless tagged_message.nil?
|
39
|
+
|
40
|
+
new_comment, response = post uri, attributes
|
41
|
+
new_comment
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Boxr
|
2
|
+
|
3
|
+
class BoxrException < Exception
|
4
|
+
|
5
|
+
attr_reader :response_body, :type, :status, :code, :help_uri, :box_message, :request_id
|
6
|
+
|
7
|
+
def initialize(status,body,header)
|
8
|
+
@status = status
|
9
|
+
@response_body = body
|
10
|
+
@header = header
|
11
|
+
|
12
|
+
body_json = Oj.load(body)
|
13
|
+
if body_json
|
14
|
+
@type = body_json["type"]
|
15
|
+
@box_status = body_json["status"]
|
16
|
+
@code = body_json["code"]
|
17
|
+
@help_uri = body_json["help_uri"]
|
18
|
+
@box_message = body_json["message"]
|
19
|
+
@request_id = body_json["request_id"]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def message
|
24
|
+
auth_header = @header['WWW-Authenticate']
|
25
|
+
if(auth_header)
|
26
|
+
"#{@status}: #{auth_header}"
|
27
|
+
elsif(!@box_message.blank?)
|
28
|
+
"#{@status}: #{@box_message}"
|
29
|
+
else
|
30
|
+
"#{@status}: #{@response_body}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
message
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/lib/boxr/files.rb
ADDED
@@ -0,0 +1,200 @@
|
|
1
|
+
module Boxr
|
2
|
+
class Client
|
3
|
+
|
4
|
+
def file_info(file_id, fields: [])
|
5
|
+
uri = "#{FILES_URI}/#{file_id}"
|
6
|
+
query = build_fields_query(fields, FOLDER_AND_FILE_FIELDS_QUERY)
|
7
|
+
file, response = get uri, query: query
|
8
|
+
file
|
9
|
+
end
|
10
|
+
|
11
|
+
def update_file_info(file_id, name: nil, description: nil, parent_id: nil, shared_link: nil, tags: nil, if_match: nil)
|
12
|
+
uri = "#{FILES_URI}/#{file_id}"
|
13
|
+
|
14
|
+
attributes = {}
|
15
|
+
attributes[:name] = name unless name.nil?
|
16
|
+
attributes[:description] = description unless description.nil?
|
17
|
+
attributes[:parent_id] = {id: parent_id} unless parent_id.nil?
|
18
|
+
attributes[:shared_link] = shared_link unless shared_link.nil?
|
19
|
+
attributes[:tags] = tags unless tags.nil?
|
20
|
+
|
21
|
+
updated_file, response = put uri, attributes, if_match: if_match
|
22
|
+
updated_file
|
23
|
+
end
|
24
|
+
|
25
|
+
def download_file(file_id, version: nil)
|
26
|
+
begin
|
27
|
+
uri = "#{FILES_URI}/#{file_id}/content"
|
28
|
+
query = {}
|
29
|
+
query[:version] = version unless version.nil?
|
30
|
+
body_json, response = get uri, query: query, success_codes: [302,202]
|
31
|
+
|
32
|
+
if(response.status==302)
|
33
|
+
location = response.header['Location'][0]
|
34
|
+
file, response = get location, process_response: false
|
35
|
+
elsif(response.status==202)
|
36
|
+
retry_after_seconds = response.header['Retry-After'][0]
|
37
|
+
sleep retry_after_seconds.to_i
|
38
|
+
end
|
39
|
+
end until file
|
40
|
+
|
41
|
+
file
|
42
|
+
end
|
43
|
+
|
44
|
+
def upload_file(path_to_file, parent_id, content_created_at: nil, content_modified_at: nil,
|
45
|
+
preflight_check: true, send_content_md5: true)
|
46
|
+
|
47
|
+
preflight_check(path_to_file, parent_id) if preflight_check
|
48
|
+
|
49
|
+
file_info = nil
|
50
|
+
response = nil
|
51
|
+
|
52
|
+
File.open(path_to_file) do |file|
|
53
|
+
content_md5 = send_content_md5 ? Digest::SHA1.file(file).hexdigest : nil
|
54
|
+
attributes = {filename: file, parent_id: parent_id}
|
55
|
+
attributes[:content_created_at] = content_created_at.to_datetime.rfc3339 unless content_created_at.nil?
|
56
|
+
attributes[:content_modified_at] = content_modified_at.to_datetime.rfc3339 unless content_modified_at.nil?
|
57
|
+
file_info, response = post FILES_UPLOAD_URI, attributes, process_body: false, content_md5: content_md5
|
58
|
+
end
|
59
|
+
|
60
|
+
file_info["entries"][0]
|
61
|
+
end
|
62
|
+
|
63
|
+
def delete_file(file_id, if_match: nil)
|
64
|
+
uri = "#{FILES_URI}/#{file_id}"
|
65
|
+
result, response = delete uri, if_match: if_match
|
66
|
+
result
|
67
|
+
end
|
68
|
+
|
69
|
+
def upload_new_version_of_file(path_to_file, file_id, content_modified_at: nil, send_content_md5: true,
|
70
|
+
preflight_check: true, if_match: nil)
|
71
|
+
|
72
|
+
preflight_check_new_version_of_file(path_to_file, file_id) if preflight_check
|
73
|
+
|
74
|
+
uri = "#{UPLOAD_URI}/files/#{file_id}/content"
|
75
|
+
file_info = nil
|
76
|
+
response = nil
|
77
|
+
|
78
|
+
File.open(path_to_file) do |file|
|
79
|
+
content_md5 = send_content_md5 ? Digest::SHA1.file(file).hexdigest : nil
|
80
|
+
attributes = {filename: file}
|
81
|
+
attributes[:content_modified_at] = content_modified_at.to_datetime.rfc3339 unless content_modified_at.nil?
|
82
|
+
file_info, response = post uri, attributes, process_body: false, content_md5: content_md5, if_match: if_match
|
83
|
+
end
|
84
|
+
|
85
|
+
file_info["entries"][0]
|
86
|
+
end
|
87
|
+
|
88
|
+
def versions_of_file(file_id)
|
89
|
+
uri = "#{FILES_URI}/#{file_id}/versions"
|
90
|
+
versions, response = get uri
|
91
|
+
versions["entries"]
|
92
|
+
end
|
93
|
+
|
94
|
+
def download_old_version_of_file
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
def promote_old_version_of_file(file_id, file_version_id)
|
99
|
+
uri = "#{FILES_URI}/#{file_id}/versions/current"
|
100
|
+
attributes = {:type => 'file_version', :id => file_version_id}
|
101
|
+
new_version, res = post uri, attributes
|
102
|
+
new_version
|
103
|
+
end
|
104
|
+
|
105
|
+
def delete_old_version_of_file(file_id, file_version_id, if_match: nil)
|
106
|
+
uri = "#{FILES_URI}/#{file_id}/versions/#{file_version_id}"
|
107
|
+
body_json, res = delete uri, if_match: if_match
|
108
|
+
body_json
|
109
|
+
end
|
110
|
+
|
111
|
+
def copy_file(file_id, parent_id, name: nil)
|
112
|
+
uri = "#{FILES_URI}/#{file_id}/copy"
|
113
|
+
attributes = {:parent => {:id => parent_id}}
|
114
|
+
attributes[:name] = name unless name.nil?
|
115
|
+
new_file, res = post uri, attributes
|
116
|
+
new_file
|
117
|
+
end
|
118
|
+
|
119
|
+
def thumbnail(file_id, min_height: nil, min_width: nil, max_height: nil, max_width: nil)
|
120
|
+
uri = "#{FILES_URI}/#{file_id}/thumbnail.png"
|
121
|
+
query = {}
|
122
|
+
query[:min_height] = min_height unless min_height.nil?
|
123
|
+
query[:min_width] = min_width unless min_width.nil?
|
124
|
+
query[:max_height] = max_height unless max_height.nil?
|
125
|
+
query[:max_width] = max_width unless max_width.nil?
|
126
|
+
body, response = get uri, query: query, success_codes: [302,202,200], process_response: false
|
127
|
+
|
128
|
+
if(response.status==202 || response.status==302)
|
129
|
+
location = response.header['Location'][0]
|
130
|
+
thumbnail, response = get location, process_response: false
|
131
|
+
else #200
|
132
|
+
thumbnail = body
|
133
|
+
end
|
134
|
+
|
135
|
+
thumbnail
|
136
|
+
end
|
137
|
+
|
138
|
+
def create_shared_link_for_file(file_id, access: nil, unshared_at: nil, can_download: nil, can_preview: nil)
|
139
|
+
uri = "#{FILES_URI}/#{file_id}"
|
140
|
+
create_shared_link(uri, file_id, access, unshared_at, can_download, can_preview)
|
141
|
+
end
|
142
|
+
|
143
|
+
def disable_shared_link_for_file(file_id)
|
144
|
+
uri = "#{FILES_URI}/#{file_id}"
|
145
|
+
disable_shared_link(uri, file_id)
|
146
|
+
end
|
147
|
+
|
148
|
+
def trashed_file(file_id)
|
149
|
+
uri = "#{FILES_URI}/#{file_id}/trash"
|
150
|
+
trashed_file, response = get uri
|
151
|
+
trashed_file
|
152
|
+
end
|
153
|
+
|
154
|
+
def delete_trashed_file(file_id)
|
155
|
+
uri = "#{FILES_URI}/#{file_id}/trash"
|
156
|
+
|
157
|
+
result, response = delete uri
|
158
|
+
result
|
159
|
+
end
|
160
|
+
|
161
|
+
def restore_trashed_file(file_id, name: nil, parent_id: nil)
|
162
|
+
uri = "#{FILES_URI}/#{file_id}"
|
163
|
+
restore_trashed_item(uri, name, parent_id)
|
164
|
+
end
|
165
|
+
|
166
|
+
def file_comments(file_id, fields: [])
|
167
|
+
uri = "#{FILES_URI}/#{file_id}/comments"
|
168
|
+
query = build_fields_query(fields, COMMENT_FIELDS_QUERY)
|
169
|
+
|
170
|
+
comments = get_with_pagination uri, query: query
|
171
|
+
end
|
172
|
+
|
173
|
+
def file_tasks(file_id, fields: [])
|
174
|
+
uri = "#{FILES_URI}/#{file_id}/tasks"
|
175
|
+
query = build_fields_query(fields, TASK_FIELDS_QUERY)
|
176
|
+
|
177
|
+
tasks, response = get uri, query: query
|
178
|
+
tasks["entries"]
|
179
|
+
end
|
180
|
+
|
181
|
+
|
182
|
+
private
|
183
|
+
|
184
|
+
def preflight_check(path_to_file, parent_id)
|
185
|
+
size = File.size(path_to_file)
|
186
|
+
|
187
|
+
#TODO: need to make sure that figuring out the filename from the path_to_file works for people using Winblows
|
188
|
+
filename = File.basename(path_to_file)
|
189
|
+
attributes = {"name" => filename, "parent" => {"id" => "#{parent_id}"}, "size" => size}
|
190
|
+
body_json, res = options "#{FILES_URI}/content", attributes
|
191
|
+
end
|
192
|
+
|
193
|
+
def preflight_check_new_version_of_file(path_to_file, file_id)
|
194
|
+
size = File.size(path_to_file)
|
195
|
+
attributes = {"size" => size}
|
196
|
+
body_json, res = options "#{FILES_URI}/#{file_id}/content", attributes
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
end
|
data/lib/boxr/folders.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
module Boxr
|
2
|
+
class Client
|
3
|
+
|
4
|
+
def folder_items(folder_id, fields: [])
|
5
|
+
query = build_fields_query(fields, FOLDER_AND_FILE_FIELDS_QUERY)
|
6
|
+
uri = "#{FOLDERS_URI}/#{folder_id}/items"
|
7
|
+
|
8
|
+
items = get_with_pagination uri, query: query, limit: FOLDER_ITEMS_LIMIT
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_folder(name, parent_id)
|
12
|
+
uri = "#{FOLDERS_URI}"
|
13
|
+
attributes = {:name => name, :parent => {:id => parent_id}}
|
14
|
+
|
15
|
+
created_folder, response = post uri, attributes
|
16
|
+
created_folder
|
17
|
+
end
|
18
|
+
|
19
|
+
def folder_info(folder_id, fields: [])
|
20
|
+
query = build_fields_query(fields, FOLDER_AND_FILE_FIELDS_QUERY)
|
21
|
+
uri = "#{FOLDERS_URI}/#{folder_id}"
|
22
|
+
|
23
|
+
folder, response = get uri, query: query
|
24
|
+
folder
|
25
|
+
end
|
26
|
+
|
27
|
+
def update_folder_info(folder_id, name: nil, description: nil, parent_id: nil, shared_link: nil,
|
28
|
+
folder_upload_email: nil, owned_by_id: nil, sync_state: nil, tags: nil,
|
29
|
+
can_non_owners_invite: nil, if_match: nil)
|
30
|
+
uri = "#{FOLDERS_URI}/#{folder_id}"
|
31
|
+
|
32
|
+
attributes = {}
|
33
|
+
attributes[:name] = name unless name.nil?
|
34
|
+
attributes[:description] = description unless description.nil?
|
35
|
+
attributes[:parent_id] = {id: parent_id} unless parent_id.nil?
|
36
|
+
attributes[:shared_link] = shared_link unless shared_link.nil?
|
37
|
+
attributes[:folder_upload_email] = folder_upload_email unless folder_upload_email.nil?
|
38
|
+
attributes[:owned_by_id] = {owned_by: owned_by_id} unless owned_by_id.nil?
|
39
|
+
attributes[:sync_state] = sync_state unless sync_state.nil?
|
40
|
+
attributes[:tags] = tags unless tags.nil?
|
41
|
+
attributes[:can_non_owners_invite] = can_non_owners_invite unless can_non_owners_invite.nil?
|
42
|
+
|
43
|
+
updated_folder, response = put uri, attributes, if_match: if_match
|
44
|
+
updated_folder
|
45
|
+
end
|
46
|
+
|
47
|
+
def delete_folder(folder_id, recursive: false, if_match: nil)
|
48
|
+
uri = "#{FOLDERS_URI}/#{folder_id}"
|
49
|
+
query = {:recursive => recursive}
|
50
|
+
|
51
|
+
result, response = delete uri, query, if_match: if_match
|
52
|
+
result
|
53
|
+
end
|
54
|
+
|
55
|
+
def copy_folder(folder_id, dest_folder_id, name: nil)
|
56
|
+
uri = "#{FOLDERS_URI}/#{folder_id}/copy"
|
57
|
+
attributes = {:parent => {:id => dest_folder_id}}
|
58
|
+
attributes[:name] = name unless name.nil?
|
59
|
+
|
60
|
+
new_folder, response = post uri, attributes
|
61
|
+
new_folder
|
62
|
+
end
|
63
|
+
|
64
|
+
def create_shared_link_for_folder(folder_id, access: nil, unshared_at: nil, can_download: nil, can_preview: nil)
|
65
|
+
uri = "#{FOLDERS_URI}/#{folder_id}"
|
66
|
+
create_shared_link(uri, folder_id, access, unshared_at, can_download, can_preview)
|
67
|
+
end
|
68
|
+
|
69
|
+
def disable_shared_link_for_folder(folder_id)
|
70
|
+
uri = "#{FOLDERS_URI}/#{folder_id}"
|
71
|
+
disable_shared_link(uri, folder_id)
|
72
|
+
end
|
73
|
+
|
74
|
+
def folder_collaborations(folder_id)
|
75
|
+
uri = "#{FOLDERS_URI}/#{folder_id}/collaborations"
|
76
|
+
collaborations, response = get uri
|
77
|
+
collaborations
|
78
|
+
end
|
79
|
+
|
80
|
+
def trash(fields: [])
|
81
|
+
uri = "#{FOLDERS_URI}/trash/items"
|
82
|
+
query = build_fields_query(fields, FOLDER_AND_FILE_FIELDS_QUERY)
|
83
|
+
|
84
|
+
items = get_with_pagination uri, query: query, limit: FOLDER_ITEMS_LIMIT
|
85
|
+
end
|
86
|
+
|
87
|
+
def trashed_folder(folder_id)
|
88
|
+
uri = "#{FOLDERS_URI}/#{folder_id}/trash"
|
89
|
+
item, response = get uri
|
90
|
+
item
|
91
|
+
end
|
92
|
+
|
93
|
+
def delete_trashed_folder(folder_id)
|
94
|
+
uri = "#{FOLDERS_URI}/#{folder_id}/trash"
|
95
|
+
result, response = delete uri
|
96
|
+
result
|
97
|
+
end
|
98
|
+
|
99
|
+
def restore_trashed_folder(folder_id, name: nil, parent_id: nil)
|
100
|
+
uri = "#{FOLDERS_URI}/#{folder_id}"
|
101
|
+
restore_trashed_item(uri, name, parent_id)
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
data/lib/boxr/groups.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
module Boxr
|
2
|
+
class Client
|
3
|
+
|
4
|
+
def groups(fields: [])
|
5
|
+
query = build_fields_query(fields, GROUP_FIELDS_QUERY)
|
6
|
+
groups = get_with_pagination(GROUPS_URI, query: query)
|
7
|
+
end
|
8
|
+
|
9
|
+
def create_group(name)
|
10
|
+
attributes = {name: name}
|
11
|
+
new_group, response = post(GROUPS_URI, attributes)
|
12
|
+
new_group
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_group(group_id, name)
|
16
|
+
uri = "#{GROUPS_URI}/#{group_id}"
|
17
|
+
attributes = {name: name}
|
18
|
+
|
19
|
+
updated_group, response = put(uri, attributes)
|
20
|
+
updated_group
|
21
|
+
end
|
22
|
+
|
23
|
+
def delete_group(group_id)
|
24
|
+
uri = "#{GROUPS_URI}/#{group_id}"
|
25
|
+
result, response = delete(uri)
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
def group_memberships(group_id)
|
30
|
+
uri = "#{GROUPS_URI}/#{group_id}/memberships"
|
31
|
+
memberships = get_with_pagination(uri)
|
32
|
+
end
|
33
|
+
|
34
|
+
def group_memberships_for_user(user_id)
|
35
|
+
uri = "#{USERS_URI}/#{user_id}/memberships"
|
36
|
+
memberships = get_with_pagination(uri)
|
37
|
+
end
|
38
|
+
|
39
|
+
def group_memberships_for_me
|
40
|
+
uri = "#{USERS_URI}/me/memberships"
|
41
|
+
memberships = get_with_pagination(uri)
|
42
|
+
end
|
43
|
+
|
44
|
+
def group_membership(membership_id)
|
45
|
+
uri = "#{GROUP_MEMBERSHIPS_URI}/#{membership_id}"
|
46
|
+
membership, response = get(uri)
|
47
|
+
membership
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_user_to_group(user_id, group_id, role: nil)
|
51
|
+
attributes = {user: {id: user_id}, group: {id: group_id}}
|
52
|
+
attributes[:role] = role unless role.nil?
|
53
|
+
membership, response = post(GROUP_MEMBERSHIPS_URI, attributes)
|
54
|
+
membership
|
55
|
+
end
|
56
|
+
|
57
|
+
def update_group_membership(membership_id, role)
|
58
|
+
uri = "#{GROUP_MEMBERSHIPS_URI}/#{membership_id}"
|
59
|
+
attributes = {role: role}
|
60
|
+
updated_membership, response = put(uri, attributes)
|
61
|
+
updated_membership
|
62
|
+
end
|
63
|
+
|
64
|
+
def delete_group_membership(membership_id)
|
65
|
+
uri = "#{GROUP_MEMBERSHIPS_URI}/#{membership_id}"
|
66
|
+
result, response = delete(uri)
|
67
|
+
result
|
68
|
+
end
|
69
|
+
|
70
|
+
def group_collaborations(group_id)
|
71
|
+
uri = "#{GROUPS_URI}/#{group_id}/collaborations"
|
72
|
+
collaborations = get_with_pagination(uri)
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|