Merge remote-tracking branch 'origin/docgenerator_oct_nov_21' into features/docgen-widget-generate-template

This commit is contained in:
2021-11-30 18:31:33 +01:00
9 changed files with 178 additions and 30 deletions

View File

@@ -20,29 +20,47 @@ use Chill\MainBundle\Pagination\PaginatorFactory;
use Chill\MainBundle\Serializer\Model\Collection;
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation;
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument;
use Chill\PersonBundle\Entity\SocialWork\Evaluation;
use Exception;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\TransferException;
use PhpOffice\PhpWord\TemplateProcessor;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\HeaderUtils;
use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlOpenstackGenerator;
use Jose\Component\Core\JWK;
use Base64Url\Base64Url;
use Symfony\Component\HttpKernel\KernelInterface;
// TODO à mettre dans services
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
class DocGeneratorTemplateController extends AbstractController
use Symfony\Contracts\HttpClient\HttpClientInterface;
final class DocGeneratorTemplateController extends AbstractController
{
private DocGeneratorTemplateRepository $docGeneratorTemplateRepository;
private PaginatorFactory $paginatorFactory;
public function __construct(DocGeneratorTemplateRepository $docGeneratorTemplateRepository, PaginatorFactory $paginatorFactory)
{
private KernelInterface $kernel;
private HttpClientInterface $client;
public function __construct(
DocGeneratorTemplateRepository $docGeneratorTemplateRepository,
PaginatorFactory $paginatorFactory,
KernelInterface $kernel,
HttpClientInterface $client
) {
$this->docGeneratorTemplateRepository = $docGeneratorTemplateRepository;
$this->paginatorFactory = $paginatorFactory;
$this->kernel = $kernel;
$this->client = $client;
}
/**
@@ -60,11 +78,39 @@ class DocGeneratorTemplateController extends AbstractController
): Response {
$getUrlGen = $tempUrlGenerator->generate(
'GET',
$template->getFile()
);
$template->getFile()->getFilename());
$tmpfname = tempnam(sys_get_temp_dir(), 'DOC_TEMPLATE');
file_put_contents($tmpfname, file_get_contents($getUrlGen->url));
$data = $this->client->request('GET', $getUrlGen->url);
$iv = $template->getFile()->getIv(); // iv as an Array
$ivGoodFormat = pack('C*', ...$iv); // iv as a String (ok for openssl_decrypt)
$method = 'AES-256-CBC';
$key = $template->getFile()->getKeyInfos()['k'];
$keyGoodFormat = Base64Url::decode($key);
$dataDecrypted = openssl_decrypt($data->getContent(), $method, $keyGoodFormat, 1, $ivGoodFormat);
if ($dataDecrypted === FALSE) {
throw new \Exception("Error during Decrypt ", 1);
}
$tmpfnameDeCrypted = tempnam($this->kernel->getCacheDir(), 'DECRYPT_DOC_TEMPLATE'); // plus ou moins
if (!$handle = fopen($tmpfnameDeCrypted, 'a')) {
echo "Cannot open file ($tmpfnameDeCrypted)";
exit;
}
if (fwrite($handle, $dataDecrypted) === FALSE) {
echo "Cannot write to file ($tmpfnameDeCrypted)";
exit;
}
dump("Success, wrote ($dataDecrypted) to file ($tmpfnameDeCrypted)");
fclose($handle);
$entity = $this->getDoctrine()->getRepository($entityClassName)->find($entityId);
@@ -72,10 +118,10 @@ class DocGeneratorTemplateController extends AbstractController
$context = new HouseholdMemberSelectionContext();
$datas = $context->getData($entity);
} else {
throw new Exception('Not implemented', 1);
throw new \Exception('Not implemented', 1);
}
$templateProcessor = new TemplateProcessor($tmpfname);
$templateProcessor = new TemplateProcessor($tmpfnameDeCrypted);
foreach ($datas['setValues'] as $setValuesConf) {
$templateProcessor->setValues($setValuesConf);
@@ -85,12 +131,10 @@ class DocGeneratorTemplateController extends AbstractController
$templateProcessor->cloneRowAndSetValues($cloneRowAndSetValues[0], $cloneRowAndSetValues[1]);
}
$tmpfname2 = tempnam(sys_get_temp_dir(), 'DOC_GENERATED');
$templateProcessor->saveAs($tmpfname2);
$tmpfnameGenerated = tempnam($this->kernel->getCacheDir(), 'DOC_GENERATED');
$templateProcessor->saveAs($tmpfnameGenerated);
unlink($tmpfname);
$fileContent = fopen($tmpfname2, 'rb'); // the generated file content
$fileContent = fopen($tmpfnameGenerated, 'rb'); // the generated file content
$genDocName = 'doc_' . sprintf('%010d', mt_rand()) . '.docx';
@@ -99,7 +143,8 @@ class DocGeneratorTemplateController extends AbstractController
$genDocName
);
unlink($tmpfname2);
unlink($tmpfnameDeCrypted);
unlink($tmpfnameGenerated);
$client = new Client();
@@ -140,7 +185,7 @@ class DocGeneratorTemplateController extends AbstractController
}
throw new Exception('Unable to generate document.');
}
}
/**
* @Route(