sharepoint_api 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a6e03f01804cbcdcbe4ab35aa6073790f1a57b1500438930c3b48107a4745416
4
- data.tar.gz: 7e38e7750fc347cbf61f6fa51bd543cb7614151c718b81d2c48f4953a2f5dae2
3
+ metadata.gz: eac6402d99bf11213a9a8edc411745d2056ec8ffd3846f5579b91e3383709515
4
+ data.tar.gz: ef5281daee7e600d3a67a480c561e76779eff8fcb4e8bec8005894500dc43361
5
5
  SHA512:
6
- metadata.gz: 8c2a532ddd27e3e66d6bc43631e8598a4c868b5dca7f0ff5a4041ebf8d742853da41dc100b1586e37c78d2d6313d48e993ee1a391cd063772d798703796b1398
7
- data.tar.gz: dccd4a1f20f644860ecc8a23112987ceaba68474cfbbc7d389dea5a71631e9d4a06ae73a2ade777f1596d9744aa7e0e3931e3c007cd66f6f64245dba710f20aa
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sharepoint_api (2.1.0)
4
+ sharepoint_api (2.2.0)
5
5
  addressable (~> 2.7)
6
6
  proof-sharepoint-ruby (~> 2.0)
7
7
 
@@ -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.creator&.login_name
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
- FileInfo.wrap(
38
- site.query(:get, "GetFileByServerRelativeUrl('#{server_path}')")
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
- map { |file| FileInfo.new(file) }
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
@@ -1,3 +1,3 @@
1
1
  class SharepointApi
2
- VERSION = '2.1.0'.freeze
2
+ VERSION = '2.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sharepoint_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kalek