Skip to content
This repository was archived by the owner on May 20, 2019. It is now read-only.

Bulk api status #6

Merged
merged 11 commits into from
Mar 30, 2018
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Magento\AsynchronousOperations\Api;

/**
* Interface BulkStatusInterface
* Bulk summary data with list of operations items short data.
*
* @api
*/
interface BulkStatusInterface extends \Magento\Framework\Bulk\BulkStatusInterface
{
/**
* Get Bulk summary data with list of operations items full data.
*
* @param string $bulkUuid
* @return \Magento\AsynchronousOperations\Api\Data\DetailedBulkStatusInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getBulkDetailedStatus($bulkUuid);

/**
* Get Bulk summary data with list of operations items short data.
*
* @param string $bulkUuid
* @return \Magento\AsynchronousOperations\Api\Data\BulkStatusInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getBulkShortStatus($bulkUuid);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Magento\AsynchronousOperations\Api\Data;

/**
* Interface BulkStatusInterface
*
* @api
*/
interface BulkStatusInterface extends BulkSummaryInterface
{

const OPERATIONS_LIST = 'operations_list';

/**
* Retrieve list of operation with statuses (short data).
*
* @return \Magento\AsynchronousOperations\Api\Data\OperationStatusInterface[]
*/
public function getOperationsList();

/**
* Set operations list.
*
* @param \Magento\AsynchronousOperations\Api\Data\OperationStatusInterface[] $operationStatusList
* @return $this
*/
public function setOperationsList($operationStatusList);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Magento\AsynchronousOperations\Api\Data;

/**
* Interface BulkStatusInterface
* Bulk summary data with list of operations items full data.
*
* @api
*/
interface DetailedBulkStatusInterface extends BulkSummaryInterface
{

const OPERATIONS_LIST = 'operations_list';

/**
* Retrieve operations list.
*
* @return \Magento\AsynchronousOperations\Api\Data\OperationInterface[]
*/
public function getOperationsList();

/**
* Set operations list.
*
* @param \Magento\AsynchronousOperations\Api\Data\OperationInterface[] $operationStatusList
* @return $this
*/
public function setOperationsList($operationStatusList);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Magento\AsynchronousOperations\Api\Data;

/**
* Getter Class OperationsStatusInterface
* Instead of OperationInterface this class don't provide all operation data
* and not responsive to set any data, just to get operation data
* without serialized_data and result_serialized_data
*
* @api
* @see \Magento\AsynchronousOperations\Api\Data\OperationInterface
*/
interface OperationStatusInterface
{
/**
* Operation id
*
* @return int
*/
public function getId();

/**
* Get operation status
*
* OPEN | COMPLETE | RETRIABLY_FAILED | NOT_RETRIABLY_FAILED
*
* @return int
*/
public function getStatus();

/**
* Get result message
*
* @return string
*/
public function getResultMessage();

/**
* Get error code
*
* @return int
*/
public function getErrorCode();
}
136 changes: 105 additions & 31 deletions app/code/Magento/AsynchronousOperations/Model/BulkStatus.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,24 @@

namespace Magento\AsynchronousOperations\Model;

use Magento\AsynchronousOperations\Model\ResourceModel\Bulk\CollectionFactory as BulkCollectionFactory;
use Magento\AsynchronousOperations\Model\ResourceModel\Operation\CollectionFactory as OperationCollectionFactory;
use Magento\AsynchronousOperations\Api\Data\OperationInterface;
use Magento\AsynchronousOperations\Api\Data\BulkSummaryInterface;
use Magento\Framework\App\ResourceConnection;
use Magento\AsynchronousOperations\Model\BulkStatus\CalculatedStatusSql;
use Magento\Framework\EntityManager\MetadataPool;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\EntityManager\EntityManager;
use Magento\AsynchronousOperations\Api\Data\BulkStatusInterfaceFactory as BulkStatusShortFactory;
use Magento\AsynchronousOperations\Api\Data\DetailedBulkStatusInterfaceFactory as BulkStatusDetailedFactory;
use Magento\AsynchronousOperations\Api\BulkStatusInterface;

/**
* Class BulkStatus
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class BulkStatus implements \Magento\Framework\Bulk\BulkStatusInterface
class BulkStatus implements BulkStatusInterface
{
/**
* @var \Magento\AsynchronousOperations\Api\Data\BulkSummaryInterfaceFactory
Expand Down Expand Up @@ -43,25 +51,50 @@ class BulkStatus implements \Magento\Framework\Bulk\BulkStatusInterface
private $metadataPool;

/**
* BulkStatus constructor.
* @param ResourceModel\Bulk\CollectionFactory $bulkCollection
* @param ResourceModel\Operation\CollectionFactory $operationCollection
* @param ResourceConnection $resourceConnection
* @param CalculatedStatusSql $calculatedStatusSql
* @param MetadataPool $metadataPool
* @var EntityManager
*/
private $entityManager;

/**
* @var \Magento\AsynchronousOperations\Api\Data\DetailedBulkStatusInterfaceFactory
*/
private $bulkDetailedFactory;

/**
* @var \Magento\AsynchronousOperations\Api\Data\BulkStatusInterfaceFactory
*/
private $bulkShortFactory;

/**
* Init dependencies.
*
* @param \Magento\AsynchronousOperations\Model\ResourceModel\Bulk\CollectionFactory $bulkCollection
* @param \Magento\AsynchronousOperations\Model\ResourceModel\Operation\CollectionFactory $operationCollection
* @param \Magento\Framework\App\ResourceConnection $resourceConnection
* @param \Magento\AsynchronousOperations\Model\BulkStatus\CalculatedStatusSql $calculatedStatusSql
* @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
* @param \Magento\AsynchronousOperations\Api\Data\DetailedBulkStatusInterfaceFactory $bulkDetailedFactory
* @param \Magento\AsynchronousOperations\Api\Data\BulkStatusInterfaceFactory $bulkShortFactory
* @param \Magento\Framework\EntityManager\EntityManager $entityManager
*/
public function __construct(
\Magento\AsynchronousOperations\Model\ResourceModel\Bulk\CollectionFactory $bulkCollection,
\Magento\AsynchronousOperations\Model\ResourceModel\Operation\CollectionFactory $operationCollection,
BulkCollectionFactory $bulkCollection,
OperationCollectionFactory $operationCollection,
ResourceConnection $resourceConnection,
CalculatedStatusSql $calculatedStatusSql,
MetadataPool $metadataPool
MetadataPool $metadataPool,
BulkStatusDetailedFactory $bulkDetailedFactory,
BulkStatusShortFactory $bulkShortFactory,
EntityManager $entityManager
) {
$this->operationCollectionFactory = $operationCollection;
$this->bulkCollectionFactory = $bulkCollection;
$this->resourceConnection = $resourceConnection;
$this->calculatedStatusSql = $calculatedStatusSql;
$this->metadataPool = $metadataPool;
$this->bulkDetailedFactory = $bulkDetailedFactory;
$this->bulkShortFactory = $bulkShortFactory;
$this->entityManager = $entityManager;
}

/**
Expand All @@ -73,12 +106,13 @@ public function getFailedOperationsByBulkId($bulkUuid, $failureType = null)
? [$failureType]
: [
OperationInterface::STATUS_TYPE_RETRIABLY_FAILED,
OperationInterface::STATUS_TYPE_NOT_RETRIABLY_FAILED
OperationInterface::STATUS_TYPE_NOT_RETRIABLY_FAILED,
];
$operations = $this->operationCollectionFactory->create()
->addFieldToFilter('bulk_uuid', $bulkUuid)
->addFieldToFilter('status', $failureCodes)
->getItems();

return $operations;
}

Expand All @@ -87,24 +121,10 @@ public function getFailedOperationsByBulkId($bulkUuid, $failureType = null)
*/
public function getOperationsCountByBulkIdAndStatus($bulkUuid, $status)
{
if ($status === OperationInterface::STATUS_TYPE_OPEN) {
/**
* Total number of operations that has been scheduled within the given bulk
*/
$allOperationsQty = $this->getOperationCount($bulkUuid);

/**
* Number of operations that has been processed (i.e. operations with any status but 'open')
*/
$allProcessedOperationsQty = (int)$this->operationCollectionFactory->create()
->addFieldToFilter('bulk_uuid', $bulkUuid)
->getSize();

return $allOperationsQty - $allProcessedOperationsQty;
}

/** @var \Magento\AsynchronousOperations\Model\ResourceModel\Operation\Collection $collection */
$collection = $this->operationCollectionFactory->create();

return $collection->addFieldToFilter('bulk_uuid', $bulkUuid)
->addFieldToFilter('status', $status)
->getSize();
Expand All @@ -123,11 +143,15 @@ public function getBulksByUser($userId)
OperationInterface::STATUS_TYPE_NOT_RETRIABLY_FAILED,
BulkSummaryInterface::NOT_STARTED,
OperationInterface::STATUS_TYPE_OPEN,
OperationInterface::STATUS_TYPE_COMPLETE
OperationInterface::STATUS_TYPE_COMPLETE,
];
$select = $collection->getSelect();
$select->columns(['status' => $this->calculatedStatusSql->get($operationTableName)])
->order(new \Zend_Db_Expr('FIELD(status, ' . implode(',', $statusesArray) . ')'));
->order(
new \Zend_Db_Expr(
'FIELD(status, ' . implode(',', $statusesArray) . ')'
)
);
$collection->addFieldToFilter('user_id', $userId)
->addOrder('start_time');

Expand Down Expand Up @@ -163,11 +187,14 @@ public function getBulkStatus($bulkUuid)
/**
* Number of operations that has been completed successfully
*/
$allCompleteOperationsQty = $this->operationCollectionFactory->create()
->addFieldToFilter('bulk_uuid', $bulkUuid)->addFieldToFilter(
$allCompleteOperationsQty = $this->operationCollectionFactory
->create()
->addFieldToFilter('bulk_uuid', $bulkUuid)
->addFieldToFilter(
'status',
OperationInterface::STATUS_TYPE_COMPLETE
)->getSize();
)
->getSize();

if ($allCompleteOperationsQty == $allOperationsQty) {
return BulkSummaryInterface::FINISHED_SUCCESSFULLY;
Expand Down Expand Up @@ -197,4 +224,51 @@ private function getOperationCount($bulkUuid)
->where('uuid = ?', $bulkUuid)
);
}

/**
* @inheritDoc
*/
public function getBulkDetailedStatus($bulkUuid)
{
$bulkSummary = $this->bulkDetailedFactory->create();

/** @var \Magento\AsynchronousOperations\Api\Data\DetailedBulkStatusInterface $bulk */
$bulk = $this->entityManager->load($bulkSummary, $bulkUuid);

if ($bulk->getBulkId() === null) {
throw new NoSuchEntityException(
__(
'Bulk uuid %bulkUuid not exist',
['bulkUuid' => $bulkUuid]
)
);
}
$operations = $this->operationCollectionFactory->create()->addFieldToFilter('bulk_uuid', $bulkUuid)->getItems();
$bulk->setOperationsList($operations);

return $bulk;
}

/**
* @inheritDoc
*/
public function getBulkShortStatus($bulkUuid)
{
$bulkSummary = $this->bulkShortFactory->create();

/** @var \Magento\AsynchronousOperations\Api\Data\BulkStatusInterface $bulk */
$bulk = $this->entityManager->load($bulkSummary, $bulkUuid);
if ($bulk->getBulkId() === null) {
throw new NoSuchEntityException(
__(
'Bulk uuid %bulkUuid not exist',
['bulkUuid' => $bulkUuid]
)
);
}
$operations = $this->operationCollectionFactory->create()->addFieldToFilter('bulk_uuid', $bulkUuid)->getItems();
$bulk->setOperationsList($operations);

return $bulk;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Magento\AsynchronousOperations\Model\BulkStatus;

use Magento\AsynchronousOperations\Api\Data\DetailedBulkStatusInterface;
use Magento\AsynchronousOperations\Model\BulkSummary;

class Detailed extends BulkSummary implements DetailedBulkStatusInterface
{
/**
* @inheritDoc
*/
public function getOperationsList()
{
return $this->getData(self::OPERATIONS_LIST);
}

/**
* @inheritDoc
*/
public function setOperationsList($operationStatusList)
{
return $this->setData(self::OPERATIONS_LIST, $operationStatusList);
}
}
Loading