diff --git a/models/classes/Command/DeleteItemCommand.php b/models/classes/Command/DeleteItemCommand.php new file mode 100644 index 00000000..0b2820ba --- /dev/null +++ b/models/classes/Command/DeleteItemCommand.php @@ -0,0 +1,47 @@ +resource = $resource; + $this->deleteRelatedAssets = $deleteRelatedAssets; + } + + public function getResource(): core_kernel_classes_Resource + { + return $this->resource; + } + + public function mustDeleteRelatedAssets(): bool + { + return $this->deleteRelatedAssets; + } +} diff --git a/models/classes/class.ItemsService.php b/models/classes/class.ItemsService.php index 8ee98724..21d65def 100755 --- a/models/classes/class.ItemsService.php +++ b/models/classes/class.ItemsService.php @@ -19,9 +19,10 @@ * (under the project TAO-TRANSFER); * 2009-2012 (update and modification) Public Research Centre Henri Tudor * (under the project TAO-SUSTAIN & TAO-DEV); - * 2012-2016 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT) + * 2012-2023 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT) */ +use oat\taoItems\model\Command\DeleteItemCommand; use oat\taoItems\model\TaoItemOntology; use oat\generis\model\fileReference\FileReferenceSerializer; use oat\oatbox\filesystem\Directory; @@ -132,6 +133,37 @@ public function isItemClass(core_kernel_classes_Class $clazz) return $clazz->equals($this->getRootClass()) || $clazz->isSubClassOf($this->getRootClass()); } + public function delete(DeleteItemCommand $command): void + { + $resource = $command->getResource(); + + if (LockManager::getImplementation()->isLocked($resource)) { + $userId = common_session_SessionManager::getSession()->getUser()->getIdentifier(); + LockManager::getImplementation()->releaseLock($resource, $userId); + } + + $result = $this->deleteItemContent($resource) && parent::deleteResource($resource); + + if (!$result) { + throw new Exception( + sprintf( + 'Error deleting item content for resource "%s" [%s]', + $resource->getLabel(), + $resource->getUri() + ) + ); + } + + $this->getEventManager()->trigger( + new ItemRemovedEvent( + $resource->getUri(), + [ + ItemRemovedEvent::PAYLOAD_KEY_DELETE_RELATED_ASSETS => $command->mustDeleteRelatedAssets(), + ] + ) + ); + } + /** * please call deleteResource() instead * @deprecated @@ -146,21 +178,17 @@ public function deleteItem(core_kernel_classes_Resource $item) * @param core_kernel_classes_Resource $resource * @throws common_exception_Unauthorized * @return boolean + * @deprecated use self::delete() */ public function deleteResource(core_kernel_classes_Resource $resource) { - if (LockManager::getImplementation()->isLocked($resource)) { - $userId = common_session_SessionManager::getSession()->getUser()->getIdentifier(); - LockManager::getImplementation()->releaseLock($resource, $userId); - } - - $result = $this->deleteItemContent($resource) && parent::deleteResource($resource); + try { + $this->delete(new DeleteItemCommand($resource)); - if ($result) { - $this->getEventManager()->trigger(new ItemRemovedEvent($resource->getUri())); + return true; + } catch (Throwable $exception) { + return false; } - - return $result; } /** diff --git a/models/classes/event/ItemRemovedEvent.php b/models/classes/event/ItemRemovedEvent.php index c6d6eda4..8adc5630 100644 --- a/models/classes/event/ItemRemovedEvent.php +++ b/models/classes/event/ItemRemovedEvent.php @@ -15,49 +15,39 @@ * 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) 2016 (original work) Open Assessment Technologies SA - * + * Copyright (c) 2016-2023 (original work) Open Assessment Technologies SA. */ namespace oat\taoItems\model\event; -use JsonSerializable; use oat\oatbox\event\Event; +use JsonSerializable; class ItemRemovedEvent implements Event, JsonSerializable { - /** @var string */ - protected $itemUri; + public const PAYLOAD_KEY_DELETE_RELATED_ASSETS = 'deleteRelatedAssets'; + public const PAYLOAD_KEY_ITEM_URI = 'itemUri'; - /** - * @param String $itemUri - */ - public function __construct($itemUri) + protected string $itemUri; + + private array $payload; + + public function __construct(string $itemUri, array $payload = []) { $this->itemUri = $itemUri; + $this->payload = $payload; } - - /** - * Return a unique name for this event - * @see \oat\oatbox\event\Event::getName() - */ public function getName() { return get_class($this); } - /** - * Specify data which should be serialized to JSON - * @link http://php.net/manual/en/jsonserializable.jsonserialize.php - * @return mixed data which can be serialized by json_encode, - * which is a value of any type other than a resource. - * @since 5.4.0 - */ public function jsonSerialize() { - return [ - 'itemUri' => $this->itemUri - ]; + return array_merge( + [self::PAYLOAD_KEY_ITEM_URI => $this->itemUri], + $this->payload + ); } } diff --git a/test/unit/model/event/ItemRemovedEventTest.php b/test/unit/model/event/ItemRemovedEventTest.php new file mode 100644 index 00000000..5bbe5c80 --- /dev/null +++ b/test/unit/model/event/ItemRemovedEventTest.php @@ -0,0 +1,48 @@ + true, + ] + ); + + $this->assertSame(ItemRemovedEvent::class, $event->getName()); + $this->assertSame( + [ + ItemRemovedEvent::PAYLOAD_KEY_ITEM_URI => 'itemUri', + ItemRemovedEvent::PAYLOAD_KEY_DELETE_RELATED_ASSETS => true, + ], + $event->jsonSerialize() + ); + } +} diff --git a/test/unit/models/classes/Command/DeleteItemCommandTest.php b/test/unit/models/classes/Command/DeleteItemCommandTest.php new file mode 100644 index 00000000..74a011ee --- /dev/null +++ b/test/unit/models/classes/Command/DeleteItemCommandTest.php @@ -0,0 +1,39 @@ +createMock(core_kernel_classes_Resource::class); + $command = new DeleteItemCommand($resource, true); + + $this->assertSame($resource, $command->getResource()); + $this->assertTrue($command->mustDeleteRelatedAssets()); + } +}