Skip to content

Commit

Permalink
XAPI: Save internal log based on actor mbox or account - refs BT#19078
Browse files Browse the repository at this point in the history
  • Loading branch information
AngelFQC committed Oct 15, 2021
1 parent 29ce57d commit 00c0822
Show file tree
Hide file tree
Showing 4 changed files with 359 additions and 0 deletions.
230 changes: 230 additions & 0 deletions plugin/xapi/src/Entity/InternalLog.php
@@ -0,0 +1,230 @@
<?php

/* For licensing terms, see /license.txt */

namespace Chamilo\PluginBundle\Entity\XApi;

use Chamilo\UserBundle\Entity\User;
use DateTime;
use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Table(name="xapi_internal_log")
* @ORM\Entity()
*/
class InternalLog
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id()
* @ORM\GeneratedValue()
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Chamilo\UserBundle\Entity\User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
/**
* @var string
*
* @ORM\Column(name="statement_id", type="string")
*/
private $statementId;
/**
* @var string
*
* @ORM\Column(name="verb", type="string")
*/
private $verb;
/**
* @var string
*
* @ORM\Column(name="activity_id", type="string")
*/
private $activityId;
/**
* @var string|null
*
* @ORM\Column(name="activity_name", type="string", nullable=true)
*/
private $activityName;
/**
* @var string|null
*
* @ORM\Column(name="activity_description", type="string", nullable=true)
*/
private $activityDescription;
/**
* @var float|null
*
* @ORM\Column(name="score_scaled", type="float", nullable=true)
*/
private $scoreScaled;
/**
* @var float|null
*
* @ORM\Column(name="score_raw", type="float", nullable=true)
*/
private $scoreRaw;
/**
* @var float|null
*
* @ORM\Column(name="score_min", type="float", nullable=true)
*/
private $scoreMin;
/**
* @var float|null
*
* @ORM\Column(name="score_max", type="float", nullable=true)
*/
private $scoreMax;
/**
* @var DateTime|null
*
* @ORM\Column(name="created_at", type="datetime", nullable=true)
*/
private $createdAt;

public function getId(): int
{
return $this->id;
}

public function getUser(): User
{
return $this->user;
}

public function setUser(User $user): InternalLog
{
$this->user = $user;

return $this;
}

public function getStatementId(): string
{
return $this->statementId;
}

public function setStatementId(string $statementId): InternalLog
{
$this->statementId = $statementId;

return $this;
}

public function getVerb(): string
{
return $this->verb;
}

public function setVerb(string $verb): InternalLog
{
$this->verb = $verb;

return $this;
}

public function getActivityId(): string
{
return $this->activityId;
}

public function setActivityId(string $activityId): InternalLog
{
$this->activityId = $activityId;

return $this;
}

public function getActivityName(): ?string
{
return $this->activityName;
}

public function setActivityName(?string $activityName): InternalLog
{
$this->activityName = $activityName;

return $this;
}

/**
* @return string|null
*/
public function getActivityDescription(): ?string
{
return $this->activityDescription;
}

public function setActivityDescription(?string $activityDescription): InternalLog
{
$this->activityDescription = $activityDescription;

return $this;
}

public function getScoreScaled(): ?float
{
return $this->scoreScaled;
}

public function setScoreScaled(?float $scoreScaled): InternalLog
{
$this->scoreScaled = $scoreScaled;

return $this;
}

public function getScoreRaw(): ?float
{
return $this->scoreRaw;
}

public function setScoreRaw(?float $scoreRaw): InternalLog
{
$this->scoreRaw = $scoreRaw;

return $this;
}

public function getScoreMin(): ?float
{
return $this->scoreMin;
}

public function setScoreMin(?float $scoreMin): InternalLog
{
$this->scoreMin = $scoreMin;

return $this;
}

public function getScoreMax(): ?float
{
return $this->scoreMax;
}

public function setScoreMax(?float $scoreMax): InternalLog
{
$this->scoreMax = $scoreMax;

return $this;
}

public function getCreatedAt(): ?DateTime
{
return $this->createdAt;
}

public function setCreatedAt(?DateTime $createdAt): InternalLog
{
$this->createdAt = $createdAt;

return $this;
}
}
7 changes: 7 additions & 0 deletions plugin/xapi/src/Lrs/StatementsController.php
Expand Up @@ -4,6 +4,7 @@

namespace Chamilo\PluginBundle\XApi\Lrs;

use Chamilo\PluginBundle\XApi\Lrs\Util\InternalLogUtil;
use Symfony\Component\HttpFoundation\Response;
use Xabbuh\XApi\Model\Statement;
use Xabbuh\XApi\Serializer\Symfony\ActorSerializer;
Expand Down Expand Up @@ -84,6 +85,8 @@ public function put()
$this->httpRequest->getContent()
);

InternalLogUtil::saveStatementForInternalLog($statement);

return $putStatementController->putStatement($this->httpRequest, $statement);
}

Expand All @@ -105,6 +108,10 @@ public function post(): Response

$statements = $this->deserializeStatements($content);

foreach ($statements as $statement) {
InternalLogUtil::saveStatementForInternalLog($statement);
}

return $postStatementController->postStatements($this->httpRequest, $statements);
}

Expand Down
118 changes: 118 additions & 0 deletions plugin/xapi/src/Lrs/Utils/InternalLogUtil.php
@@ -0,0 +1,118 @@
<?php

/* For licensing terms, see /license.txt */

namespace Chamilo\PluginBundle\XApi\Lrs\Util;

use Chamilo\PluginBundle\Entity\XApi\InternalLog;
use Database;
use Doctrine\ORM\ORMException;
use UserManager;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Actor;
use Xabbuh\XApi\Model\Agent;
use Xabbuh\XApi\Model\IRL;
use Xabbuh\XApi\Model\Statement;
use XApiPlugin;

class InternalLogUtil
{
public static function saveStatementForInternalLog(Statement $statement)
{
if (null === $user = self::getUserFromActor($statement->getActor())) {
return;
}

$internalLog = new InternalLog();
$internalLog->setUser($user);

$languageIso = api_get_language_isocode();

$internalLog->setVerb(
XApiPlugin::extractVerbInLanguage($statement->getVerb()->getDisplay(), $languageIso)
);

$statementObject = $statement->getObject();

if (!$statementObject instanceof Activity) {
return;
}

$internalLog->setStatementId($statement->getId()->getValue());

if (null !== $definition = $statementObject->getDefinition()) {
$internalLog->setActivityId(
$statementObject->getId()->getValue()
);

if (null !== $nameInLanguages = $definition->getName()) {
$internalLog->setActivityName(
XApiPlugin::extractVerbInLanguage($nameInLanguages, $languageIso)
);
}

if (null !== $descriptionInLanguage = $definition->getDescription()) {
$internalLog->setActivityDescription(
XApiPlugin::extractVerbInLanguage($descriptionInLanguage, $languageIso)
);
}
}

if (null !== $statementResult = $statement->getResult()) {
if (null !== $score = $statementResult->getScore()) {
$internalLog
->setScoreScaled(
$score->getScaled()
)
->setScoreRaw(
$score->getRaw()
)
->setScoreMin(
$score->getMin()
)
->setScoreMax(
$score->getMax()
);
}
}

if (null !== $created = $statement->getCreated()) {
$internalLog->setCreatedAt($created);
}

$em = Database::getManager();
$em->persist($internalLog);
$em->flush();
}

private static function getUserFromActor(Actor $actor)
{
if (!$actor instanceof Agent) {
return null;
}

$actorIri = $actor->getInverseFunctionalIdentifier();

if (null === $actorIri) {
return null;
}

$userRepo = UserManager::getRepository();

$user = null;

if (null !== $mbox = $actorIri->getMbox()) {
if ((null !== $parts = explode(':', $mbox->getValue(), 2)) && !empty($parts[1])) {
$user = $userRepo->findOneBy(['email' => $parts[1]]);
}
} elseif (null !== $account = $actorIri->getAccount()) {
$chamiloIrl = IRL::fromString(api_get_path(WEB_PATH));

if ($account->getHomePage()->equals($chamiloIrl)) {
$user = $userRepo->findOneBy(['username' => $account->getName()]);
}
}

return $user;
}
}

0 comments on commit 00c0822

Please sign in to comment.