Current Path : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/disk/lib/internals/ |
Current File : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/disk/lib/internals/deletedlogmanager.php |
<?php namespace Bitrix\Disk\Internals; use Bitrix\Disk\BaseObject; use Bitrix\Disk\Driver; use Bitrix\Disk\File; use Bitrix\Disk\Folder; use Bitrix\Disk\Internals\Steppers\DeletedLogMover; use Bitrix\Main\Loader; use Bitrix\Main\Type\DateTime; final class DeletedLogManager { /** @var bool */ private $isRegisteredShutdownFunction = false; /** @var array */ private $subscribedStorages = array(); /** @var array */ private $subscribedUsers = array(); /** @var array */ private $logData = array(); public function __construct() { $this->registerShutdownFunction(); } private function registerShutdownFunction() { if ($this->isRegisteredShutdownFunction) { return; } $self = $this; register_shutdown_function(function() use ($self){ $self->finalize(); }); $this->isRegisteredShutdownFunction = true; } /** * @return string|DeletedLogTable|DeletedLogV2Table * @throws \Bitrix\Main\ArgumentNullException * @throws \Bitrix\Main\ArgumentOutOfRangeException */ public function getLogTable() { if ($this->isMigrated()) { return DeletedLogV2Table::class; } return DeletedLogTable::class; } protected function isMigrated() { return DeletedLogMover::getStatus() === DeletedLogMover::STATUS_DONE; } /** * @param array $parameters * * @return \Bitrix\Main\ORM\Query\Result */ public function getEntries(array $parameters) { $className = $this->getLogTable(); return $className::getList($parameters); } public function finalize() { $this->insertLogData(); $this->cleanCache(); $this->notifyUsers(); } public function mark(BaseObject $object, $deletedBy) { if ($object instanceof Folder) { $dateTime = new DateTime(); $subscribers = Driver::getInstance()->collectSubscribers($object); foreach($subscribers as $storageId => $userId) { $this->logData[] = array( 'STORAGE_ID' => $storageId, 'OBJECT_ID' => $object->getId(), 'TYPE' => ObjectTable::TYPE_FOLDER, 'USER_ID' => $deletedBy, 'CREATE_TIME' => $dateTime, ); } $this->subscribedStorages = array_merge($this->subscribedStorages, array_keys($subscribers)); $this->subscribedUsers = array_merge($this->subscribedUsers, $subscribers); } elseif ($object instanceof File) { $dateTime = new DateTime(); $subscribers = Driver::getInstance()->collectSubscribers($object); foreach($subscribers as $storageId => $userId) { $this->logData[] = array( 'STORAGE_ID' => $storageId, 'OBJECT_ID' => $object->getId(), 'TYPE' => ObjectTable::TYPE_FILE, 'USER_ID' => $deletedBy, 'CREATE_TIME' => $dateTime, ); } $this->subscribedUsers = array_merge($this->subscribedUsers, $subscribers); } } public function markAfterMove(BaseObject $object, array $subscribersLostAccess, $updatedBy) { $dateTime = new DateTime(); $isFolder = $object instanceof Folder; foreach ($subscribersLostAccess as $storageId => $userId) { $this->logData[] = [ 'STORAGE_ID' => $storageId, 'OBJECT_ID' => $object->getId(), 'TYPE' => $isFolder? ObjectTable::TYPE_FOLDER : ObjectTable::TYPE_FILE, 'USER_ID' => $updatedBy, 'CREATE_TIME' => $dateTime, ]; } if ($isFolder) { Driver::getInstance()->cleanCacheTreeBitrixDisk(array_keys($subscribersLostAccess)); } Driver::getInstance()->sendChangeStatus($subscribersLostAccess); } private function insertLogData() { if (!$this->isMigrated()) { DeletedLogTable::insertBatch($this->logData); } DeletedLogV2Table::upsertBatch($this->logData); $this->logData = array(); } private function cleanCache() { Driver::getInstance()->cleanCacheTreeBitrixDisk(array_unique($this->subscribedStorages)); $this->subscribedStorages = array(); } private function notifyUsers() { Driver::getInstance()->sendChangeStatus(array_unique($this->subscribedUsers)); if (Loader::includeModule('pull')) { \Bitrix\Pull\Event::send(); } $this->subscribedUsers = array(); } }