1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 namespace enrol_lti\local\ltiadvantage\entity; 18 19 /** 20 * Class user, instances of which represent a specific lti user in the tool. 21 * 22 * A user is always associated with a resource, as lti users cannot exist without a tool-published-resource. A user will 23 * always come from either: 24 * - a resource link launch or 25 * - a membership sync 26 * Both of which required a published resource. 27 * 28 * Additionally, a user may be associated with a given resource_link instance, to signify that the user originated from 29 * that resource_link. If a user is not associated with a resource_link, such as when creating a user during a member 30 * sync, that param is nullable. This can be achieved via the factory method user::create_from_resource_link() or set 31 * after instantiation via the user::set_resource_link_id() method. 32 * 33 * @package enrol_lti 34 * @copyright 2021 Jake Dallimore <jrhdallimore@gmail.com> 35 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ 36 class user { 37 38 /** @var int the id of the published resource to which this user belongs. */ 39 private $resourceid; 40 41 /** @var int the local id of the deployment instance to which this user belongs. */ 42 private $deploymentid; 43 44 /** @var string the id of the user in the platform site. */ 45 private $sourceid; 46 47 /** @var int|null the id of this user instance, or null if not stored yet. */ 48 private $id; 49 50 /** @var int|null the id of the user in the tool site, or null if the instance hasn't been stored yet. */ 51 private $localid; 52 53 /** @var string city of the user. */ 54 private $city; 55 56 /** @var string country of the user. */ 57 private $country; 58 59 /** @var string institution of the user.*/ 60 private $institution; 61 62 /** @var string timezone of the user. */ 63 private $timezone; 64 65 /** @var int maildisplay of the user. */ 66 private $maildisplay; 67 68 /** @var string language code of the user. */ 69 private $lang; 70 71 /** @var float the user's last grade value. */ 72 private $lastgrade; 73 74 /** @var int|null the user's last access unix timestamp, or null if they have not accessed the resource yet.*/ 75 private $lastaccess; 76 77 /** @var int|null the id of the resource_link instance, or null if the user doesn't originate from one. */ 78 private $resourcelinkid; 79 80 /** 81 * Private constructor. 82 * 83 * @param int $resourceid the id of the published resource to which this user belongs. 84 * @param int $userid the id of the Moodle user to which this LTI user relates. 85 * @param int $deploymentid the local id of the deployment instance to which this user belongs. 86 * @param string $sourceid the id of the user in the platform site. 87 * @param string $lang the user's language code. 88 * @param string $city the user's city. 89 * @param string $country the user's country. 90 * @param string $institution the user's institution. 91 * @param string $timezone the user's timezone. 92 * @param int|null $maildisplay the user's maildisplay, or null to select defaults. 93 * @param float|null $lastgrade the user's last grade value. 94 * @param int|null $lastaccess the user's last access time, or null if they haven't accessed the resource. 95 * @param int|null $resourcelinkid the id of the resource link to link to the user, or null if not applicable. 96 * @param int|null $id the id of this object instance, or null if it's a not-yet-persisted object. 97 * @throws \coding_exception 98 */ 99 private function __construct(int $resourceid, int $userid, int $deploymentid, string $sourceid, 100 string $lang, string $city, string $country, 101 string $institution, string $timezone, ?int $maildisplay, ?float $lastgrade, ?int $lastaccess, 102 ?int $resourcelinkid = null, ?int $id = null) { 103 104 global $CFG; 105 $this->resourceid = $resourceid; 106 $this->localid = $userid; 107 $this->deploymentid = $deploymentid; 108 if (empty($sourceid)) { 109 throw new \coding_exception('Invalid sourceid value. Cannot be an empty string.'); 110 } 111 $this->sourceid = $sourceid; 112 $this->set_lang($lang); 113 $this->set_city($city); 114 $this->set_country($country); 115 $this->set_institution($institution); 116 $this->set_timezone($timezone); 117 $maildisplay = $maildisplay ?? ($CFG->defaultpreference_maildisplay ?? 2); 118 $this->set_maildisplay($maildisplay); 119 $this->lastgrade = $lastgrade ?? 0.0; 120 $this->lastaccess = $lastaccess; 121 $this->resourcelinkid = $resourcelinkid; 122 $this->id = $id; 123 } 124 125 /** 126 * Factory method for creating a user instance associated with a given resource_link instance. 127 * 128 * @param int $resourcelinkid the local id of the resource link instance to link to the user. 129 * @param int $resourceid the id of the published resource to which this user belongs. 130 * @param int $userid the id of the Moodle user to which this LTI user relates. 131 * @param int $deploymentid the local id of the deployment instance to which this user belongs. 132 * @param string $sourceid the id of the user in the platform site. 133 * @param string $lang the user's language code. 134 * @param string $timezone the user's timezone. 135 * @param string $city the user's city. 136 * @param string $country the user's country. 137 * @param string $institution the user's institution. 138 * @param int|null $maildisplay the user's maildisplay, or null to select defaults. 139 * @return user the user instance. 140 */ 141 public static function create_from_resource_link(int $resourcelinkid, int $resourceid, int $userid, 142 int $deploymentid, string $sourceid, string $lang, string $timezone, 143 string $city = '', string $country = '', string $institution = '', 144 ?int $maildisplay = null): user { 145 146 return new self($resourceid, $userid, $deploymentid, $sourceid, $lang, $city, 147 $country, $institution, $timezone, $maildisplay, null, null, $resourcelinkid); 148 } 149 150 /** 151 * Factory method for creating a user. 152 * 153 * @param int $resourceid the id of the published resource to which this user belongs. 154 * @param int $userid the id of the Moodle user to which this LTI user relates. 155 * @param int $deploymentid the local id of the deployment instance to which this user belongs. 156 * @param string $sourceid the id of the user in the platform site. 157 * @param string $lang the user's language code. 158 * @param string $timezone the user's timezone. 159 * @param string $city the user's city. 160 * @param string $country the user's country. 161 * @param string $institution the user's institution. 162 * @param int|null $maildisplay the user's maildisplay, or null to select defaults. 163 * @param float|null $lastgrade the user's last grade value. 164 * @param int|null $lastaccess the user's last access time, or null if they haven't accessed the resource. 165 * @param int|null $resourcelinkid the local id of the resource link instance associated with the user. 166 * @param int|null $id the id of this lti user instance, or null if it's a not-yet-persisted object. 167 * @return user the user instance. 168 */ 169 public static function create(int $resourceid, int $userid, int $deploymentid, string $sourceid, 170 string $lang, string $timezone, string $city = '', 171 string $country = '', string $institution = '', ?int $maildisplay = null, ?float $lastgrade = null, 172 ?int $lastaccess = null, ?int $resourcelinkid = null, int $id = null): user { 173 174 return new self($resourceid, $userid, $deploymentid, $sourceid, $lang, $city, 175 $country, $institution, $timezone, $maildisplay, $lastgrade, $lastaccess, $resourcelinkid, $id); 176 } 177 178 /** 179 * Get the id of this user instance. 180 * 181 * @return int|null the object id, or null if not yet persisted. 182 */ 183 public function get_id(): ?int { 184 return $this->id; 185 } 186 187 /** 188 * Get the id of the resource_link instance to which this user is associated. 189 * 190 * @return int|null the object id, or null if the user isn't associated with one. 191 */ 192 public function get_resourcelinkid(): ?int { 193 return $this->resourcelinkid; 194 } 195 196 /** 197 * Associate this user with the given resource_link instance, denoting that this user launched from the instance. 198 * 199 * @param int $resourcelinkid the id of the resource_link instance. 200 */ 201 public function set_resourcelinkid(int $resourcelinkid): void { 202 if ($resourcelinkid <= 0) { 203 throw new \coding_exception("Invalid resourcelinkid '$resourcelinkid' provided. Must be > 0."); 204 } 205 $this->resourcelinkid = $resourcelinkid; 206 } 207 208 /** 209 * Get the id of the published resource to which this user is associated. 210 * 211 * @return int the resource id. 212 */ 213 public function get_resourceid(): int { 214 return $this->resourceid; 215 } 216 217 /** 218 * Get the id of the deployment instance to which this user belongs. 219 * 220 * @return int id of the deployment instance. 221 */ 222 public function get_deploymentid(): int { 223 return $this->deploymentid; 224 } 225 226 /** 227 * Get the id of the user in the platform. 228 * 229 * @return string the source id. 230 */ 231 public function get_sourceid(): string { 232 return $this->sourceid; 233 } 234 235 /** 236 * Get the id of the user in the tool. 237 * 238 * @return int|null the id, or null if the object instance hasn't yet been persisted. 239 */ 240 public function get_localid(): ?int { 241 return $this->localid; 242 } 243 244 /** 245 * Get the user's city. 246 * 247 * @return string the city. 248 */ 249 public function get_city(): string { 250 return $this->city; 251 } 252 253 /** 254 * Set the user's city. 255 * 256 * @param string $city the city string. 257 */ 258 public function set_city(string $city): void { 259 $this->city = $city; 260 } 261 262 /** 263 * Get the user's country code. 264 * 265 * @return string the country code. 266 */ 267 public function get_country(): string { 268 return $this->country; 269 } 270 271 /** 272 * Set the user's country. 273 * 274 * @param string $countrycode the 2 digit country code representing the country, or '' to denote none. 275 */ 276 public function set_country(string $countrycode): void { 277 global $CFG; 278 require_once($CFG->libdir . '/moodlelib.php'); 279 $validcountrycodes = array_merge([''], array_keys(get_string_manager()->get_list_of_countries(true))); 280 if (!in_array($countrycode, $validcountrycodes)) { 281 throw new \coding_exception("Invalid country code '$countrycode'."); 282 } 283 $this->country = $countrycode; 284 } 285 286 /** 287 * Get the instituation of the user. 288 * 289 * @return string the institution. 290 */ 291 public function get_institution(): string { 292 return $this->institution; 293 } 294 295 /** 296 * Set the user's institution. 297 * 298 * @param string $institution the name of the institution. 299 */ 300 public function set_institution(string $institution): void { 301 $this->institution = $institution; 302 } 303 304 /** 305 * Get the timezone of the user. 306 * 307 * @return string the user timezone. 308 */ 309 public function get_timezone(): string { 310 return $this->timezone; 311 } 312 313 /** 314 * Set the user's timezone, or set '99' to specify server timezone. 315 * 316 * @param string $timezone the timezone string, or '99' to use server timezone. 317 */ 318 public function set_timezone(string $timezone): void { 319 if (empty($timezone)) { 320 throw new \coding_exception('Invalid timezone value. Cannot be an empty string.'); 321 } 322 $validtimezones = array_keys(\core_date::get_list_of_timezones(null, true)); 323 if (!in_array($timezone, $validtimezones)) { 324 throw new \coding_exception("Invalid timezone '$timezone' provided."); 325 } 326 $this->timezone = $timezone; 327 } 328 329 /** 330 * Get the maildisplay of the user. 331 * 332 * @return int the maildisplay. 333 */ 334 public function get_maildisplay(): int { 335 return $this->maildisplay; 336 } 337 338 /** 339 * Set the user's mail display preference from a range of supported options. 340 * 341 * 0 - hide from non privileged users 342 * 1 - allow everyone to see 343 * 2 - allow only course participants to see 344 * 345 * @param int $maildisplay the maildisplay preference to set. 346 */ 347 public function set_maildisplay(int $maildisplay): void { 348 if (!in_array($maildisplay, range(0, 2))) { 349 throw new \coding_exception("Invalid maildisplay value '$maildisplay'. Must be in the range {0..2}."); 350 } 351 $this->maildisplay = $maildisplay; 352 } 353 354 /** 355 * Get the lang code of the user. 356 * 357 * @return string the user's language code. 358 */ 359 public function get_lang(): string { 360 return $this->lang; 361 } 362 363 /** 364 * Set the user's language. 365 * 366 * @param string $langcode the language code representing the user's language. 367 */ 368 public function set_lang(string $langcode): void { 369 if (empty($langcode)) { 370 throw new \coding_exception('Invalid lang value. Cannot be an empty string.'); 371 } 372 $validlangcodes = array_keys(get_string_manager()->get_list_of_translations()); 373 if (!in_array($langcode, $validlangcodes)) { 374 throw new \coding_exception("Invalid lang '$langcode' provided."); 375 } 376 $this->lang = $langcode; 377 } 378 379 /** 380 * Get the last grade value for this user. 381 * 382 * @return float the float grade. 383 */ 384 public function get_lastgrade(): float { 385 return $this->lastgrade; 386 } 387 388 /** 389 * Set the last grade for the user. 390 * 391 * @param float $lastgrade the last grade the user received. 392 */ 393 public function set_lastgrade(float $lastgrade): void { 394 global $CFG; 395 require_once($CFG->libdir . '/gradelib.php'); 396 $this->lastgrade = grade_floatval($lastgrade); 397 } 398 399 /** 400 * Get the last access timestamp for this user. 401 * 402 * @return int|null the last access timestampt, or null if the user hasn't accessed the resource. 403 */ 404 public function get_lastaccess(): ?int { 405 return $this->lastaccess; 406 } 407 408 /** 409 * Set the last access time for the user. 410 * 411 * @param int $time unix timestamp representing the last time the user accessed the published resource. 412 * @throws \coding_exception if $time is not a positive int. 413 */ 414 public function set_lastaccess(int $time): void { 415 if ($time < 0) { 416 throw new \coding_exception('Cannot set negative access time'); 417 } 418 $this->lastaccess = $time; 419 } 420 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body