Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\ReportBundle\Scheduler\Model; | |
use Mautic\CoreBundle\Exception\FileInvalidException; | |
use Mautic\CoreBundle\Exception\FilePathException; | |
use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
use Mautic\CoreBundle\Helper\FilePathResolver; | |
use Mautic\CoreBundle\Helper\FileProperties; | |
use Mautic\ReportBundle\Entity\Report; | |
use Mautic\ReportBundle\Exception\FileTooBigException; | |
class FileHandler | |
{ | |
private const REPORTS_DIR = 'csv_reports'; | |
public function __construct( | |
private FilePathResolver $filePathResolver, | |
private FileProperties $fileProperties, | |
private CoreParametersHelper $coreParametersHelper | |
) { | |
} | |
/** | |
* @throws FileInvalidException | |
* @throws FileTooBigException | |
*/ | |
public function fileCanBeAttached(string $filePath): void | |
{ | |
$fileSize = $this->fileProperties->getFileSize($filePath); | |
$maxFileSize = (int) $this->coreParametersHelper->get('report_export_max_filesize_in_bytes'); | |
if ($fileSize > $maxFileSize) { | |
throw new FileTooBigException("File {$filePath} has {$fileSize} bytes which is more than the limit of {$maxFileSize} bytes."); | |
} | |
} | |
/** | |
* Zips the file and returns the path where the zip file was created. | |
* | |
* @throws FilePathException | |
*/ | |
public function zipIt(string $originalFilePath): string | |
{ | |
$zipFilePath = str_replace('.csv', '.zip', $originalFilePath); | |
$zipArchive = new \ZipArchive(); | |
if (true === $zipArchive->open($zipFilePath, \ZipArchive::OVERWRITE | \ZipArchive::CREATE)) { | |
$zipArchive->addFile($originalFilePath, 'report.csv'); | |
$zipArchive->close(); | |
return $zipFilePath; | |
} | |
throw new FilePathException("Could not create zip archive at {$zipFilePath}. {$zipArchive->getStatusString()}"); | |
} | |
public function getPathToCompressedCsvFileForReport(Report $report): string | |
{ | |
return $this->getPathToCompressedCsvFileForReportId($report->getId()); | |
} | |
public function getPathToCompressedCsvFileForReportId(int $reportId): string | |
{ | |
return $this->getCompressedCsvFileForReportDir()."/report_{$reportId}.zip"; | |
} | |
/** | |
* @codeCoverageIgnore as it calls PHP function only. | |
*/ | |
public function compressedCsvFileForReportExists(Report $report): bool | |
{ | |
$filePath = $this->getPathToCompressedCsvFileForReport($report); | |
return file_exists($filePath); | |
} | |
public function moveZipToPermanentLocation(Report $report, string $originalPath): void | |
{ | |
$compressedCsvPath = $this->getPathToCompressedCsvFileForReport($report); | |
$this->filePathResolver->delete($compressedCsvPath); | |
$this->filePathResolver->createDirectory(dirname($compressedCsvPath)); | |
$this->filePathResolver->move($originalPath, $compressedCsvPath); | |
} | |
public function delete(string $filePath): void | |
{ | |
$this->filePathResolver->delete($filePath); | |
} | |
public function deleteCompressedCsvFileForReportId(int $reportId): void | |
{ | |
$filePath = $this->getPathToCompressedCsvFileForReportId($reportId); | |
if (file_exists($filePath)) { | |
$this->delete($filePath); | |
} | |
} | |
public function getCompressedCsvFileForReportDir(): string | |
{ | |
$reportDir = $this->coreParametersHelper->get('report_temp_dir'); | |
return $reportDir.'/'.self::REPORTS_DIR; | |
} | |
} | |