Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
97.44% covered (success)
97.44%
38 / 39
75.00% covered (warning)
75.00%
3 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
MediaController
97.44% covered (success)
97.44%
38 / 39
75.00% covered (warning)
75.00%
3 / 4
11
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 index
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
2
 add
93.33% covered (success)
93.33%
14 / 15
0.00% covered (danger)
0.00%
0 / 1
5.01
 delete
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3namespace App\Controller\Admin;
4
5use App\Entity\Media;
6use App\Entity\User;
7use App\Form\MediaType;
8use App\Repository\MediaRepository;
9use App\Service\MediaStorage;
10use Doctrine\ORM\EntityManagerInterface;
11use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
12use Symfony\Component\HttpFoundation\Request;
13use Symfony\Component\HttpFoundation\Response;
14use Symfony\Component\Routing\Attribute\Route;
15
16#[Route("/admin/media")]
17class MediaController extends AbstractController
18{
19    public function __construct(
20        private MediaRepository $mediaRepository,
21        private EntityManagerInterface $entityManager,
22        private MediaStorage $mediaStorage,
23    ) {}
24
25    #[Route("", name: "admin_media_index")]
26    public function index(Request $request): Response
27    {
28        $page = $request->query->getInt('page', 1);
29
30        $criteria = [];
31
32        if (!$this->isGranted('ROLE_SUPER_ADMIN')) {
33            $criteria['user'] = $this->getUser();
34        }
35
36        $medias = $this->mediaRepository->findBy(
37            $criteria,
38            ['id' => 'ASC'],
39            25,
40            25 * ($page - 1)
41        );
42        $total = $this->mediaRepository->count($criteria);
43
44        return $this->render('admin/media/index.html.twig', [
45            'medias' => $medias,
46            'total' => $total,
47            'page' => $page,
48        ]);
49    }
50
51    #[Route("/add", name: "admin_media_add")]
52    public function add(Request $request): Response
53    {
54        $media = new Media();
55        $form = $this->createForm(MediaType::class, $media, ['is_super_admin' => $this->isGranted('ROLE_SUPER_ADMIN')]);
56        $form->handleRequest($request);
57
58        if ($form->isSubmitted() && $form->isValid()) {
59            if (!$this->isGranted('ROLE_SUPER_ADMIN')) {
60                $user = $this->getUser();
61                if (!$user instanceof User) {
62                    throw $this->createAccessDeniedException();
63                }
64                $media->setUser($user);
65            }
66            $media->setPath('uploads/' . md5(uniqid()) . '.' . $media->getFile()->guessExtension());
67            $media->getFile()->move($this->getParameter('kernel.project_dir') . '/public/uploads/', $media->getPath());
68            $this->entityManager->persist($media);
69            $this->entityManager->flush();
70
71            return $this->redirectToRoute('admin_media_index');
72        }
73
74        return $this->render('admin/media/add.html.twig', ['form' => $form->createView()]);
75    }
76
77    #[Route("/delete/{id}", name: "admin_media_delete")]
78    public function delete(int $id): Response
79    {
80        $media = $this->mediaRepository->find($id);
81        if (!$this->isGranted('ROLE_SUPER_ADMIN') && $media->getUser() !== $this->getUser()) {
82            throw $this->createAccessDeniedException();
83        }
84        $this->entityManager->remove($media);
85        $this->entityManager->flush();
86        $this->mediaStorage->delete($media->getPath());
87
88        return $this->redirectToRoute('admin_media_index');
89    }
90}