. namespace core_xapi\local; use core_xapi\local\statement\item_agent; use core_xapi\local\statement\item_activity; use JsonSerializable; use stdClass; /** * State resource object for xAPI structure checking and validation. * * @package core_xapi * @since Moodle 4.2 * @copyright 2023 Ferran Recio * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class state implements JsonSerializable { /** @var item_agent The state agent (user). */ protected $agent = null; /** @var item_activity The state activity owner (the plugin instance). */ protected $activity = null; /** @var string The state identifier. */ protected $stateid = null; /** @var stdClass|null The state data. */ protected $statedata = null; /** @var string|null The state registration. */ protected $registration = null; /** * State constructor. * * @param item_agent $agent The state agent (user) * @param item_activity $activity The state activity owner * @param string $stateid The state identifier * @param stdClass|null $statedata The state data * @param string|null $registration The state registration */ public function __construct( item_agent $agent, item_activity $activity, string $stateid, ?stdClass $statedata, ?string $registration ) { $this->agent = $agent; $this->activity = $activity; $this->stateid = $stateid; $this->statedata = $statedata; $this->registration = $registration; } /** * Return the data to serialize in case JSON state when needed. * * @return stdClass The state data structure. If statedata is null, this method will return an empty class. */ public function jsonSerialize(): stdClass { if ($this->statedata) { return $this->statedata; } return new stdClass(); } /** * Return the record data of this state. * * @return stdClass the record data structure */ public function get_record_data(): stdClass { $result = (object) [ 'userid' => $this->get_user()->id, 'itemid' => $this->get_activity_id(), 'stateid' => $this->stateid, 'statedata' => json_encode($this), 'registration' => $this->registration, ]; return $result; } /** * Returns a minified version of a given state. * * The returned structure is suitable to store in the "other" field * of logstore. xAPI standard specifies a list of attributes that can be calculated * instead of stored literally. This function get rid of these attributes. * * Note: it also converts stdClass to assoc array to make it compatible * with "other" field in the logstore * * @return array the minimal state needed to be stored a part from logstore data */ public function minify(): ?array { $result = []; $fields = ['activity', 'stateid', 'statedata', 'registration']; foreach ($fields as $field) { if (!empty($this->$field)) { $result[$field] = $this->$field; } } return json_decode(json_encode($result), true); } /** * Set the state data. * * @param stdClass|null $statedata the state data */ public function set_state_data(?stdClass $statedata): void { $this->statedata = $statedata; } /** * Returns the state data. * For getting the JSON representation of this state data, use jsonSerialize(). * * @return stdClass|null The state data object. */ public function get_state_data(): ?stdClass { return $this->statedata; } /** * Returns the moodle user represented by this state agent. * * @return stdClass user record */ public function get_user(): stdClass { return $this->agent->get_user(); } /** * Returns the state activity ID. * * @return string activity ID */ public function get_activity_id(): string { return $this->activity->get_id(); } /** * Return the state agent. * * @return item_agent */ public function get_agent(): item_agent { return $this->agent; } /** * Return the state object if it is defined. * * @return item_activity|null */ public function get_activity(): ?item_activity { return $this->activity; } /** * Returns the state id. * * @return string state identifier */ public function get_state_id(): string { return $this->stateid; } /** * Returns the state registration if any. * * @return string|null state registration */ public function get_registration(): ?string { return $this->registration; } }