Skip to content

Commit

Permalink
Merge pull request #473 from oat-sa/feat/REL-1538/test-ds-sync
Browse files Browse the repository at this point in the history
feat: Change to be able to sync test
  • Loading branch information
augustas authored May 14, 2024
2 parents 5a52152 + adf211f commit 54708e5
Show file tree
Hide file tree
Showing 11 changed files with 505 additions and 405 deletions.
44 changes: 34 additions & 10 deletions model/DataStore/DeliveryMetadataListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ class DeliveryMetadataListener extends ConfigurableService

public const SERVICE_ID = 'taoDeliveryRdf/DeliveryMetadataListener';

public const OPTION_MAX_TRIES = 'max_tries';
private const FILE_SYSTEM_ID = 'dataStore';
private const MAX_TRIES_DEFAULT = 10;
private const MAX_TRIES_OPTION_NAME = 'max_tries';

public function whenDeliveryIsPublished(Event $event): void
{
Expand All @@ -49,12 +51,22 @@ public function whenDeliveryIsPublished(Event $event): void
try {
$this->logDebug(sprintf('Processing MetaData event for %s', get_class($event)));
$this->checkEventType($event);
$params['deliveryId'] = $event->getDeliveryUri();
$params[self::OPTION_MAX_TRIES] = $this->getOption(self::OPTION_MAX_TRIES, 10);
$this->triggerSyncTask($params);

$resourceSyncDTO = $this->getPrepareDataService()->getResourceSyncData(
$event->getDeliveryUri(),
$this->getOption(self::MAX_TRIES_OPTION_NAME, self::MAX_TRIES_DEFAULT),
true,
self::FILE_SYSTEM_ID
);

$this->triggerSyncTask($resourceSyncDTO);
$this->logDebug(sprintf('Event %s processed', get_class($event)));
} catch (Throwable $exception) {
$this->logError(sprintf('Error processing event %s: %s', get_class($event), $exception->getMessage()));
$this->logError(sprintf(
'Error processing event %s: %s',
get_class($event),
$exception->getMessage()
));
}
}

Expand All @@ -72,23 +84,35 @@ private function getQueueDispatcher(): ConfigurableService
private function checkEventType(Event $event): void
{
if (!$event instanceof AbstractDeliveryEvent) {
throw new RuntimeException($event);
throw new RuntimeException(sprintf(
"Wrong event type. Required instance of %s, %s given",
AbstractDeliveryEvent::class,
get_class($event)
));
}
}

private function triggerSyncTask(array $params): void
private function triggerSyncTask(ResourceSyncDTO $resourceSyncDTO): void
{
/** @var QueueDispatcher $queueDispatcher */
$queueDispatcher = $this->getQueueDispatcher();
$queueDispatcher->createTask(
new MetaDataDeliverySyncTask(),
$params,
__('Continue try to sync metadata of delivery "%s".', $params['deliveryId'])
new DeliverySyncTask(),
[$resourceSyncDTO, 0],
__(
'Syncing data of a delivery "%s".',
$resourceSyncDTO->getResourceId()
)
);
}

private function getFeatureFlag(): FeatureFlagChecker
{
return $this->getServiceLocator()->get(FeatureFlagChecker::class);
}

private function getPrepareDataService(): PrepareDataService
{
return $this->getServiceLocator()->get(PrepareDataService::class);
}
}
107 changes: 107 additions & 0 deletions model/DataStore/DeliverySyncTask.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<?php

/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2021-2022 (original work) Open Assessment Technologies SA;
*/

declare(strict_types=1);

namespace oat\taoDeliveryRdf\model\DataStore;

use JsonSerializable;
use oat\generis\model\OntologyAwareTrait;
use oat\oatbox\extension\AbstractAction;
use oat\oatbox\reporting\Report;
use oat\oatbox\service\exception\InvalidServiceManagerException;
use oat\tao\model\taskQueue\QueueDispatcher;
use Throwable;

class DeliverySyncTask extends AbstractAction implements JsonSerializable
{
use OntologyAwareTrait;

/**
* @throws InvalidServiceManagerException
*/
public function __invoke($params)
{
$report = new Report(Report::TYPE_SUCCESS);
$resourceSyncDTO = new ResourceSyncDTO(...$params[0]);
$tryNumber = $params[1];

if ($tryNumber < $resourceSyncDTO->getMaxTries()) {
$tryNumber++;
try {
$this->getPersistDataService()->persist($resourceSyncDTO);
$report->setMessage(sprintf(
'Success MetaData syncing for delivery: %s',
$resourceSyncDTO->getResourceId()
));
} catch (Throwable $exception) {
$this->logError(sprintf(
'Failing MetaData syncing for delivery: %s with message: %s',
$resourceSyncDTO->getResourceId(),
$exception->getMessage()
));

$report->setType(Report::TYPE_ERROR);
$report->setMessage($exception->getMessage());
$this->requeueTask($resourceSyncDTO, $tryNumber);
}
}

return $report;
}

public function jsonSerialize(): string
{
return self::class;
}

/**
* @throws InvalidServiceManagerException
*/
private function requeueTask(ResourceSyncDTO $resourceSyncDTO, int $tryNumber): void
{
$queueDispatcher = $this->getQueueDispatcher();
$queueDispatcher->createTask(
$this,
[$resourceSyncDTO, $tryNumber],
__(
'DataStore sync retry number "%s" for delivery with id: "%s".',
$tryNumber,
$resourceSyncDTO->getResourceId()
)
);
}

/**
* @throws InvalidServiceManagerException
*/
private function getQueueDispatcher(): QueueDispatcher
{
return $this->getServiceLocator()->get(QueueDispatcher::SERVICE_ID);
}

/**
* @throws InvalidServiceManagerException
*/
private function getPersistDataService(): PersistDataService
{
return $this->getServiceLocator()->get(PersistDataService::class);
}
}
192 changes: 0 additions & 192 deletions model/DataStore/MetaDataDeliverySyncTask.php

This file was deleted.

Loading

0 comments on commit 54708e5

Please sign in to comment.