<?php
namespace App\Controller;
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\Categorie;
use App\Entity\RefRole;
use App\Entity\Media;
use App\Entity\Article;
use Doctrine\Persistence\ManagerRegistry;
class CategorieController extends AbstractController
{
private $doctrine;
public function __construct(ManagerRegistry $doctrine)
{
$this->doctrine = $doctrine;
}
#[Route(path: '/api/createCategorie', name: 'categorie_new')]
public function new(Request $request)
{
$role = $this->getUser()->getUtilisateur()->getIdRole();
if (RefRole::ROLE_DS_ADMIN !== $role) {
return new JsonResponse(null, JsonResponse::HTTP_BAD_REQUEST);
}
$data = json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR);
$request->request->replace(is_array($data) ? $data : []);
try {
$Categorie = new Categorie();
$em = $this->doctrine->getManager();
$params = $request->request->all();
$nomCategorie = $params['nomCategorie'] ?? "Categorie par défaut";
$Categorie->setNomCategorie($nomCategorie);
$em->persist($Categorie);
if (isset($params['idCategorieImage']) && $params['idCategorieImage'] != '') {
$this->saveMedias($Categorie, $params['idCategorieImage']);
}
$em->flush();
$messageRetour = "Categorie créée";
$data = ['success' => true, 'data' => $messageRetour];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
/**
* Displays a form to edit an existing categorie entity
*/
#[Route(path: '/api/modifyCategorie/{id}', name: 'categorie_edit', methods: ['GET','POST'])]
public function edit(Request $request, $id)
{
$role = $this->getUser()->getUtilisateur()->getIdRole();
if (RefRole::ROLE_DS_ADMIN !== $role) {
return new JsonResponse(null, JsonResponse::HTTP_BAD_REQUEST);
}
$data = json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR);
$em = $this->doctrine->getManager();
$categ = $em->getRepository(Categorie::class)->findOneBy(['id' => $id]);
$categ->setNomCategorie($data['nomCategorie']);
if (isset($data['idCategorieImage']) && $data['idCategorieImage'] != '') {
$this->saveMedias($categ, $data['idCategorieImage']);
}
try {
$em->persist($categ);
$em->flush();
$data = ['success' => true, 'data' => 'Action modifiée'];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
#[Route(path: '/api/getCategorie/{id}', name: 'categorie_show')]
public function show($id)
{
$categApercu = [];
$em = $this->doctrine->getManager();
$categ = $em->getRepository(Categorie::class)->findOneBy(['id' => $id]);
try {
$categApercu[] = ['id' => $categ->getId(), 'nom' => $categ->getNomCategorie(), 'dataMedias' => $this->explodeCategMedias($categ->getMedias())];
$data = ['success' => true, 'data' => $categApercu];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
/**
* Deletes a Article entity.
*/
#[Route(path: '/api/deleteCategorie/{id}', name: 'categorie_delete')]
public function delete($id)
{
$role = $this->getUser()->getUtilisateur()->getIdRole();
if (RefRole::ROLE_DS_ADMIN !== $role) {
return new JsonResponse(null, JsonResponse::HTTP_BAD_REQUEST);
}
$em = $this->doctrine->getManager();
$categ = $em->getRepository(Categorie::class)->findOneBy(['id' => $id]);
try {
if (true === $this->removesCategory($categ)) {
$this->removesMedias($categ->getMedias());
$em->flush();
$data = ['success' => true, 'data' => 'Categorie supprimée'];
} else {
$data = ['success' => false, 'data' => ' Vous ne pouvez supprimer cette catégorie car des actualités lui sont rattachées'];
}
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
/**
* Lists all categories entities.
*/
#[Route(path: '/api/getCategories', name: 'categories_list', methods: ['GET'])]
public function getCategories()
{
$em = $this->doctrine->getManager();
$result = [];
try {
$repo = $this->doctrine->getRepository(Categorie::class)->findAll();
$result = [];
foreach ($repo as $categ) {
$explodeCategMedias = $this->explodeCategMedias($categ->getMedias());
$result[] = [
'id' => $categ->getId(),
'nom' => $categ->getNomCategorie(),
'dataMedias' => [end($explodeCategMedias)],
];
}
$data = ['success' => true, 'data' => $result];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
private function explodeCategMedias($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($categ, $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->setCategorie($categ);
$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();
}
}
}
}
private function removesCategory($idCategory)
{
$em = $this->doctrine->getManager();
$articles = $em->getRepository(Article::class)->findBy(["idCategorie" => $idCategory]);
if (empty($articles)) {
$em->remove($idCategory);
$em->flush();
return true;
} else {
return false;
}
}
}