<?php
namespace App\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Document;
use App\Entity\RefRole;
use App\Entity\Media;
use App\Entity\Type;
use App\Entity\Utilisateur;
use App\Entity\UtilisateurInformation;
use Doctrine\Persistence\ManagerRegistry;
class DocumentController extends AbstractController
{
private $doctrine;
public function __construct(ManagerRegistry $doctrine)
{
$this->doctrine = $doctrine;
}
#[Route(path: '/api/newDocument/{id_profil}', name: 'ctsweb_document')]
public function New(Request $request, $id_profil)
{
$data = json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR);
$em = $this->doctrine->getManager();
$request->request->replace(is_array($data) ? $data : []);
$profil = $em->getRepository(Utilisateur::class)->findOneBy(['idUtilisateur' => $id_profil]);
try {
$doc = new Document();
$em = $this->doctrine->getManager();
$idRole = $this->getUser()->getUtilisateur()->getIdRole();
$params = $request->request->all();
$doc->setTitre($params['titre']);
$doc->setType($params['type']);
$doc->setCts($params['cts']);
$doc->setDtn($params['dtn']);
$doc->setSh($params['sh']);
$doc->setDs($params['ds']);
$doc->setUtilisateur($profil);
$doc->setAuteur($this->getUser()->getUtilisateur());
$doc->setCreated(new \DateTime());
$doc->setUpdated(new \DateTime());
$em->persist($doc);
if (isset($params['formData']) && $params['formData'] != '') {
$this->saveMedias($doc, $params['formData']);
}
$em->flush();
$messageRetour = "Document créé";
$data = ['success' => true, 'data' => $messageRetour];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
#[Route(path: '/api/editDocument/{id}}', name: 'ctsweb_document_edit')]
public function edit(Request $request, $id)
{
$data = json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR);
$request->request->replace(is_array($data) ? $data : []);
try {
$em = $this->doctrine->getManager();
$doc = $em->getRepository(Document::class)->findOneBy(['id' => $id]);
$idRole = $this->getUser()->getUtilisateur()->getIdRole();
$params = $request->request->all();
$doc->setTitre($params['titre']);
$doc->setType($params['type']);
$doc->setCts($params['cts']);
$doc->setDtn($params['dtn']);
$doc->setSh($params['sh']);
$doc->setDs($params['ds']);
$doc->setUtilisateur($this->getUser()->getUtilisateur());
$doc->setAuteur($this->getUser()->getUtilisateur());
$doc->setUpdated(new \DateTime());
$em->persist($doc);
if (isset($params['formData']) && $params['formData'] != '') {
$this->saveMedias($doc, $params['formData']);
}
$em->flush();
$messageRetour = "Document Modifé";
$data = ['success' => true, 'data' => $messageRetour];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
/**
* Deletes a Article entity.
*/
#[Route(path: '/api/deleteDocument/{id}', name: 'ctsweb_document_delete')]
public function delete($id)
{
$em = $this->doctrine->getManager();
$doc = $em->getRepository(Document::class)->findOneBy(['id' => $id]);
try {
$em->remove($doc);
$this->removesMedias($doc->getMedias());
$em->flush();
$data = ['success' => true, 'data' => 'Document supprimé'];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
#[Route(path: '/api/loadDocumentProfil/{id}', name: 'ctsweb_document_load')]
public function loadDocument($id)
{
$em = $this->doctrine->getManager();
$user = $this->getUser();
$ui = $this->getUser();
$posteu = $ui->getIdPoste() ? $ui->getIdPoste()->getIdPoste() : null;
$result = [];
$R_User = $user->getUtilisateur()->getIdRole();
try {
if ($R_User == RefRole::ROLE_DS_ADMIN) {
$repo = $this->doctrine->getRepository(Document::class)->findBy(['utilisateur' => $id]);
} else {
$repo = $this->doctrine->getRepository(Document::class)->getListeArticlesdoc($user->getUtilisateur(), $posteu, $ui, $id);
}
$result = [];
foreach ($repo as $doc) {
if ($R_User != RefRole::ROLE_DS_ADMIN) {
$docs = $this->doctrine->getRepository(Document::class)->findOneBy(['utilisateur' => $doc['id_utilisateur'], 'id' => $doc['id']]);
$doc = $docs;
}
if (null != $doc) {
$utilisateurInformation = $em->getRepository(UtilisateurInformation::class)->findOneBy(['idUtilisateur' => $doc->getUtilisateur()->getIdUtilisateur()]);
if ($doc->getAuteur() != null) {
$utilisateurInformation1 = $em->getRepository(UtilisateurInformation::class)->findOneBy(['idUtilisateur' => $doc->getAuteur()->getIdUtilisateur()]);
$auteur = [
'id' => $doc->getAuteur()->getIdUtilisateur(),
'nom' => $utilisateurInformation1->getNom(),
'prenom' => $utilisateurInformation1->getPrenom(),
'role' => $utilisateurInformation1->getUtilisateur()->getIdRole(),
];
} else {
$auteur = [
'id' => null,
'nom' => null,
'prenom' => null,
'role' => null,
];
}
$typ = $this->doctrine->getRepository(Type::class)->findOneBy(['id' => $doc->getType()]);
if ($doc->getCreated() === null) {
$doc->setCreated(new \DateTime());
}
$result[] = [
'id' => $doc->getId(),
'titre' => $doc->getTitre(),
'type' => ["id" => ($typ != null) ? $typ->getId() : null, "nomType" => ($typ != null) ? $typ->getNomType() : null],
'created' => $doc->getCreated(),
'updated' => $doc->getUpdated(),
'cts' => $doc->getCts(),
'dtn' => $doc->getDtn(),
'sh' => $doc->getSh(),
'ds' => $doc->getDs(),
'utilisateur' => [
'id' => $doc->getUtilisateur()->getIdUtilisateur(),
'nom' => $utilisateurInformation->getNom(),
'prenom' => $utilisateurInformation->getPrenom(),
],
'auteur' => $auteur,
'dataMedias' => $this->explodeMedias($doc->getMedias()),
];
}
}
$data = ['success' => true, 'data' => $result];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
private function explodeMedias($medias)
{
$dir = $this->getParameter('dir_file_media');
$dataMedias = [];
if (!empty($medias)) {
foreach ($medias as $media) {
$validMedia = $this->isValidateMedia($media);
if ($validMedia) {
$dataMedias[] = ['urlFile' => $dir . $media->getPath(), 'idUpload' => $media->getId(), 'filename' => $media->getName()];
}
}
}
return $dataMedias;
}
private function isValidateMedia($media)
{
$validExtension = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'jpg', 'jpeg', 'png'];
$pathinfo = $media ? pathinfo((string) $media->getPath()) : null;
$extension = !is_null($pathinfo) ? $pathinfo['extension'] : '';
$validMedia = in_array($extension, $validExtension);
return $validMedia;
}
private function saveMedias($doc, $mediaIds)
{
$em = $this->doctrine->getManager();
$medias = json_decode((string) $mediaIds, null, 512, JSON_THROW_ON_ERROR);
if (!empty($medias)) {
foreach ($medias as $idMedia) {
$media = $em->getRepository(Media::class)->findOneById($idMedia);
if ($media instanceof Media) {
$media->setDocument($doc);
$media->setCreated(new \DateTime());
$media->setUpdated(new \DateTime());
$em->flush();
}
}
}
}
private function removesMedias($mediaIds)
{
$em = $this->doctrine->getManager();
$medias = $mediaIds->toarray();
if (!empty($medias)) {
foreach ($medias as $media) {
if ($media instanceof Media) {
$em->remove($media);
$em->flush();
}
}
}
}
}