sharepoint_api 2.0.0 → 2.3.1

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