src/CoreBundle/Model/UploadedFile/UploadedFileFacade.php line 182

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\CoreBundle\Model\UploadedFile;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use League\Flysystem\FilesystemInterface;
  6. use App\CoreBundle\Model\UploadedFile\Config\UploadedFileConfig;
  7. use App\CoreBundle\Model\UploadedFile\Config\UploadedFileTypeConfig;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. class UploadedFileFacade
  10. {
  11.     /**
  12.      * @var \Doctrine\ORM\EntityManagerInterface
  13.      */
  14.     protected $em;
  15.     /**
  16.      * @var \App\CoreBundle\Model\UploadedFile\Config\UploadedFileConfig
  17.      */
  18.     protected $uploadedFileConfig;
  19.     /**
  20.      * @var \App\CoreBundle\Model\UploadedFile\UploadedFileRepository
  21.      */
  22.     protected $uploadedFileRepository;
  23.     /**
  24.      * @var \League\Flysystem\FilesystemInterface
  25.      */
  26.     protected $filesystem;
  27.     /**
  28.      * @var \App\CoreBundle\Model\UploadedFile\UploadedFileLocator
  29.      */
  30.     protected $uploadedFileLocator;
  31.     /**
  32.      * @var \App\CoreBundle\Model\UploadedFile\UploadedFileFactoryInterface
  33.      */
  34.     protected $uploadedFileFactory;
  35.     /**
  36.      * @param \Doctrine\ORM\EntityManagerInterface $em
  37.      * @param \App\CoreBundle\Model\UploadedFile\Config\UploadedFileConfig $uploadedFileConfig
  38.      * @param \App\CoreBundle\Model\UploadedFile\UploadedFileRepository $uploadedFileRepository
  39.      * @param \League\Flysystem\FilesystemInterface $filesystem
  40.      * @param \App\CoreBundle\Model\UploadedFile\UploadedFileLocator $uploadedFileLocator
  41.      * @param \App\CoreBundle\Model\UploadedFile\UploadedFileFactoryInterface $uploadedFileFactory
  42.      */
  43.     public function __construct(
  44.         EntityManagerInterface $em,
  45.         UploadedFileConfig $uploadedFileConfig,
  46.         UploadedFileRepository $uploadedFileRepository,
  47.         FilesystemInterface $filesystem,
  48.         UploadedFileLocator $uploadedFileLocator,
  49.         UploadedFileFactoryInterface $uploadedFileFactory
  50.     ) {
  51.         $this->em $em;
  52.         $this->uploadedFileConfig $uploadedFileConfig;
  53.         $this->uploadedFileRepository $uploadedFileRepository;
  54.         $this->filesystem $filesystem;
  55.         $this->uploadedFileLocator $uploadedFileLocator;
  56.         $this->uploadedFileFactory $uploadedFileFactory;
  57.     }
  58.     /**
  59.      * @param object $entity
  60.      * @param \App\CoreBundle\Model\UploadedFile\UploadedFileData $uploadedFileData
  61.      * @param string $type
  62.      */
  63.     public function manageFiles(object $entityUploadedFileData $uploadedFileDatastring $type UploadedFileTypeConfig::DEFAULT_TYPE_NAME): void
  64.     {
  65.         $uploadedFileEntityConfig $this->uploadedFileConfig->getUploadedFileEntityConfig($entity);
  66.         $uploadedFileTypeConfig $uploadedFileEntityConfig->getTypeByName($type);
  67.         $uploadedFiles $uploadedFileData->uploadedFiles;
  68.         $uploadedFilenames $uploadedFileData->uploadedFilenames;
  69.         $orderedFiles $uploadedFileData->orderedFiles;
  70.         $this->updateFilesOrder($orderedFiles);
  71.         $this->updateFilenamesAndSlugs($uploadedFileData->currentFilenamesIndexedById);
  72.         if ($uploadedFileTypeConfig->isMultiple()) {
  73.             $this->uploadFiles($entity$uploadedFileEntityConfig->getEntityName(), $type$uploadedFiles$uploadedFilenamescount($orderedFiles));
  74.         } else {
  75.             if (count($orderedFiles) > 1) {
  76.                 array_shift($orderedFiles);
  77.                 $this->deleteFiles($entity$orderedFiles);
  78.             }
  79.             $this->deleteAllUploadedFilesByEntity($entity);
  80.             $this->uploadFile($entity$uploadedFileEntityConfig->getEntityName(), $typearray_pop($uploadedFiles), array_pop($uploadedFilenames));
  81.         }
  82.         $this->deleteFiles($entity$uploadedFileData->filesToDelete);
  83.     }
  84.     /**
  85.      * @param object $entity
  86.      * @param string $entityName
  87.      * @param string $type
  88.      * @param string $temporaryFilename
  89.      * @param string $uploadedFilename
  90.      */
  91.     protected function uploadFile(object $entitystring $entityNamestring $typestring $temporaryFilenamestring $uploadedFilename): void
  92.     {
  93.         $entityId $this->getEntityId($entity);
  94.         $newUploadedFile $this->uploadedFileFactory->create(
  95.             $entityName,
  96.             $entityId,
  97.             $type,
  98.             $temporaryFilename,
  99.             $uploadedFilename
  100.         );
  101.         $this->em->persist($newUploadedFile);
  102.         $this->em->flush($newUploadedFile);
  103.     }
  104.     /**
  105.      * @param object $entity
  106.      * @param string $entityName
  107.      * @param string $type
  108.      * @param array $temporaryFilenames
  109.      * @param array $uploadedFilenames
  110.      * @param int $existingFilesCount
  111.      */
  112.     protected function uploadFiles(object $entitystring $entityNamestring $type, array $temporaryFilenames, array $uploadedFilenamesint $existingFilesCount): void
  113.     {
  114.         if (count($temporaryFilenames) > 0) {
  115.             $entityId $this->getEntityId($entity);
  116.             $files $this->uploadedFileFactory->createMultiple($entityName$entityId$type$temporaryFilenames$uploadedFilenames$existingFilesCount);
  117.             foreach ($files as $file) {
  118.                 $this->em->persist($file);
  119.             }
  120.             $this->em->flush();
  121.         }
  122.     }
  123.     /**
  124.      * @param \App\CoreBundle\Model\UploadedFile\UploadedFile $uploadedFile
  125.      */
  126.     public function deleteFileFromFilesystem(UploadedFile $uploadedFile): void
  127.     {
  128.         $filepath $this->uploadedFileLocator->getAbsoluteUploadedFileFilepath($uploadedFile);
  129.         if ($this->filesystem->has($filepath)) {
  130.             $this->filesystem->delete($filepath);
  131.         }
  132.     }
  133.     /**
  134.      * @param object $entity
  135.      * @param \App\CoreBundle\Model\UploadedFile\UploadedFile[] $uploadedFiles
  136.      */
  137.     public function deleteFiles(object $entity, array $uploadedFiles): void
  138.     {
  139.         $entityName $this->uploadedFileConfig->getEntityName($entity);
  140.         $entityId $this->getEntityId($entity);
  141.         foreach ($uploadedFiles as $uploadedFile) {
  142.             $uploadedFile->checkForDelete($entityName$entityId);
  143.         }
  144.         foreach ($uploadedFiles as $uploadedFile) {
  145.             $this->em->remove($uploadedFile);
  146.         }
  147.         $this->em->flush($uploadedFiles);
  148.     }
  149.     /**
  150.      * @param object $entity
  151.      */
  152.     public function deleteAllUploadedFilesByEntity(object $entity): void
  153.     {
  154.         $uploadedFiles $this->uploadedFileRepository->getAllUploadedFilesByEntity(
  155.             $this->uploadedFileConfig->getEntityName($entity),
  156.             $this->getEntityId($entity)
  157.         );
  158.         $this->deleteFiles($entity$uploadedFiles);
  159.     }
  160.     /**
  161.      * @param object $entity
  162.      * @param string $type
  163.      * @return \App\CoreBundle\Model\UploadedFile\UploadedFile[]
  164.      */
  165.     public function getUploadedFilesByEntity(object $entitystring $type UploadedFileTypeConfig::DEFAULT_TYPE_NAME): array
  166.     {
  167.         return $this->uploadedFileRepository->getUploadedFilesByEntity(
  168.             $this->uploadedFileConfig->getEntityName($entity),
  169.             $this->getEntityId($entity),
  170.             $type
  171.         );
  172.     }
  173.     /**
  174.      * @param object $entity
  175.      * @return int
  176.      */
  177.     protected function getEntityId(object $entity): int
  178.     {
  179.         $entityMetadata $this->em->getClassMetadata(get_class($entity));
  180.         $identifier $entityMetadata->getIdentifierValues($entity);
  181.         if (count($identifier) === 1) {
  182.             return array_pop($identifier);
  183.         }
  184.         $message 'Entity "' get_class($entity) . '" has not set primary key or primary key is compound."';
  185.         throw new \App\CoreBundle\Model\UploadedFile\Exception\EntityIdentifierException($message);
  186.     }
  187.     /**
  188.      * @param int $uploadedFileId
  189.      * @return \App\CoreBundle\Model\UploadedFile\UploadedFile
  190.      */
  191.     public function getById(int $uploadedFileId): UploadedFile
  192.     {
  193.         return $this->uploadedFileRepository->getById($uploadedFileId);
  194.     }
  195.     /**
  196.      * @param \App\CoreBundle\Model\UploadedFile\UploadedFile $uploadedFile
  197.      * @return string
  198.      */
  199.     public function getAbsoluteUploadedFileFilepath(UploadedFile $uploadedFile): string
  200.     {
  201.         return $this->uploadedFileLocator->getAbsoluteUploadedFileFilepath($uploadedFile);
  202.     }
  203.     /**
  204.      * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
  205.      * @param \App\CoreBundle\Model\UploadedFile\UploadedFile $uploadedFile
  206.      * @return string
  207.      */
  208.     public function getUploadedFileUrl(UploadedFile $uploadedFile): string
  209.     {
  210.         return $this->uploadedFileLocator->getUploadedFileUrl($uploadedFile);
  211.     }
  212.     /**
  213.      * @param \App\CoreBundle\Model\UploadedFile\UploadedFile[] $uploadedFiles
  214.      */
  215.     protected function updateFilesOrder(array $uploadedFiles): void
  216.     {
  217.         $i 0;
  218.         foreach ($uploadedFiles as $uploadedFile) {
  219.             $uploadedFile->setPosition($i++);
  220.         }
  221.         $this->em->flush($uploadedFiles);
  222.     }
  223.     /**
  224.      * @param array $fileNamesIndexedByFileId
  225.      */
  226.     protected function updateFilenamesAndSlugs(array $fileNamesIndexedByFileId): void
  227.     {
  228.         foreach ($fileNamesIndexedByFileId as $fileId => $fileName) {
  229.             $file $this->getById($fileId);
  230.             $file->setNameAndSlug($fileName);
  231.             $this->em->flush($file);
  232.         }
  233.     }
  234.     /**
  235.      * @param int $uploadedFileId
  236.      * @param string $uploadedFileSlug
  237.      * @param string $uploadedFileExtension
  238.      * @return \App\CoreBundle\Model\UploadedFile\UploadedFile
  239.      */
  240.     public function getByIdSlugAndExtension(int $uploadedFileIdstring $uploadedFileSlugstring $uploadedFileExtension): UploadedFile
  241.     {
  242.         return $this->uploadedFileRepository->getByIdSlugAndExtension($uploadedFileId$uploadedFileSlug$uploadedFileExtension);
  243.     }
  244. }