<?php
namespace App\Service\CustomerFile;
use App\Model\CustomerFile\CustomerFile;
use App\Service\ApiWebService;
use App\Service\Provider\ApiGedProvider;
use App\Service\User\UserManager;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
/**
* Class CustomerFileDownloadManager.
*/
final class CustomerFileDownloadManager
{
/**
* @var ApiGedProvider
*/
private $apiGedProvider;
/**
* @var ApiWebService
*/
private $apiWebService;
/**
* @var UserManager
*/
private $userManager;
/**
* CustomerFileDownloadManager constructor.
*
* @param ApiGedProvider $apiGedProvider
* @param ApiWebService $apiWebService
* @param UserManager $userManager
*/
public function __construct(ApiGedProvider $apiGedProvider, ApiWebService $apiWebService, UserManager $userManager)
{
$this->apiGedProvider = $apiGedProvider;
$this->apiWebService = $apiWebService;
$this->userManager = $userManager;
}
/**
* @param CustomerFile $customerFile
*
* @return bool|false|string
*
* @throws TransportExceptionInterface
*/
public function getFile(CustomerFile $customerFile): string
{
if ($this->userManager->getCurrentLoggedUser()->getCustomerId() === $customerFile->getCustomerId()) {
return $this->getFileFromApi($customerFile);
}
throw new UnauthorizedHttpException('', 'Forbidden.');
}
/**
* @param string $customerFileId
*
* @return string
*
* @throws TransportExceptionInterface
*/
public function getLogoWithId(string $customerFileId): string
{
return $this->getFileFromApi(null, $customerFileId);
}
/**
* @param CustomerFile|null $customerFile
* @param string|null $customerFileId
*
* @return bool|string
*
* @throws TransportExceptionInterface
*/
private function getFileFromApi(CustomerFile $customerFile = null, string $customerFileId = null)
{
$response = $this->apiWebService->send(
$this->apiGedProvider,
'GET',
null === $customerFileId ? $customerFile->getContentUrl() : '/api/logo/'.$customerFileId,
null
);
$fileName = tempnam(sys_get_temp_dir(), null === $customerFile ? 'logo' : $customerFile->getCustomerId());
$file = fopen($fileName, 'a+');
foreach ($this->apiWebService->getStreamFromResponse($response) as $chunk) {
fwrite($file, $chunk->getContent());
}
fclose($file);
return $fileName;
}
}