diff --git a/plugin/xapi/src/Entity/InternalLog.php b/plugin/xapi/src/Entity/InternalLog.php new file mode 100644 index 0000000000..088db75d16 --- /dev/null +++ b/plugin/xapi/src/Entity/InternalLog.php @@ -0,0 +1,230 @@ +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; + } +} diff --git a/plugin/xapi/src/Lrs/StatementsController.php b/plugin/xapi/src/Lrs/StatementsController.php index 517a51a545..899d9a3834 100644 --- a/plugin/xapi/src/Lrs/StatementsController.php +++ b/plugin/xapi/src/Lrs/StatementsController.php @@ -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); } diff --git a/plugin/xapi/src/Lrs/Utils/InternalLogUtil.php b/plugin/xapi/src/Lrs/Utils/InternalLogUtil.php new file mode 100644 index 0000000000..fe247f076f --- /dev/null +++ b/plugin/xapi/src/Lrs/Utils/InternalLogUtil.php @@ -0,0 +1,118 @@ +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; + } +} diff --git a/plugin/xapi/src/XApiPlugin.php b/plugin/xapi/src/XApiPlugin.php index 0c2cd5ca86..587c213014 100644 --- a/plugin/xapi/src/XApiPlugin.php +++ b/plugin/xapi/src/XApiPlugin.php @@ -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), ] );