Merge branch 'MDL-81397' of https://github.com/paulholden/moodle
[moodle.git] / analytics / classes / user.php
blob952b95ed0e7b8ff37742f731661b3f9a16ace207
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.
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/>.
17 /**
18 * Moodle user analysable
20 * @package core_analytics
21 * @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 namespace core_analytics;
27 defined('MOODLE_INTERNAL') || die();
29 /**
30 * Moodle user analysable
32 * @package core_analytics
33 * @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
34 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36 class user implements \core_analytics\analysable {
38 /**
39 * @var bool Has this user data been already loaded.
41 protected $loaded = false;
43 /**
44 * @var int $cachedid self::$cachedinstance analysable id.
46 protected static $cachedid = 0;
48 /**
49 * @var \core_analytics\user $cachedinstance
51 protected static $cachedinstance = null;
53 /**
54 * User object
56 * @var \stdClass
58 protected $user = null;
60 /**
61 * The user context.
63 * @var \context_user
65 protected $usercontext = null;
67 /** @var int Store current Unix timestamp. */
68 protected int $now = 0;
70 /**
71 * Constructor.
73 * Use self::instance() instead to get cached copies of the class. Instances obtained
74 * through this constructor will not be cached.
76 * @param int|\stdClass $user User id
77 * @param \context|null $context
78 * @return void
80 public function __construct($user, ?\context $context = null) {
82 if (is_scalar($user)) {
83 $this->user = new \stdClass();
84 $this->user->id = $user;
85 } else {
86 $this->user = $user;
89 if (!is_null($context)) {
90 $this->usercontext = $context;
94 /**
95 * Returns an analytics user instance.
97 * Lazy load of analysable data.
99 * @param int|\stdClass $user User object or user id
100 * @param \context|null $context
101 * @return \core_analytics\user
103 public static function instance($user, ?\context $context = null) {
105 $userid = $user;
106 if (!is_scalar($userid)) {
107 $userid = $user->id;
110 if (self::$cachedid === $userid) {
111 return self::$cachedinstance;
114 $cachedinstance = new \core_analytics\user($user, $context);
115 self::$cachedinstance = $cachedinstance;
116 self::$cachedid = (int)$userid;
117 return self::$cachedinstance;
121 * get_id
123 * @return int
125 public function get_id() {
126 return $this->user->id;
130 * Loads the analytics user object.
132 * @return void
134 protected function load() {
136 // The instance constructor could be already loaded with the full user object. Using email
137 // because it is a required user field.
138 if (empty($this->user->email)) {
139 $this->user = \core_user::get_user($this->user->id);
142 $this->usercontext = $this->get_context();
144 $this->now = time();
146 // Flag the instance as loaded.
147 $this->loaded = true;
151 * The user full name.
153 * @return string
155 public function get_name() {
157 if (!$this->loaded) {
158 $this->load();
160 return fullname($this->user);
164 * get_context
166 * @return \context
168 public function get_context() {
169 if ($this->usercontext === null) {
170 $this->usercontext = \context_user::instance($this->user->id);
172 return $this->usercontext;
176 * Get the start timestamp.
178 * @return int
180 public function get_start() {
182 if (!$this->loaded) {
183 $this->load();
185 return $this->user->timecreated;
189 * Get the end timestamp.
191 * @return int
193 public function get_end() {
194 return self::MAX_TIME;
198 * Returns a user plain object.
200 * @return \stdClass
202 public function get_user_data() {
204 if (!$this->loaded) {
205 $this->load();
208 return $this->user;