XAPI: Save internal log based on actor mbox or account - refs BT#19078

pull/4028/head
Angel Fernando Quiroz Campos 4 years ago
parent 29ce57d1cc
commit 00c0822b10
  1. 230
      plugin/xapi/src/Entity/InternalLog.php
  2. 7
      plugin/xapi/src/Lrs/StatementsController.php
  3. 118
      plugin/xapi/src/Lrs/Utils/InternalLogUtil.php
  4. 4
      plugin/xapi/src/XApiPlugin.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;
}
}

@ -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;
@ -84,6 +85,8 @@ class StatementsController extends BaseController
$this->httpRequest->getContent()
);
InternalLogUtil::saveStatementForInternalLog($statement);
return $putStatementController->putStatement($this->httpRequest, $statement);
}
@ -105,6 +108,10 @@ class StatementsController extends BaseController
$statements = $this->deserializeStatements($content);
foreach ($statements as $statement) {
InternalLogUtil::saveStatementForInternalLog($statement);
}
return $postStatementController->postStatements($this->httpRequest, $statements);
}

@ -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;
}
}

@ -5,6 +5,7 @@
use Chamilo\PluginBundle\Entity\XApi\ActivityProfile;
use Chamilo\PluginBundle\Entity\XApi\ActivityState;
use Chamilo\PluginBundle\Entity\XApi\Cmi5Item;
use Chamilo\PluginBundle\Entity\XApi\InternalLog;
use Chamilo\PluginBundle\Entity\XApi\LrsAuth;
use Chamilo\PluginBundle\Entity\XApi\SharedStatement;
use Chamilo\PluginBundle\Entity\XApi\ToolLaunch;
@ -94,6 +95,7 @@ class XApiPlugin extends Plugin implements HookPluginInterface
'xapi_cmi5_item',
'xapi_activity_state',
'xapi_activity_profile',
'xapi_internal_log',
'xapi_attachment',
'xapi_object',
@ -164,6 +166,7 @@ class XApiPlugin extends Plugin implements HookPluginInterface
$em->getClassMetadata(ToolLaunch::class),
$em->getClassMetadata(LrsAuth::class),
$em->getClassMetadata(Cmi5Item::class),
$em->getClassMetadata(InternalLog::class),
]
);
@ -503,6 +506,7 @@ class XApiPlugin extends Plugin implements HookPluginInterface
$em->getClassMetadata(Cmi5Item::class),
$em->getClassMetadata(ActivityState::class),
$em->getClassMetadata(ActivityProfile::class),
$em->getClassMetadata(InternalLog::class),
]
);

Loading…
Cancel
Save