ILIAS  release_8 Revision v8.23
Membership.php
Go to the documentation of this file.
1 <?php
2 
20 
24 
32 class 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();
90  parent::__construct($platform, $endpoint);
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)) {
138  $limit = $this->limit;
139  }
140  if (is_null($limit)) {
141  $limit = self::$defaultLimit;
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 }
$context
Definition: webdav.php:29
const MEDIA_TYPE_MEMBERSHIPS_NRPS
Media type for Names and Role Provisioning service.
Definition: Membership.php:42
Class to implement a service.
Definition: Service.php:33
int $limit
Limit on size of container to be returned from requests.
Definition: Membership.php:68
Class ChatMainBarProvider .
const MEDIA_TYPE_MEMBERSHIPS_V1
Media type for version 1 of Memberships service.
Definition: Membership.php:37
Class to implement the Membership service.
Definition: Membership.php:32
int $id
System ID value.
Definition: System.php:186
string $endpoint
Service endpoint.
Definition: Service.php:47
send(string $method, array $parameters=array(), string $body=null)
Send a service request.
Definition: Service.php:130
HTTPMessage $http
HttpMessage object for last service request.
Definition: Service.php:75
__construct($source, string $endpoint, string $format=self::MEDIA_TYPE_MEMBERSHIPS_V1, int $limit=null, bool $pagingMode=false)
Class constructor.
Definition: Membership.php:87
const LTI_VERSION2
LTI version 2 for messages.
Definition: Util.php:38
getMembers(bool $withGroups, string $role=null, int $limit=null)
Get the memberships.
Definition: Membership.php:127
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: AccessToken.php:19
$source
The object to which the memberships apply (ResourceLink or Context).
Definition: Membership.php:59
static string $SCOPE
Access scope.
Definition: Membership.php:47
static int $defaultLimit
Default limit on size of container to be returned from requests.
Definition: Membership.php:52
$format
Definition: metadata.php:235
if($orgName !==null) if($spconfig->hasValue('contacts')) $email
Definition: metadata.php:302
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static parseRoles($roles, string $ltiVersion=Util::LTI_VERSION1)
Get an array of fully qualified user roles.
Definition: System.php:538
__construct(Container $dic, ilPlugin $plugin)
$message
Definition: xapiexit.php:32
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$url
Platform $platform
Platform for this service request.
Definition: Service.php:68
parseContextsInArray(object $contexts, array $arr)
Parse the JSON for context references.
Definition: Service.php:222
getWithGroups(string $role=null, int $limit=null)
Get the memberships.
Definition: Membership.php:115
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
bool $pagingMode
Whether requests should be made one page at a time when a limit is set.
Definition: Membership.php:77