Completed
Push — master ( 852698...9531ed )
by Valery
04:57
created

PhotoController   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 81
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 37
dl 0
loc 81
rs 10
c 1
b 0
f 0
wmc 5

3 Methods

Rating   Name   Duplication   Size   Complexity  
A upload() 0 29 2
A delete() 0 22 2
A edit() 0 11 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Controller\Admin;
6
7
use App\Entity\Photo;
8
use App\Entity\Property;
9
use App\Service\FileUploader;
10
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
11
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
12
use Symfony\Component\HttpFoundation\File\UploadedFile;
13
use Symfony\Component\HttpFoundation\JsonResponse;
14
use Symfony\Component\HttpFoundation\Request;
15
use Symfony\Component\HttpFoundation\Response;
16
use Symfony\Component\Routing\Annotation\Route;
17
use Symfony\Component\Validator\ConstraintViolation;
18
19
final class PhotoController extends AbstractController
20
{
21
    /**
22
     * @Route("/admin/photo/{id<\d+>}/upload", name="admin_photo_upload", methods={"POST"})
23
     */
24
    public function upload(Request $request, FileUploader $fileUploader): Response
25
    {
26
        /** @var UploadedFile $uploadedFile */
27
        $uploadedFile = $request->files->get('file');
28
        $violations = $fileUploader->validate($uploadedFile);
29
30
        if ($violations->count() > 0) {
31
            /** @var ConstraintViolation $violation */
32
            $violation = $violations[0];
33
34
            return new JsonResponse(['status' => 'error', 'message' => $violation->getMessage()]);
35
        }
36
37
        $fileName = $fileUploader->upload($uploadedFile);
38
39
        $property = $this->getDoctrine()
40
                ->getRepository(Property::class)
41
                ->find($request->attributes->get('id'));
42
43
        $photo = new Photo();
44
        $photo->setProperty($property)
45
                ->setPriority(0)
46
                ->setPhoto($fileName);
47
48
        $em = $this->getDoctrine()->getManager();
49
        $em->persist($photo);
50
        $em->flush();
51
52
        return new JsonResponse(['status' => 'ok']);
53
    }
54
55
    /**
56
     * @Route("/admin/photo/{id<\d+>}/edit", name="admin_photo_edit")
57
     */
58
    public function edit(Request $request): Response
59
    {
60
        $property = $this->getDoctrine()
61
            ->getRepository(Property::class)
62
            ->find($request->attributes->get('id'));
63
64
        $photos = $property->getPhotos();
65
66
        return $this->render('admin/photo/edit.html.twig', [
67
            'photos' => $photos,
68
            'property_id' => $property->getId(),
69
        ]);
70
    }
71
72
    /**
73
     * Deletes a Photo entity.
74
     *
75
     * @Route("/property/{property_id<\d+>}/photo/{id<\d+>}/delete", methods={"POST"}, name="admin_photo_delete")
76
     * @IsGranted("ROLE_ADMIN")
77
     */
78
    public function delete(Request $request, Photo $photo, FileUploader $fileUploader): Response
79
    {
80
        if (!$this->isCsrfTokenValid('delete', $request->request->get('token'))) {
81
            return $this->redirectToRoute(
82
                'admin_photo_edit',
83
                ['id' => $request->attributes->get('property_id')]
84
            );
85
        }
86
87
        // Delete from db
88
        $em = $this->getDoctrine()->getManager();
89
        $em->remove($photo);
90
        $em->flush();
91
92
        // Delete file from folder
93
        $fileUploader->remove($photo->getPhoto());
94
95
        $this->addFlash('success', 'message.deleted');
96
97
        return $this->redirectToRoute(
98
            'admin_photo_edit',
99
            ['id' => $request->attributes->get('property_id')]
100
        );
101
    }
102
}
103