replication-8.x-1.x-dev/src/ProcessFileAttachment.php
src/ProcessFileAttachment.php
<?php
namespace Drupal\replication;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\file\FileInterface;
use Drupal\multiversion\Entity\Index\MultiversionIndexFactory;
use Drupal\multiversion\Entity\WorkspaceInterface;
class ProcessFileAttachment {
/** @var \Drupal\Core\Session\AccountProxyInterface */
protected $current_user;
/** @var \Drupal\Core\Entity\EntityTypeManagerInterface */
protected $entity_type_manager;
/** @var \Drupal\multiversion\Entity\Index\MultiversionIndexFactory */
protected $index_factory;
function __construct(AccountProxyInterface $current_user, EntityTypeManagerInterface $entity_type_manager, MultiversionIndexFactory $index_factory) {
$this->current_user = $current_user;
$this->entity_type_manager = $entity_type_manager;
$this->index_factory = $index_factory;
}
/**
* Processes a file attachment.
*
* Returns the file object or NULL if it can't be created.
*
* @param array $data
* @param string $format
* @param \Drupal\multiversion\Entity\WorkspaceInterface $workspace
*
* @return \Drupal\file\FileInterface|NULL
*/
public function process($data, $format, WorkspaceInterface $workspace = null) {
$current_user_id = $this->current_user->id();
$uri = $data['uri'];
$file_uuid = $data['uuid'];
multiversion_prepare_file_destination($uri);
// Check if exists a file entity with this uuid.
$uuid_index = $this->index_factory->get('multiversion.entity_index.uuid', $workspace);
$entity_info = $uuid_index->get($file_uuid);
if (!empty($entity_info)) {
/** @var FileInterface $file */
$file = $this->entity_type_manager->getStorage($entity_info['entity_type_id'])
->load($entity_info['entity_id']);
if (!$file || !is_file($file->getFileUri())) {
$file_context = [
'uri' => $uri,
'uuid' => $file_uuid,
'status' => FILE_STATUS_PERMANENT,
'uid' => $current_user_id,
];
if ($workspace) {
$file_context['workspace'] = $workspace;
}
$file = \Drupal::getContainer()
->get('serializer')
->deserialize($data['data'], '\Drupal\file\FileInterface', $format, $file_context);
}
return $file;
}
// Create the new entity file and the file itself.
// Check if exists a file with this $uri, if it exists then rename the file.
$existing_files = $this->entity_type_manager
->getStorage('file')
->loadByProperties(['uri' => $uri]);
if (count($existing_files)) {
$uri = file_destination($uri, FILE_EXISTS_RENAME);
}
$file_context = [
'uri' => $uri,
'uuid' => $file_uuid,
'status' => FILE_STATUS_PERMANENT,
'uid' => $current_user_id,
'workspace' => $workspace,
];
$file = \Drupal::getContainer()
->get('serializer')
->deserialize($data['data'], '\Drupal\file\FileInterface', $format, $file_context);
return $file;
}
}
