sharepoint_api 2.0.0 → 2.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5551919c5f64298b80dc13b11ce01ac83414add68d5dc396cb9eb63c92d0f442
4
- data.tar.gz: 02f98ff2506480e49310ceeefb041b8f5ca6d8099de499776307d765c0777e1d
3
+ metadata.gz: 7a9fa238166ddb188042912a71988869b1b443fa55ebd214be69bc6a139f52b4
4
+ data.tar.gz: db2dd49b85094a1235363c6d0cc6960722d7c4b7400b82d02ce2e1a2f4b44b8b
5
5
  SHA512:
6
- metadata.gz: 520c21578a7fa4bde6c3e44a063782a2fb6d453ff74d0ad593e1f7d5eac005427ce6734de67858b174c315d4337a370d93342dd8ca5b7196456c9201b8273a88
7
- data.tar.gz: dca7e0ad99915314213295fc60a7d83c6bf70bccded29fefdd55e57aad3717e9561acbc4939a7678e4153e37ac1fdd13d682a36bf44fbc014160a9373ce2df24
6
+ metadata.gz: 697f6dd8982e69879bf30fc086596803ee8198ae52f129286949cbcb728ca2d14491e9ec2416c77a44e380adf86dfbe9175d4c21973be4c1d5790d2324bd5b1c
7
+ data.tar.gz: e904aae5d3086713aec14cd31a486a1195822fa12d4e76a40e8a598dbf5468aa8d0a904d9469602354e62d2e345366998396fca3157a26cf17fe71d18bf19f92
data/CHANGELOG.md CHANGED
@@ -1,4 +1,13 @@
1
- ## [2.0.0] - 2021-01-12
1
+ ## [2.3.1] - 2021-11-02
2
+ * Add ability to rename groups
3
+
4
+ ## [2.2.0] - 2021-07-06
5
+ * Use $select queries to vastly speed up FileInfo#version lookup.
6
+
7
+ ## [2.1.0] - 2021-07-06
8
+ * 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.
9
+
10
+ ## [2.0.0] - 2021-06-28
2
11
  * Update proof-sharepoint-ruby to escape apostrophes.
3
12
  * Change usage of apostrophe escaping.
4
13
 
data/Gemfile.lock CHANGED
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sharepoint_api (2.0.0)
4
+ sharepoint_api (2.3.1)
5
5
  addressable (~> 2.7)
6
6
  proof-sharepoint-ruby (~> 2.0)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- addressable (2.7.0)
11
+ addressable (2.8.0)
12
12
  public_suffix (>= 2.0.2, < 5.0)
13
13
  ast (2.4.1)
14
14
  byebug (11.1.3)
@@ -120,4 +120,4 @@ DEPENDENCIES
120
120
  sharepoint_api!
121
121
 
122
122
  BUNDLED WITH
123
- 2.2.4
123
+ 2.2.29
@@ -4,6 +4,31 @@ 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
+ Versions/Url
18
+ ].join(',')
19
+ "$select=Name,UpdatedAt,MajorVersion,TimeLastModified,#{sub_query}&$expand=#{sub_query}"
20
+ end.freeze
21
+
22
+ ##
23
+ # Get just enough data to build a FileInfo object that suports to_h
24
+ FILE_SELECT_QUERY = begin
25
+ sub_query = %w[
26
+ ModifiedBy/LoginName
27
+ ListItemAllFields/Id
28
+ ].join(',')
29
+ "$select=Name,UpdatedAt,MajorVersion,TimeLastModified,Versions,#{sub_query}&$expand=#{sub_query}"
30
+ end.freeze
31
+
7
32
  extend Forwardable
8
33
  attr_reader :version, :version_id, :file, :updated_at
9
34
 
@@ -45,7 +70,7 @@ class SharepointApi
45
70
  file_version.id,
46
71
  created_at: Time.parse(file_version.created),
47
72
  current: file_version.is_current_version,
48
- creator_login: file_version.creator&.login_name
73
+ creator_login: safe_created_by(file_version)&.login_name
49
74
  )
50
75
  end
51
76
 
@@ -75,5 +100,16 @@ class SharepointApi
75
100
 
76
101
  raise(FileInfoError, e.message)
77
102
  end
103
+
104
+ def safe_created_by(file_version)
105
+ return file_version.creator if file_version.data['CreatedBy']['__deferred']
106
+ return file_version.created_by if file_version.data['CreatedBy']['__metadata']
107
+
108
+ nil
109
+ rescue Sharepoint::SPException => e
110
+ return nil if e.message =~ /User cannot be found/
111
+
112
+ raise(FileInfoError, e.message)
113
+ end
78
114
  end
79
115
  end
@@ -9,26 +9,19 @@ class SharepointApi
9
9
  def add_file(path, content)
10
10
  folder_path = File.dirname(path)
11
11
  file_name = encode_path(File.basename(path))
12
- begin
13
- retries ||= 0
14
- FileInfo.wrap(
15
- site.query(
16
- :post,
17
- "GetFolderByServerRelativeUrl('#{site_relative_path(folder_path)}')/Files" \
18
- "/Add(overwrite=true,url='#{file_name}')",
19
- content
20
- )
12
+ FileInfo.wrap(
13
+ site.query(
14
+ :post,
15
+ "GetFolderByServerRelativeUrl('#{site_relative_path(folder_path)}')/Files" \
16
+ "/Add(overwrite=true,url='#{file_name}')?#{FileInfo::FILE_SELECT_QUERY}",
17
+ content
21
18
  )
22
- rescue Sharepoint::SPException => e
23
- reraise_if_lock_error(e)
24
-
25
- log_as(__method__, e)
26
- log_as(__method__, "adding folder with path #{folder_path}")
27
- add_folder(folder_path)
28
- retry if (retries += 1) < 2
29
- log_as(__method__, e, level: :warn)
30
- nil
31
- end
19
+ )
20
+ rescue Sharepoint::SPException => e
21
+ reraise_if_lock_error(e)
22
+
23
+ log_as(__method__, e)
24
+ nil
32
25
  end
33
26
 
34
27
  def file_exists?(path)
@@ -39,11 +32,18 @@ class SharepointApi
39
32
  false
40
33
  end
41
34
 
35
+ ##
36
+ # Querying a non-existent file will raise a 500 error so we check for existence first.
42
37
  def find_file(path)
38
+ return nil unless file_exists?(path)
39
+
43
40
  server_path = server_relative_path(path)
44
- FileInfo.wrap(
45
- site.query(:get, "GetFileByServerRelativeUrl('#{server_path}')")
46
- )
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)
47
47
  rescue Sharepoint::SPException => e
48
48
  log_as(__method__, e)
49
49
  nil
@@ -117,8 +117,14 @@ class SharepointApi
117
117
 
118
118
  def files_in_folder(path)
119
119
  server_path = server_relative_path(path)
120
- site.query(:get, "GetFolderByServerRelativeUrl('#{server_path}')/Files").
121
- 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) }
122
128
  rescue Sharepoint::SPException => e
123
129
  log_as(__method__, e)
124
130
  nil
@@ -45,6 +45,22 @@ class SharepointApi
45
45
  false
46
46
  end
47
47
 
48
+ # to rename a sp group when the acronym changes
49
+ def rename_group(old_group_name, new_group_name)
50
+ escaped_group_name = encode_path(old_group_name)
51
+ site.query(:post, "SiteGroups/GetByName('#{escaped_group_name}')", {
52
+ '__metadata' => { 'type': 'SP.Group' },
53
+ 'Title' => new_group_name,
54
+ 'Description' => "Access Group for #{new_group_name}"
55
+ }.to_json) do |curl|
56
+ curl.headers['X-HTTP-Method'] = 'MERGE'
57
+ end
58
+ true
59
+ rescue Sharepoint::SPException => e
60
+ log_as(__method__, e)
61
+ false
62
+ end
63
+
48
64
  ##
49
65
  # This also removes any role definitions the groups is using.
50
66
  def remove_group(group_name)
@@ -1,3 +1,3 @@
1
1
  class SharepointApi
2
- VERSION = '2.0.0'.freeze
2
+ VERSION = '2.3.1'.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.0.0
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kalek
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-06-29 00:00:00.000000000 Z
13
+ date: 2021-11-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: addressable