diff --git a/composer.json b/composer.json index 30bdca120f9..839c4ac1d99 100755 --- a/composer.json +++ b/composer.json @@ -89,10 +89,11 @@ "patchwork/utf8": "~1.2", "php-ffmpeg/php-ffmpeg": "0.5.1", "php-http/guzzle6-adapter": "^2.0", - "php-xapi/client": "0.7.x-dev", + "php-xapi/client": "dev-master", + "php-xapi/model": "dev-master as 1.2", "php-xapi/repository-api": "dev-master as 0.3.1", "php-xapi/repository-doctrine": "dev-master", - "php-xapi/symfony-serializer": "2.1.0 as 2.0", + "php-xapi/symfony-serializer": "dev-master", "phpmailer/phpmailer": "~6.1", "phpoffice/phpexcel": "~1.8", "phpoffice/phpword": "~0.14", diff --git a/plugin/xapi/README.md b/plugin/xapi/README.md index 64a7c88c2f8..74c1ec3267f 100644 --- a/plugin/xapi/README.md +++ b/plugin/xapi/README.md @@ -27,7 +27,7 @@ The endpoint for the statements API is "https://CHAMILO_DOMAIN/plugin/xapi/lrs.p CREATE TABLE xapi_attachment (identifier INT AUTO_INCREMENT NOT NULL, statement_id VARCHAR(255) DEFAULT NULL, usageType VARCHAR(255) NOT NULL, contentType VARCHAR(255) NOT NULL, length INT NOT NULL, sha2 VARCHAR(255) NOT NULL, display LONGTEXT NOT NULL COMMENT '(DC2Type:json)', hasDescription TINYINT(1) NOT NULL, description LONGTEXT DEFAULT NULL COMMENT '(DC2Type:json)', fileUrl VARCHAR(255) DEFAULT NULL, content LONGTEXT DEFAULT NULL, INDEX IDX_7148C9A1849CB65B (statement_id), PRIMARY KEY(identifier)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB; CREATE TABLE xapi_object (identifier INT AUTO_INCREMENT NOT NULL, group_id INT DEFAULT NULL, actor_id INT DEFAULT NULL, verb_id INT DEFAULT NULL, object_id INT DEFAULT NULL, type VARCHAR(255) DEFAULT NULL, activityId VARCHAR(255) DEFAULT NULL, hasActivityDefinition TINYINT(1) DEFAULT NULL, hasActivityName TINYINT(1) DEFAULT NULL, activityName LONGTEXT DEFAULT NULL COMMENT '(DC2Type:json)', hasActivityDescription TINYINT(1) DEFAULT NULL, activityDescription LONGTEXT DEFAULT NULL COMMENT '(DC2Type:json)', activityType VARCHAR(255) DEFAULT NULL, activityMoreInfo VARCHAR(255) DEFAULT NULL, mbox VARCHAR(255) DEFAULT NULL, mboxSha1Sum VARCHAR(255) DEFAULT NULL, openId VARCHAR(255) DEFAULT NULL, accountName VARCHAR(255) DEFAULT NULL, accountHomePage VARCHAR(255) DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, referenced_statement_id VARCHAR(255) DEFAULT NULL, activityExtensions_id INT DEFAULT NULL, parentContext_id INT DEFAULT NULL, groupingContext_id INT DEFAULT NULL, categoryContext_id INT DEFAULT NULL, otherContext_id INT DEFAULT NULL, UNIQUE INDEX UNIQ_E2B68640303C7F1D (activityExtensions_id), INDEX IDX_E2B68640FE54D947 (group_id), UNIQUE INDEX UNIQ_E2B6864010DAF24A (actor_id), UNIQUE INDEX UNIQ_E2B68640C1D03483 (verb_id), UNIQUE INDEX UNIQ_E2B68640232D562B (object_id), INDEX IDX_E2B68640988A4CEC (parentContext_id), INDEX IDX_E2B686404F542860 (groupingContext_id), INDEX IDX_E2B68640AEA1B132 (categoryContext_id), INDEX IDX_E2B68640B73EEAB7 (otherContext_id), PRIMARY KEY(identifier)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB; CREATE TABLE xapi_result (identifier INT AUTO_INCREMENT NOT NULL, extensions_id INT DEFAULT NULL, hasScore TINYINT(1) NOT NULL, scaled DOUBLE PRECISION DEFAULT NULL, raw DOUBLE PRECISION DEFAULT NULL, min DOUBLE PRECISION DEFAULT NULL, max DOUBLE PRECISION DEFAULT NULL, success TINYINT(1) DEFAULT NULL, completion TINYINT(1) DEFAULT NULL, response VARCHAR(255) DEFAULT NULL, duration VARCHAR(255) DEFAULT NULL, UNIQUE INDEX UNIQ_5971ECBFD0A19400 (extensions_id), PRIMARY KEY(identifier)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB; -CREATE TABLE xapi_verb (identifier INT AUTO_INCREMENT NOT NULL, id VARCHAR(255) NOT NULL, display LONGTEXT NOT NULL COMMENT '(DC2Type:json)', PRIMARY KEY(identifier)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB; +CREATE TABLE xapi_verb (identifier INT AUTO_INCREMENT NOT NULL, id VARCHAR(255) NOT NULL, display LONGTEXT NULL COMMENT '(DC2Type:json)', PRIMARY KEY(identifier)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB; CREATE TABLE xapi_extensions (identifier INT AUTO_INCREMENT NOT NULL, extensions LONGTEXT NOT NULL COMMENT '(DC2Type:json)', PRIMARY KEY(identifier)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB; CREATE TABLE xapi_context (identifier INT AUTO_INCREMENT NOT NULL, instructor_id INT DEFAULT NULL, team_id INT DEFAULT NULL, extensions_id INT DEFAULT NULL, registration VARCHAR(255) DEFAULT NULL, hasContextActivities TINYINT(1) DEFAULT NULL, revision VARCHAR(255) DEFAULT NULL, platform VARCHAR(255) DEFAULT NULL, language VARCHAR(255) DEFAULT NULL, statement VARCHAR(255) DEFAULT NULL, UNIQUE INDEX UNIQ_3D7771908C4FC193 (instructor_id), UNIQUE INDEX UNIQ_3D777190296CD8AE (team_id), UNIQUE INDEX UNIQ_3D777190D0A19400 (extensions_id), PRIMARY KEY(identifier)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB; CREATE TABLE xapi_actor (identifier INT AUTO_INCREMENT NOT NULL, type VARCHAR(255) DEFAULT NULL, mbox VARCHAR(255) DEFAULT NULL, mboxSha1Sum VARCHAR(255) DEFAULT NULL, openId VARCHAR(255) DEFAULT NULL, accountName VARCHAR(255) DEFAULT NULL, accountHomePage VARCHAR(255) DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, members VARCHAR(255) NOT NULL, PRIMARY KEY(identifier)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB; diff --git a/plugin/xapi/php-xapi/lrs-bundle/src/Controller/StatementGetController.php b/plugin/xapi/php-xapi/lrs-bundle/src/Controller/StatementGetController.php index 88469b3371d..d7a9be10595 100644 --- a/plugin/xapi/php-xapi/lrs-bundle/src/Controller/StatementGetController.php +++ b/plugin/xapi/php-xapi/lrs-bundle/src/Controller/StatementGetController.php @@ -92,8 +92,9 @@ public function getStatement(Request $request) } } catch (NotFoundException $e) { $response = $this->buildMultiStatementsResponse([], $query) - ->setStatusCode(Response::HTTP_NOT_FOUND) - ->setContent(''); + ->setStatusCode(Response::HTTP_NOT_FOUND) + ->setContent('') + ; } catch (\Exception $exception) { $response = Response::create('', Response::HTTP_BAD_REQUEST); } diff --git a/plugin/xapi/php-xapi/lrs-bundle/src/Model/StatementsFilterFactory.php b/plugin/xapi/php-xapi/lrs-bundle/src/Model/StatementsFilterFactory.php index 7e1ba67f46c..6040f480f20 100644 --- a/plugin/xapi/php-xapi/lrs-bundle/src/Model/StatementsFilterFactory.php +++ b/plugin/xapi/php-xapi/lrs-bundle/src/Model/StatementsFilterFactory.php @@ -79,6 +79,7 @@ public function createFromParameterBag(ParameterBag $parameters) $filter->descending(); } + $filter->cursor($parameters->getInt('cursor')); $filter->limit($parameters->getInt('limit')); return $filter; diff --git a/plugin/xapi/php-xapi/lrs-bundle/src/Resources/config/routing.xml b/plugin/xapi/php-xapi/lrs-bundle/src/Resources/config/routing.xml index 27c4d2bc101..f0e75024fb3 100644 --- a/plugin/xapi/php-xapi/lrs-bundle/src/Resources/config/routing.xml +++ b/plugin/xapi/php-xapi/lrs-bundle/src/Resources/config/routing.xml @@ -13,7 +13,7 @@ - xapi_lrs.controller.statement.post:postStatement + xapi_lrs.controller.statement.post:postStatements statement true diff --git a/plugin/xapi/php-xapi/repository-doctrine-orm/metadata/StatementObject.orm.xml b/plugin/xapi/php-xapi/repository-doctrine-orm/metadata/StatementObject.orm.xml index 22464ce3faa..8253f07e2b5 100644 --- a/plugin/xapi/php-xapi/repository-doctrine-orm/metadata/StatementObject.orm.xml +++ b/plugin/xapi/php-xapi/repository-doctrine-orm/metadata/StatementObject.orm.xml @@ -61,7 +61,11 @@ - + + + + + diff --git a/plugin/xapi/php-xapi/repository-doctrine-orm/metadata/Verb.orm.xml b/plugin/xapi/php-xapi/repository-doctrine-orm/metadata/Verb.orm.xml index 2e2277c6d7e..e65a41c8bf7 100644 --- a/plugin/xapi/php-xapi/repository-doctrine-orm/metadata/Verb.orm.xml +++ b/plugin/xapi/php-xapi/repository-doctrine-orm/metadata/Verb.orm.xml @@ -9,6 +9,6 @@ - + diff --git a/plugin/xapi/php-xapi/repository-doctrine-orm/src/StatementRepository.php b/plugin/xapi/php-xapi/repository-doctrine-orm/src/StatementRepository.php index a551eb1d548..865583dabae 100644 --- a/plugin/xapi/php-xapi/repository-doctrine-orm/src/StatementRepository.php +++ b/plugin/xapi/php-xapi/repository-doctrine-orm/src/StatementRepository.php @@ -34,7 +34,7 @@ public function findStatement(array $criteria) */ public function findStatements(array $criteria) { - if (!empty($criteria['registration'])) { + if (!empty($criteria['registration'])) { $contexts = $this->_em->getRepository(Context::class)->findBy([ 'registration' => $criteria['registration'], ]); @@ -42,15 +42,25 @@ public function findStatements(array $criteria) $criteria['context'] = $contexts; } + if (!empty($criteria['verb'])) { + $verbs = $this->_em->getRepository(Verb::class)->findBy(['id' => $criteria['verb']]); + + $criteria['verb'] = $verbs; + } + unset( $criteria['registration'], $criteria['related_activities'], $criteria['related_agents'], $criteria['ascending'], - $criteria['limit'] ); - return parent::findBy($criteria, ['created' => 'ASC']); + return parent::findBy( + $criteria, + ['created' => 'ASC'], + $criteria['limit'] ?? null, + $criteria['cursor'] ?? null + ); } /** diff --git a/plugin/xapi/src/Lrs/StatementsController.php b/plugin/xapi/src/Lrs/StatementsController.php index 86dc548b0ce..4eb7b3f2bb6 100644 --- a/plugin/xapi/src/Lrs/StatementsController.php +++ b/plugin/xapi/src/Lrs/StatementsController.php @@ -8,6 +8,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Xabbuh\XApi\Common\Exception\NotFoundException; +use Xabbuh\XApi\Model\Statement; use Xabbuh\XApi\Model\StatementId; use Xabbuh\XApi\Serializer\Symfony\ActorSerializer; use Xabbuh\XApi\Serializer\Symfony\Serializer; @@ -28,6 +29,48 @@ */ class StatementsController extends BaseController { + public function get(): Response + { + $pluginEm = XApiPlugin::getEntityManager(); + + $serializer = Serializer::createSerializer(); + $factory = new SerializerFactory($serializer); + + $getStatementController = new StatementGetController( + new StatementRepository( + $pluginEm->getRepository(StatementEntity::class) + ), + $factory->createStatementSerializer(), + $factory->createStatementResultSerializer(), + new StatementsFilterFactory( + new ActorSerializer($serializer) + ) + ); + + return $getStatementController->getStatement($this->httpRequest); + } + + public function head(): Response + { + $pluginEm = XApiPlugin::getEntityManager(); + + $serializer = Serializer::createSerializer(); + $factory = new SerializerFactory($serializer); + + $headStatementController = new StatementHeadController( + new StatementRepository( + $pluginEm->getRepository(StatementEntity::class) + ), + $factory->createStatementSerializer(), + $factory->createStatementResultSerializer(), + new StatementsFilterFactory( + new ActorSerializer($serializer) + ) + ); + + return $headStatementController->getStatement($this->httpRequest); + } + /** * @var StatementRepository */ @@ -104,28 +147,39 @@ public function put(): Response public function post(): Response { + $pluginEm = XApiPlugin::getEntityManager(); + + $postStatementController = new StatementPostController( + new StatementRepository( + $pluginEm->getRepository(StatementEntity::class) + ) + ); + $content = $this->httpRequest->getContent(); if (substr($content, 0, 1) !== '[') { $content = "[$content]"; } - $statements = $this->serializerFactory - ->createStatementSerializer() - ->deserializeStatements($content) - ; - - $postStatementController = new StatementPostController($this->statementRepository); + $statements = $this->deserializeStatements($content); - $response = $postStatementController->postStatements($this->httpRequest, $statements); + return $postStatementController->postStatements($this->httpRequest, $statements); + } - $this->saveLog( - json_decode($response->getContent(), false) - ); + private function deserializeStatement(string $content = ''): Statement + { + $factory = new SerializerFactory(Serializer::createSerializer()); - return $response; + return $factory->createStatementSerializer()->deserializeStatement($content); } + private function deserializeStatements(string $content = ''): array + { + $factory = new SerializerFactory(Serializer::createSerializer()); + + return $factory->createStatementSerializer()->deserializeStatements($content); + } + /** * @param array $statementsId *