sharepoint_api 2.1.0 → 2.2.0
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 +4 -4
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +1 -1
- data/lib/sharepoint_api/file_info.rb +36 -1
- data/lib/sharepoint_api/file_system.rb +19 -6
- data/lib/sharepoint_api/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eac6402d99bf11213a9a8edc411745d2056ec8ffd3846f5579b91e3383709515
|
4
|
+
data.tar.gz: ef5281daee7e600d3a67a480c561e76779eff8fcb4e8bec8005894500dc43361
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f3a17b7be2e3a31b9d45f26d407750979d6d2d9946e5b5c46030eb9d49f06a3c02557bcfc926ddb6277828fe962920780d9cca5dc67465b6bea5267ec27c113
|
7
|
+
data.tar.gz: ce320268dcc75d3348bab171a58874e075590bbb2a2e2e49c86a05d6bcbaea1568b3f832732506fe9c17f35fefb7ffbf99705c509e63079070dbd6f6538f2c9c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
## [2.2.0] - 2021-07-06
|
2
|
+
* Use $select queries to vastly speed up FileInfo#version lookup.
|
3
|
+
|
1
4
|
## [2.1.0] - 2021-07-06
|
2
5
|
* Drop feature of add_file creating a folder if one didn't exist as it introduced a security issue where a folder could be created that didn't have access restricted to routing participants.
|
3
6
|
|
data/Gemfile.lock
CHANGED
@@ -4,6 +4,30 @@ class SharepointApi
|
|
4
4
|
class FileInfo
|
5
5
|
class FileInfoError < SharepointError; end
|
6
6
|
|
7
|
+
##
|
8
|
+
# Get all data required to build a FileInfo object without subsequent API calls.
|
9
|
+
FILE_SELECT_QUERY_WITH_VERSIONS = begin
|
10
|
+
sub_query = %w[
|
11
|
+
ModifiedBy/LoginName
|
12
|
+
ListItemAllFields/Id
|
13
|
+
Versions/Id
|
14
|
+
Versions/Created
|
15
|
+
Versions/IsCurrentVersion
|
16
|
+
Versions/CreatedBy/LoginName
|
17
|
+
].join(',')
|
18
|
+
"$select=Name,UpdatedAt,MajorVersion,TimeLastModified,#{sub_query}&$expand=#{sub_query}"
|
19
|
+
end.freeze
|
20
|
+
|
21
|
+
##
|
22
|
+
# Get just enough data to build a FileInfo object that suports to_h
|
23
|
+
FILE_SELECT_QUERY = begin
|
24
|
+
sub_query = %w[
|
25
|
+
ModifiedBy/LoginName
|
26
|
+
ListItemAllFields/Id
|
27
|
+
].join(',')
|
28
|
+
"$select=Name,UpdatedAt,MajorVersion,TimeLastModified,Versions,#{sub_query}&$expand=#{sub_query}"
|
29
|
+
end.freeze
|
30
|
+
|
7
31
|
extend Forwardable
|
8
32
|
attr_reader :version, :version_id, :file, :updated_at
|
9
33
|
|
@@ -45,7 +69,7 @@ class SharepointApi
|
|
45
69
|
file_version.id,
|
46
70
|
created_at: Time.parse(file_version.created),
|
47
71
|
current: file_version.is_current_version,
|
48
|
-
creator_login: file_version
|
72
|
+
creator_login: safe_created_by(file_version)&.login_name
|
49
73
|
)
|
50
74
|
end
|
51
75
|
|
@@ -75,5 +99,16 @@ class SharepointApi
|
|
75
99
|
|
76
100
|
raise(FileInfoError, e.message)
|
77
101
|
end
|
102
|
+
|
103
|
+
def safe_created_by(file_version)
|
104
|
+
return file_version.creator if file_version.data['CreatedBy']['__deferred']
|
105
|
+
return file_version.created_by if file_version.data['CreatedBy']['__metadata']
|
106
|
+
|
107
|
+
nil
|
108
|
+
rescue Sharepoint::SPException => e
|
109
|
+
return nil if e.message =~ /User cannot be found/
|
110
|
+
|
111
|
+
raise(FileInfoError, e.message)
|
112
|
+
end
|
78
113
|
end
|
79
114
|
end
|
@@ -13,7 +13,7 @@ class SharepointApi
|
|
13
13
|
site.query(
|
14
14
|
:post,
|
15
15
|
"GetFolderByServerRelativeUrl('#{site_relative_path(folder_path)}')/Files" \
|
16
|
-
"/Add(overwrite=true,url='#{file_name}')",
|
16
|
+
"/Add(overwrite=true,url='#{file_name}')?#{FileInfo::FILE_SELECT_QUERY}",
|
17
17
|
content
|
18
18
|
)
|
19
19
|
)
|
@@ -32,11 +32,18 @@ class SharepointApi
|
|
32
32
|
false
|
33
33
|
end
|
34
34
|
|
35
|
+
##
|
36
|
+
# Querying a non-existent file will raise a 500 error so we check for existence first.
|
35
37
|
def find_file(path)
|
38
|
+
return nil unless file_exists?(path)
|
39
|
+
|
36
40
|
server_path = server_relative_path(path)
|
37
|
-
|
38
|
-
|
39
|
-
)
|
41
|
+
result = site.query(:get, "GetFileByServerRelativeUrl('#{server_path}')?#{FileInfo::FILE_SELECT_QUERY_WITH_VERSIONS}", nil, true)
|
42
|
+
result = JSON.parse(result)
|
43
|
+
result['d']['Versions'] = Sharepoint::Site.make_object_from_response(site, { 'd' => result['d']['Versions'] })
|
44
|
+
file = Sharepoint::Site.make_object_from_response(site, result)
|
45
|
+
|
46
|
+
FileInfo.wrap(file)
|
40
47
|
rescue Sharepoint::SPException => e
|
41
48
|
log_as(__method__, e)
|
42
49
|
nil
|
@@ -110,8 +117,14 @@ class SharepointApi
|
|
110
117
|
|
111
118
|
def files_in_folder(path)
|
112
119
|
server_path = server_relative_path(path)
|
113
|
-
site.query(:get, "GetFolderByServerRelativeUrl('#{server_path}')/Files")
|
114
|
-
|
120
|
+
result = site.query(:get, "GetFolderByServerRelativeUrl('#{server_path}')/Files?#{FileInfo::FILE_SELECT_QUERY_WITH_VERSIONS}", nil, true)
|
121
|
+
result = JSON.parse(result)
|
122
|
+
result.dig('d', 'results')&.map do |file_result|
|
123
|
+
file_result['Versions'] = Sharepoint::Site.make_object_from_response(site, { 'd' => file_result['Versions'] })
|
124
|
+
end
|
125
|
+
files = Sharepoint::Site.make_object_from_response(site, result)
|
126
|
+
|
127
|
+
files.map { |file| FileInfo.new(file) }
|
115
128
|
rescue Sharepoint::SPException => e
|
116
129
|
log_as(__method__, e)
|
117
130
|
nil
|