ILIAS  release_8 Revision v8.24
Membership.php
Go to the documentation of this file.
1<?php
2
20
24
32class Membership extends Service
33{
37 public const MEDIA_TYPE_MEMBERSHIPS_V1 = 'application/vnd.ims.lis.v2.membershipcontainer+json';
38
42 public const MEDIA_TYPE_MEMBERSHIPS_NRPS = 'application/vnd.ims.lti-nrps.v2.membershipcontainer+json';
43
47 public static string $SCOPE = 'https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly';
48
52 public static int $defaultLimit = 100;
53
59 private $source = null;
60
68 private ?int $limit;
69
77 private bool $pagingMode;
78
87 public function __construct($source, string $endpoint, string $format = self::MEDIA_TYPE_MEMBERSHIPS_V1, int $limit = null, bool $pagingMode = false)
88 {
89 $platform = $source->getPlatform();
91 $this->scope = self::$SCOPE;
92 $this->mediaType = $format;
93 $this->source = $source;
94 $this->limit = $limit;
95 $this->pagingMode = $pagingMode;
96 }
97
104 public function get(string $role = null, int $limit = null)
105 {
106 return $this->getMembers(false, $role, $limit);
107 }
108
115 public function getWithGroups(string $role = null, int $limit = null)
116 {
117 return $this->getMembers(true, $role, $limit);
118 }
119
127 private function getMembers(bool $withGroups, string $role = null, int $limit = null)
128 {
129 //added
130 $oldUsers = [];
131
132 $isLink = is_a($this->source, 'ceLTIc\LTI\ResourceLink');
133 $parameters = array();
134 if (!empty($role)) {
135 $parameters['role'] = $role;
136 }
137 if (is_null($limit)) {
139 }
140 if (is_null($limit)) {
142 }
143 if (!empty($limit)) {
144 $parameters['limit'] = strval($limit);
145 }
146 if ($isLink) {
147 $context = $this->source->getContext();
148 if (!empty($this->source->getId())) {
149 $parameters['rlid'] = $this->source->getId();
150 }
151 if ($withGroups && ($this->mediaType === self::MEDIA_TYPE_MEMBERSHIPS_NRPS) && !empty($context)) {
152 $context->getGroups();
153 $this->source->groupSets = $context->groupSets;
154 $this->source->groups = $context->groups;
155 $parameters['groups'] = 'true';
156 }
157 } elseif ($withGroups && ($this->mediaType === self::MEDIA_TYPE_MEMBERSHIPS_NRPS)) {
158 $this->source->getGroups();
159 $parameters['groups'] = 'true';
160 }
161 $userResults = array();
162 $memberships = array();
164 do {
165 $http = $this->send('GET', $parameters);
166 $url = '';
167 if (!empty($http) && $http->ok) {
168 $isjsonld = false;
169 if (isset($http->responseJson->pageOf) && isset($http->responseJson->pageOf->membershipSubject) &&
170 isset($http->responseJson->pageOf->membershipSubject->membership)) {
171 $isjsonld = true;
172 $memberships = array_merge($memberships, $http->responseJson->pageOf->membershipSubject->membership);
173 if (!empty($http->responseJson->nextPage)) {
174 $http->relativeLinks['next'] = $http->responseJson->nextPage;
175 }
176 } elseif (isset($http->responseJson->members)) {
177 $memberships = array_merge($memberships, $http->responseJson->members);
178 }
179 if (!$this->pagingMode && $http->hasRelativeLink('next')) {
180 $url = $http->getRelativeLink('next');
181 $this->endpoint = $url;
182 $parameters = array();
183 }
184 } else {
185 $userResults = false;
186 }
187 } while ($url);
188 $this->endpoint = $endpoint;
189 if ($userResults !== false) {
190 if ($isLink) {
191// $oldUsers = $this->source->getUserResultSourcedIDs(true, LTI\Tool::ID_SCOPE_RESOURCE);
192 $oldUsers = $this->source->getUserResultSourcedIDs(true, \ILIAS\LTI\ToolProvider\Tool::ID_SCOPE_RESOURCE);
193 }
194 foreach ($memberships as $membership) {
195 if ($isjsonld) {
196 $member = $membership->member;
197 if ($isLink) {
198// $userresult = LTI\UserResult::fromResourceLink($this->source, $member->userId);
199 $userresult = \ILIAS\LTI\ToolProvider\UserResult::fromResourceLink($this->source, $member->userId);
200 } else {
201// $userresult = new LTI\UserResult();
202 $userresult = new \ILIAS\LTI\ToolProvider\UserResult();
203 $userresult->ltiUserId = $member->userId;
204 }
205
206 // Set the user name
207 $firstname = (isset($member->givenName)) ? $member->givenName : '';
208 $lastname = (isset($member->familyName)) ? $member->familyName : '';
209 $fullname = (isset($member->name)) ? $member->name : '';
210 $userresult->setNames($firstname, $lastname, $fullname);
211
212 // Set the sourcedId
213 if (isset($member->sourcedId)) {
214 $userresult->sourcedId = $member->sourcedId;
215 }
216
217 // Set the username
218 if (isset($member->ext_username)) {
219 $userresult->username = $member->ext_username;
220 } elseif (isset($member->ext_user_username)) {
221 $userresult->username = $member->ext_user_username;
222 } elseif (isset($member->custom_username)) {
223 $userresult->username = $member->custom_username;
224 } elseif (isset($member->custom_user_username)) {
225 $userresult->username = $member->custom_user_username;
226 }
227
228 // Set the user email
229 $email = (isset($member->email)) ? $member->email : '';
230 $userresult->setEmail($email, $this->source->getPlatform()->defaultEmail);
231
232 // Set the user roles
233 if (isset($membership->role)) {
234 $roles = $this->parseContextsInArray($http->responseJson->{'@context'}, $membership->role);
235// $userresult->roles = LTI\Tool::parseRoles($roles, LTI\Util::LTI_VERSION2);
236 $userresult->roles = \ILIAS\LTI\ToolProvider\Tool::parseRoles($roles, \ILIAS\LTI\ToolProvider\Util::LTI_VERSION2);
237 }
238
239 // If a result sourcedid is provided save the user
240 if ($isLink) {
241 $doSave = false;
242 if (isset($membership->message)) {
243 foreach ($membership->message as $message) {
244 if (isset($message->message_type) && (($message->message_type === 'basic-lti-launch-request') || ($message->message_type) === 'LtiResourceLinkRequest')) {
245 if (isset($message->lis_result_sourcedid)) {
246 $userresult->ltiResultSourcedId = $message->lis_result_sourcedid;
247 $doSave = true;
248 }
249 if (isset($message->ext)) {
250 if (empty($userresult->username)) {
251 if (!empty($message->ext->username)) {
252 $userresult->username = $message->ext->username;
253 } elseif (!empty($message->ext->user_username)) {
254 $userresult->username = $message->ext->user_username;
255 }
256 }
257 }
258 if (isset($message->custom)) {
259 if (empty($userresult->username)) {
260 if (!empty($message->custom->username)) {
261 $userresult->username = $message->custom->username;
262 } elseif (!empty($message->custom->user_username)) {
263 $userresult->username = $message->custom->user_username;
264 }
265 }
266 }
267 break;
268 }
269 }
270 }
271 if (!$doSave && isset($member->resultSourcedId)) {
272 $userresult->setResourceLinkId($this->source->getId());
273 $userresult->ltiResultSourcedId = $member->resultSourcedId;
274 $doSave = true;
275 }
276 if ($doSave) {
277 $userresult->save();
278 }
279 }
280 $userResults[] = $userresult;
281
282 // Remove old user (if it exists)
283 if ($isLink) {
284// unset($oldUsers[$userresult->getId(LTI\Tool::ID_SCOPE_RESOURCE)]);
285 unset($oldUsers[$userresult->getId(\ILIAS\LTI\ToolProvider\Tool::ID_SCOPE_RESOURCE)]);
286 }
287 } else { // Version 2
288 $member = $membership;
289 if ($isLink) {
290// $userresult = LTI\UserResult::fromResourceLink($this->source, $member->user_id);
291 $userresult = \ILIAS\LTI\ToolProvider\UserResult::fromResourceLink($this->source, $member->user_id);
292 } else {
293// $userresult = new LTI\UserResult();
294 $userresult = new \ILIAS\LTI\ToolProvider\UserResult();
295 $userresult->ltiUserId = $member->user_id;
296 }
297
298 // Set the user name
299 $firstname = (isset($member->given_name)) ? $member->given_name : '';
300 $lastname = (isset($member->family_name)) ? $member->family_name : '';
301 $fullname = (isset($member->name)) ? $member->name : '';
302 $userresult->setNames($firstname, $lastname, $fullname);
303
304 // Set the sourcedId
305 if (isset($member->lis_person_sourcedid)) {
306 $userresult->sourcedId = $member->lis_person_sourcedid;
307 }
308
309 // Set the user email
310 $email = (isset($member->email)) ? $member->email : '';
311 $userresult->setEmail($email, $this->source->getPlatform()->defaultEmail);
312
313 // Set the user roles
314 if (isset($member->roles)) {
315// $userresult->roles = LTI\Tool::parseRoles($member->roles, LTI\Util::LTI_VERSION2);
316 $userresult->roles = \ILIAS\LTI\ToolProvider\Tool::parseRoles($member->roles, \ILIAS\LTI\ToolProvider\Util::LTI_VERSION2);
317 }
318
319 // If a result sourcedid is provided save the user
320 if ($isLink) {
321 $doSave = false;
322 if (isset($member->message)) {
323 foreach ($member->message as $message) {
324 if (isset($message->{'https://purl.imsglobal.org/spec/lti/claim/message_type'}) && (($message->{'https://purl.imsglobal.org/spec/lti/claim/message_type'} === 'basic-lti-launch-request') || ($message->{'https://purl.imsglobal.org/spec/lti/claim/message_type'}) === 'LtiResourceLinkRequest')) {
325 if (isset($message->{'https://purl.imsglobal.org/spec/lti-bo/claim/basicoutcome'}) &&
326 isset($message->{'https://purl.imsglobal.org/spec/lti-bo/claim/basicoutcome'}->lis_result_sourcedid)) {
327 $userresult->ltiResultSourcedId = $message->{'https://purl.imsglobal.org/spec/lti-bo/claim/basicoutcome'}->lis_result_sourcedid;
328 $doSave = true;
329 }
330 if (isset($message->{'https://purl.imsglobal.org/spec/lti/claim/ext'})) {
331 if (empty($userresult->username)) {
332 if (!empty($message->{'https://purl.imsglobal.org/spec/lti/claim/ext'}->username)) {
333 $userresult->username = $message->{'https://purl.imsglobal.org/spec/lti/claim/ext'}->username;
334 } elseif (!empty($message->{'https://purl.imsglobal.org/spec/lti/claim/ext'}->user_username)) {
335 $userresult->username = $message->{'https://purl.imsglobal.org/spec/lti/claim/ext'}->user_username;
336 }
337 }
338 }
339 if (isset($message->{'https://purl.imsglobal.org/spec/lti/claim/custom'})) {
340 if (empty($userresult->username)) {
341 if (!empty($message->{'https://purl.imsglobal.org/spec/lti/claim/custom'}->username)) {
342 $userresult->username = $message->{'https://purl.imsglobal.org/spec/lti/claim/custom'}->username;
343 } elseif (!empty($message->{'https://purl.imsglobal.org/spec/lti/claim/custom'}->user_username)) {
344 $userresult->username = $message->{'https://purl.imsglobal.org/spec/lti/claim/custom'}->user_username;
345 }
346 }
347 }
348 break;
349 }
350 }
351 }
352 if ($doSave) {
353 $userresult->save();
354 }
355 }
356 $userResults[] = $userresult;
357 if (isset($member->group_enrollments)) {
358 $userresult->groups = array();
359 foreach ($member->group_enrollments as $group) {
360 $groupId = $group->group_id;
361 if (!array_key_exists($groupId, $this->source->groups)) {
362 $this->source->groups[$groupId] = array('title' => "Group {$groupId}");
363 }
364 if (!empty($this->source->groups[$groupId]['set'])) {
365 $this->source->groupSets[$this->source->groups[$groupId]['set']]['num_members']++;
366 if ($userresult->isStaff()) {
367 $this->source->groupSets[$this->source->groups[$groupId]['set']]['num_staff']++;
368 }
369 if ($userresult->isLearner()) {
370 $this->source->groupSets[$this->source->groups[$groupId]['set']]['num_learners']++;
371 }
372 }
373 $userresult->groups[] = $groupId;
374 }
375 }
376
377 // Remove old user (if it exists)
378 if ($isLink) {
379// unset($oldUsers[$userresult->getId(LTI\Tool::ID_SCOPE_RESOURCE)]);
380 unset($oldUsers[$userresult->getId(\ILIAS\LTI\ToolProvider\Tool::ID_SCOPE_RESOURCE)]);
381 }
382 }
383 }
384
386 if ($isLink && !$this->pagingMode) {
387 foreach ($oldUsers as $id => $userresult) {
388 $userresult->delete();
389 }
390 }
391 }
392
393 return $userResults;
394 }
395}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
Class to represent a platform context.
Definition: Context.php:34
Class to implement the Membership service.
Definition: Membership.php:33
__construct($source, string $endpoint, string $format=self::MEDIA_TYPE_MEMBERSHIPS_V1, int $limit=null, bool $pagingMode=false)
Class constructor.
Definition: Membership.php:87
static int $defaultLimit
Default limit on size of container to be returned from requests.
Definition: Membership.php:52
getMembers(bool $withGroups, string $role=null, int $limit=null)
Get the memberships.
Definition: Membership.php:127
getWithGroups(string $role=null, int $limit=null)
Get the memberships.
Definition: Membership.php:115
int $limit
Limit on size of container to be returned from requests.
Definition: Membership.php:68
bool $pagingMode
Whether requests should be made one page at a time when a limit is set.
Definition: Membership.php:77
const MEDIA_TYPE_MEMBERSHIPS_V1
Media type for version 1 of Memberships service.
Definition: Membership.php:37
$source
The object to which the memberships apply (ResourceLink or Context).
Definition: Membership.php:59
const MEDIA_TYPE_MEMBERSHIPS_NRPS
Media type for Names and Role Provisioning service.
Definition: Membership.php:42
static string $SCOPE
Access scope.
Definition: Membership.php:47
Class to implement a service.
Definition: Service.php:34
string $endpoint
Service endpoint.
Definition: Service.php:47
HTTPMessage $http
HttpMessage object for last service request.
Definition: Service.php:75
send(string $method, array $parameters=array(), string $body=null)
Send a service request.
Definition: Service.php:130
parseContextsInArray(object $contexts, array $arr)
Parse the JSON for context references.
Definition: Service.php:222
Platform $platform
Platform for this service request.
Definition: Service.php:68
const ID_SCOPE_RESOURCE
Prefix the ID with the consumer key and resource ID.
Definition: Tool.php:66
static fromResourceLink(ResourceLink $resourceLink, string $ltiUserId)
Class constructor from resource link.
Definition: UserResult.php:265
const LTI_VERSION2
LTI version 2 for messages.
Definition: Util.php:38
$format
Definition: metadata.php:235
if( $orgName !==null) if($spconfig->hasValue('contacts')) $email
Definition: metadata.php:302
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: AccessToken.php:19
static parseRoles($roles, string $ltiVersion=Util::LTI_VERSION1)
Get an array of fully qualified user roles.
Definition: System.php:538
Class ChatMainBarProvider \MainMenu\Provider.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$url
$context
Definition: webdav.php:29
$message
Definition: xapiexit.php:32