strongmind-platform-sdk 3.1.5 → 3.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: 4a8ff326fbdb603f695f73f4afc25d3e47dcc29d8d2079914252e402fcd93fe9
4
- data.tar.gz: 9f1df694615285f266cccf00c3262e1cb83d1b155a9496a94bbee4526633ff4b
3
+ metadata.gz: 4d3e7692a1585b6660f3127296b51489fe91abe306d673149a089562d05e9637
4
+ data.tar.gz: 7922d450c254e2dc3dece30d5440f8a56232039327400740198e4fb4d032e645
5
5
  SHA512:
6
- metadata.gz: a265734af8c965df1bf25051d7bbc9902f0e46d9e395ac6c7a476959aef003bbdb6a2271ad53e8be44de9d675c6488976d884abe2600fda938373c32e33173bb
7
- data.tar.gz: 88e4d2fdbddcbdc46e6b49fa6b2195cace72021fff945ef8151eb33ce1c335ca0ce0ddf33d8079c5944ee16d8d914efcf5dbe62304259a15610b9a486bdc1f24
6
+ metadata.gz: ea6585723a59c9f2731141f41bff045fc43ea18a61a7767e74cb75f3f317e4d800e4088669ebe43d4da7f7707234b8543f7764883187415a1bc59a27ff4db124
7
+ data.tar.gz: ebabea43dba9197fa0ef7cfec80fa894a004458f25a10b2a41de6ae7234511ec6cc321cb3a67daa42f85286bf9614ff80580abd7a189732ea2af7260287b452e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- strongmind-platform-sdk (3.1.5)
4
+ strongmind-platform-sdk (3.2.0)
5
5
  aws-sdk-secretsmanager (~> 1.66)
6
6
  devise
7
7
  faraday (~> 2.5, >= 2.5.2)
@@ -40,16 +40,16 @@ GEM
40
40
  ast (2.4.2)
41
41
  attr_required (1.0.1)
42
42
  aws-eventstream (1.2.0)
43
- aws-partitions (1.834.0)
43
+ aws-partitions (1.843.0)
44
44
  aws-sdk-core (3.185.1)
45
45
  aws-eventstream (~> 1, >= 1.0.2)
46
46
  aws-partitions (~> 1, >= 1.651.0)
47
47
  aws-sigv4 (~> 1.5)
48
48
  jmespath (~> 1, >= 1.6.1)
49
- aws-sdk-secretsmanager (1.83.0)
49
+ aws-sdk-secretsmanager (1.84.0)
50
50
  aws-sdk-core (~> 3, >= 3.184.0)
51
51
  aws-sigv4 (~> 1.1)
52
- aws-sigv4 (1.6.0)
52
+ aws-sigv4 (1.6.1)
53
53
  aws-eventstream (~> 1, >= 1.0.2)
54
54
  bcrypt (3.1.19)
55
55
  bindata (2.4.15)
@@ -57,7 +57,7 @@ GEM
57
57
  concurrent-ruby (1.2.2)
58
58
  crass (1.0.6)
59
59
  date (3.3.3)
60
- devise (4.9.2)
60
+ devise (4.9.3)
61
61
  bcrypt (~> 3.0)
62
62
  orm_adapter (~> 0.1)
63
63
  railties (>= 4.1.0)
@@ -102,9 +102,9 @@ GEM
102
102
  net-smtp
103
103
  method_source (1.0.0)
104
104
  mini_mime (1.1.5)
105
- mini_portile2 (2.8.4)
105
+ mini_portile2 (2.8.5)
106
106
  minitest (5.18.0)
107
- net-imap (0.4.1)
107
+ net-imap (0.4.2)
108
108
  date
109
109
  net-protocol
110
110
  net-pop (0.1.2)
@@ -178,7 +178,7 @@ GEM
178
178
  rainbow (3.1.1)
179
179
  rake (13.0.6)
180
180
  regexp_parser (2.8.0)
181
- responders (3.1.0)
181
+ responders (3.1.1)
182
182
  actionpack (>= 5.2)
183
183
  railties (>= 5.2)
184
184
  rexml (3.2.5)
@@ -217,7 +217,7 @@ GEM
217
217
  attr_required (>= 0.0.5)
218
218
  faraday (~> 2.0)
219
219
  faraday-follow_redirects
220
- thor (1.2.2)
220
+ thor (1.3.0)
221
221
  timeout (0.4.0)
222
222
  typhoeus (1.4.0)
223
223
  ethon (>= 0.9.0)
data/README.md CHANGED
@@ -11,7 +11,7 @@ First [configure your GitHub credentials](#configure-github-credentials)
11
11
  Install the gem and add to the application's Gemfile by executing:
12
12
 
13
13
  ```
14
- gem "strongmind-platform-sdk", "~> 3.1.4"
14
+ gem "strongmind-platform-sdk", "~> 3.2.0"
15
15
  ```
16
16
 
17
17
  If bundler is not being used to manage dependencies, install the gem by executing:
@@ -110,3 +110,6 @@ Create PowerSchool Client:
110
110
 
111
111
  Create IdMapper Client:
112
112
  `id_mapper_client = PlatformSdk::IdMapper::Client.new(domain: 'ID_MAPPER_DOMAIN', token: 'SECRET_TOKEN')`
113
+
114
+ Create Pencil Spaces Client:
115
+ `pencil_spaces_client = PlatformSdk::PencilSpaces::Client.new('BASE_URL', 'BEARER_TOKEN')`
@@ -0,0 +1,190 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformSdk
4
+ module PencilSpaces
5
+ # OneRoster Client which wraps the swagger generated OneRoster Management APIs
6
+ class Client
7
+ attr_reader :access_token, :base_url, :conn
8
+
9
+ # The API only supports these roles for API managed users
10
+ VALID_API_USER_ROLES = %i[Teacher Student].freeze
11
+ # The API only supports these roles for users in a space
12
+ VALID_SPACE_ROLES = %i[host participant].freeze
13
+ DEFAULT_VISIBILITY = "private"
14
+
15
+ def initialize(base_url, access_token, conn: nil)
16
+ @access_token = access_token
17
+ @base_url = base_url
18
+ @conn = conn || build_connection
19
+ end
20
+
21
+ # Get a list of Spaces accessible by the account associated with your API key
22
+ # @param [Hash] opts the optional parameters
23
+ # @option opts [Integer] :page_number **(Optional)** - The page number of the items to return. The number of items in a page is controlled by the `pageSize` parameter.
24
+ # @option opts [Integer] :page_size **(Optional)** - The max number of items to return. Setting a larger `pageSize` may result in a longer querying times
25
+ # @option opts [String] :filters **(Optional)** - A base64 encoded string of the filters you wish to apply to the query. See `spacesFilterSchema` for details on all the filters applicable to your query
26
+ # @return [JSON]
27
+ def spaces(opts = {})
28
+ # query parameters
29
+ query_params = opts[:query_params] || {}
30
+ query_params[:pageNumber] = opts[:page_number] unless opts[:page_number].nil?
31
+ query_params[:pageSize] = opts[:page_size] unless opts[:page_size].nil?
32
+ query_params[:filters] = opts[:filters] unless opts[:filters].nil?
33
+
34
+ response = get("/spaces", query_params)
35
+ response.body
36
+ end
37
+
38
+ # Get details for a particular Space
39
+ # @param [String] space_id
40
+ # @return [JSON] The space object for the requested space_id
41
+ def space(space_id)
42
+ resource_path = "/spaces/#{space_id}"
43
+ response = get(resource_path)
44
+ response.body
45
+ end
46
+
47
+ # Create a new Space
48
+ # @param [String] title
49
+ # @param [Array<PlatformSdk::PencilSpaces::Models::UserWithRole>] hosts **(Optional)** Role is not required
50
+ # @param [Array<PlatformSdk::PencilSpaces::Models::UserWithRole>] participants **(Optional)** Role is not required
51
+ # @param [String] visibility **(Optional)** Default is "private"
52
+ # @return [JSON] The newly created space
53
+ def create_space(title, hosts: [], participants: [], visibility: DEFAULT_VISIBILITY)
54
+ body = {
55
+ title:,
56
+ visibility:,
57
+ hosts: hosts.map(&:as_json),
58
+ participants: participants.map(&:as_json),
59
+ notifyInvitees: false
60
+ }
61
+ response = post("/spaces/create", body.to_json)
62
+ response.body
63
+ end
64
+
65
+ # Get a list of Users accessible by the account associated with your API key
66
+ # @param [Hash] opts the optional parameters
67
+ # @option opts [Integer] :page_number **(Optional)** - The page number of the items to return. The number of items in a page is controlled by the &#x60;pageSize&#x60; parameter.
68
+ # @option opts [Integer] :page_size **(Optional)** - The max number of items to return. Setting a larger &#x60;pageSize&#x60; may result in a longer querying times
69
+ # @option opts [String] :filters **(Optional)** - A base64 encoded string of the filters you wish to apply to the query. See &#x60;spacesFilterSchema&#x60; for details on all the filters applicable to your query
70
+ # @return [JSON] A list of Pencil Spaces users
71
+ def users(opts = {})
72
+ # query parameters
73
+ query_params = opts[:query_params] || {}
74
+ query_params[:pageNumber] = opts[:page_number] unless opts[:page_number].nil?
75
+ query_params[:pageSize] = opts[:page_size] unless opts[:page_size].nil?
76
+ query_params[:filters] = opts[:filters] unless opts[:filters].nil?
77
+
78
+ response = get("/users", query_params)
79
+ response.body
80
+ end
81
+
82
+ # Get details for a particular User
83
+ # @param [String] user_id
84
+ # @return [JSON] The user object for the requested user_id
85
+ def user(user_id)
86
+ response = get("/users/#{user_id}")
87
+ response.body
88
+ end
89
+
90
+ # Create a login link for a user
91
+ # @param [String] user_id
92
+ # @param [String] redirect_url **(Optional)** The URL to redirect the user to after they login
93
+ # @return [JSON] JSON with a login link for the user, i.e. { "url" => "https://pencilspaces.com/login?token=123" }
94
+ def authorize_user(user_id, redirect_url: nil)
95
+ raise ArgumentError, "user_id must have a value" if user_id.nil?
96
+
97
+ query_params = {}
98
+ query_params[:redirectUrl] = redirect_url unless redirect_url.nil?
99
+ response = get("/users/#{user_id}/authorize", query_params)
100
+ response.body
101
+ end
102
+
103
+ def create_api_user(name, role)
104
+ validate_api_user_role!(role)
105
+ body = { name:, userRole: role }
106
+ response = @conn.post("/users/createAPIUser", body.to_json)
107
+ response.body
108
+ end
109
+
110
+ # Update users in a space
111
+ # @param [String] space_id
112
+ # @param [Array<PlatformSdk::PencilSpaces::Models::UserWithRole>] users_to_add **(Optional)** Role is required
113
+ # @param [Array<PlatformSdk::PencilSpaces::Models::UserWithRole>] users_to_modify **(Optional)** Role is required
114
+ # @param [Array<PlatformSdk::PencilSpaces::Models::UserWithRole>] users_to_remove **(Optional)**
115
+ # @return [JSON] The updated space
116
+ def update_users_in_space(space_id, users_to_add: [], users_to_modify: [], users_to_remove: [])
117
+ validate_update_users_in_space_args!(space_id, users_to_add, users_to_modify, users_to_remove)
118
+
119
+ body = {
120
+ notifyInvitees: false,
121
+ addUsers: users_to_add.map(&:as_json),
122
+ modifyUsers: users_to_modify.map(&:as_json),
123
+ removeUsers: users_to_remove.map(&:as_json)
124
+ }
125
+
126
+ response = patch("/spaces/#{space_id}/updateUsers", body.to_json)
127
+ response.body
128
+ end
129
+
130
+ private
131
+
132
+ def build_connection
133
+ Faraday.new(@base_url) do |faraday|
134
+ faraday.headers = default_headers
135
+ faraday.adapter Faraday.default_adapter
136
+ faraday.response :json, content_type: /\bjson$/, parser_options: { symbolize_names: true }
137
+ faraday.response :raise_error
138
+ end
139
+ end
140
+
141
+ def default_headers
142
+ {
143
+ "Content-Type" => "application/json",
144
+ "Authorization" => "Bearer #{access_token}"
145
+ }
146
+ end
147
+
148
+ def get(path, params = {})
149
+ @conn.get(path, params)
150
+ end
151
+
152
+ def post(path, body)
153
+ @conn.post(path, body)
154
+ end
155
+
156
+ def patch(path, body)
157
+ @conn.patch(path, body)
158
+ end
159
+
160
+ def validate_update_users_in_space_args!(space_id, users_to_add, users_to_modify, users_to_remove)
161
+ raise ArgumentError, "space_id must have a value" if space_id.nil?
162
+
163
+ if [users_to_add, users_to_modify, users_to_remove].all?(&:empty?)
164
+ raise ArgumentError, "Must provide at least one of users_to_add, users_to_modify, users_to_remove"
165
+ end
166
+
167
+ needs_role = users_to_add + users_to_modify
168
+ needs_role.each do |user|
169
+ if user.class != PlatformSdk::PencilSpaces::Models::UserWithRole
170
+ raise ArgumentError, "users_to_add/users_to_modify must be an array of UserWithRole objects"
171
+ end
172
+
173
+ raise ArgumentError, "users_to_add and users_to_modify objects must have a role" if user.role.nil?
174
+ end
175
+
176
+ users_to_remove.each do |user|
177
+ if user.class != PlatformSdk::PencilSpaces::Models::UserWithRole
178
+ raise ArgumentError, "users_to_remove must be an array of UserWithRole objects (role not required)"
179
+ end
180
+ end
181
+ end
182
+
183
+ def validate_api_user_role!(role)
184
+ return if VALID_API_USER_ROLES.include?(role)
185
+
186
+ raise ArgumentError, "Invalid role: #{role}, must be one of #{VALID_API_USER_ROLES}"
187
+ end
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformSdk
4
+ module PencilSpaces
5
+ module Constants
6
+ TEACHER_ROLE = :Teacher
7
+ STUDENT_ROLE = :Student
8
+ ADMIN_ROLE = :InstitutionAdmin
9
+ SPACE_HOST_ROLE = :host
10
+ SPACE_PARTICIPANT_ROLE = :participant
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlatformSdk
4
+ module PencilSpaces
5
+ module Models
6
+ class UserWithRole
7
+ attr_accessor :role, :user_id
8
+
9
+ VALID_ROLES = %i[host participant].freeze
10
+
11
+ def initialize(user_id, user_role_in_space = nil)
12
+ @user_id = user_id
13
+ return unless user_role_in_space
14
+
15
+ validate_role!(user_role_in_space)
16
+ @role = user_role_in_space
17
+ end
18
+
19
+ def as_json
20
+ json = {}
21
+ instance_variables.each do |var|
22
+ key = var.to_s.delete("@")
23
+ key = "userId" if key == "user_id"
24
+ json[key] = instance_variable_get(var).to_s if instance_variable_get(var)
25
+ end
26
+ json
27
+ end
28
+
29
+ private
30
+
31
+ def validate_role!(role)
32
+ return if VALID_ROLES.include?(role)
33
+
34
+ raise ArgumentError, "Invalid role: #{role}, must be one of #{VALID_ROLES}"
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "platform_sdk/pencil_spaces/models/user_with_role"
4
+
5
+ module PlatformSdk
6
+ module PencilSpaces
7
+ module Models
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "platform_sdk/pencil_spaces/client"
4
+ require "platform_sdk/pencil_spaces/constants"
5
+ require "platform_sdk/pencil_spaces/models"
6
+
7
+
8
+ module PlatformSdk
9
+ module PencilSpaces
10
+ class Error < StandardError; end
11
+ end
12
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PlatformSdk
4
- VERSION = "3.1.5"
4
+ VERSION = "3.2.0"
5
5
  end
data/lib/platform_sdk.rb CHANGED
@@ -8,6 +8,7 @@ require "platform_sdk/aws"
8
8
  require "platform_sdk/id_mapper"
9
9
  require "platform_sdk/edkey"
10
10
  require "platform_sdk/data_pipeline"
11
+ require "platform_sdk/pencil_spaces"
11
12
 
12
13
  module PlatformSdk
13
14
  class Error < StandardError; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strongmind-platform-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.5
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Platform Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-10-11 00:00:00.000000000 Z
11
+ date: 2023-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -199,6 +199,11 @@ files:
199
199
  - lib/platform_sdk/identity/clients.rb
200
200
  - lib/platform_sdk/one_roster.rb
201
201
  - lib/platform_sdk/one_roster/client.rb
202
+ - lib/platform_sdk/pencil_spaces.rb
203
+ - lib/platform_sdk/pencil_spaces/client.rb
204
+ - lib/platform_sdk/pencil_spaces/constants.rb
205
+ - lib/platform_sdk/pencil_spaces/models.rb
206
+ - lib/platform_sdk/pencil_spaces/models/user_with_role.rb
202
207
  - lib/platform_sdk/power_school.rb
203
208
  - lib/platform_sdk/power_school/client.rb
204
209
  - lib/platform_sdk/power_school/special_program.rb