Passed
Push — master ( 60c6b0...f5065c )
by Petr
03:15
created

EventService::editEventByForm()   B

Complexity

Conditions 3
Paths 4

Size

Total Lines 27
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 3.072

Importance

Changes 0
Metric Value
dl 0
loc 27
ccs 12
cts 15
cp 0.8
rs 8.8571
c 0
b 0
f 0
cc 3
eloc 17
nc 4
nop 2
crap 3.072
1
<?php
2
3
namespace AppBundle\Service;
4
5
use AppBundle\Entity\DTO\CreateEventDTO;
6
use AppBundle\Entity\Event;
7
use AppBundle\Entity\Repository\EventRepository;
8
use AppBundle\Entity\User;
9
use AppBundle\Exception\UnsupportedTypeException;
10
use AppBundle\Response\ApiError;
11
use AppBundle\Response\CreatedApiResponse;
12
use AppBundle\Response\EmptyApiResponse;
13
use AppBundle\Response\Infrastructure\AbstractApiResponse;
14
use AppBundle\Response\LocationApiResponse;
15
use AppBundle\Service\File\FileService;
16
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
17
use Symfony\Component\Form\FormInterface;
18
use Symfony\Component\HttpFoundation\Response;
19
use Symfony\Component\Routing\Router;
20
21
/**
22
 * @author Vehsamrak
23
 */
24
class EventService
25
{
26
27
    /** @var EventRepository */
28
    private $eventRepository;
29
30
    /** @var Router */
31
    private $router;
32
33
    /** @var FileService */
34
    private $fileService;
35
36 6
    public function __construct(
37
        EventRepository $eventRepository,
38
        Router $router,
39
        FileService $fileService
40
    ) {
41 6
        $this->eventRepository = $eventRepository;
42 6
        $this->router = $router;
43 6
        $this->fileService = $fileService;
44 6
    }
45
46 1
    public function createEventByForm(FormInterface $form, User $creator): AbstractApiResponse
47
    {
48
        /** @var CreateEventDTO $createEventDTO */
49 1
        $createEventDTO = $form->getData();
50
51 1
        $newEvent = new Event($createEventDTO->name, $creator, $createEventDTO->date, $createEventDTO->description);
52
53 1
        $this->eventRepository->persist($newEvent);
54
55
        try {
56 1
            $this->eventRepository->flush();
57 1
            $response = new CreatedApiResponse($this->createLocationById($newEvent->getId()));
58
        } catch (UniqueConstraintViolationException $exception) {
59
            $response = new ApiError('Event must have unique name and date.', Response::HTTP_BAD_REQUEST);
60
        }
61
62 1
        return $response;
63
    }
64
65 1
    public function editEventByForm(FormInterface $form, string $eventId): AbstractApiResponse
66
    {
67
        /** @var Event $event */
68 1
        $event = $this->eventRepository->findOneById($eventId);
69
70 1
        if (!$event) {
71
            $response = $this->createEventNotFoundErrorResult($eventId);
72
        } else {
73 1
            $eventName = $form->get('name')->getData();
74
            /** @var \DateTime $eventDate */
75 1
            $eventDate = $form->get('date')->getData();
76 1
            $eventDescription = $form->get('description')->getData();
77
78 1
            $event->setName($eventName);
79 1
            $event->setDate($eventDate);
80 1
            $event->setDescription($eventDescription);
81
82
            try {
83 1
                $this->eventRepository->flush();
84 1
                $response = new EmptyApiResponse(Response::HTTP_NO_CONTENT);
85
            } catch (UniqueConstraintViolationException $exception) {
86
                $response = new ApiError('Event must have unique name and date.', Response::HTTP_BAD_REQUEST);
87
            }
88
        }
89
90 1
        return $response;
91
    }
92
93 3
    public function addImageToEvent(string $eventId, array $imageData = null): AbstractApiResponse
94
    {
95 3
        $event = $this->eventRepository->findOneById($eventId);
96
97 3
        if ($event) {
98 2
            $imageName = $imageData['name'] ?: null;
99 2
            $imageContent = $imageData['content'] ?? null;
100
101 2
            if (!$imageData || !$imageName || !$imageContent) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $imageData of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
102 1
                $response = new ApiError(
103 1
                    'Parameters are mandatory: image[name] and image[content].',
104 1
                    Response::HTTP_BAD_REQUEST
105
                );
106
            } else {
107
                try {
108 1
                    $imageExtension = $this->fileService->getExtensionFromBase64File($imageContent);
109 1
                    $imageName = sprintf('%s.%s', $imageName, $imageExtension);
110 1
                    $image = $this->fileService->createBase64Image($imageName, $imageContent, $event);
111
112 1
                    $imageLocation = $this->router->generate(
113 1
                        'event_image_view',
114
                        [
115 1
                            'eventId'   => $eventId,
116 1
                            'imageName' => $image->getName(),
117
                        ]
118
                    );
119
120 1
                    $response = new LocationApiResponse(Response::HTTP_OK, $imageLocation);
121
                } catch (UnsupportedTypeException $exception) {
122
                    $response = new ApiError(
123
                        'Only images of types png, gif and jpeg are supported.',
124 2
                        Response::HTTP_BAD_REQUEST
125
                    );
126
                }
127
            }
128
        } else {
129 1
            $response = $this->createEventNotFoundErrorResult($eventId);
130
        }
131
132 3
        return $response;
133
    }
134
135 2
    public function createEventNotFoundErrorResult(string $eventId): ApiError
136
    {
137 2
        return new ApiError(
138 2
            sprintf('Event with id "%s" was not found.', $eventId),
139 2
            Response::HTTP_NOT_FOUND
140
        );
141
    }
142
143 1
    private function createLocationById(string $eventId): string
144
    {
145 1
        return $this->router->generate('event_view', ['eventId' => $eventId]);
146
    }
147
}
148