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 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