Completed
Push — master ( d47add...fca143 )
by Valentyn
02:52
created

MovieController::getMovies()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 6
ccs 0
cts 3
cp 0
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
crap 2
1
<?php
2
3
namespace App\Movies\Controller;
4
5
use App\Controller\BaseController;
6
use App\Movies\Entity\Movie;
7
use App\Movies\Repository\MovieRepository;
8
use App\Movies\Request\CreateMovieRequest;
9
use App\Movies\Request\SearchRequest;
10
use App\Movies\Service\MovieManageService;
11
use App\Movies\Service\SearchService;
12
use App\Pagination\PaginatedCollection;
13
use App\Users\Entity\User;
14
use App\Users\Entity\UserRoles;
15
use Symfony\Component\HttpFoundation\Request;
16
use Symfony\Component\Routing\Annotation\Route;
17
use Symfony\Component\Validator\Validator\ValidatorInterface;
18
19
/**
20
 * Class MovieController
21
 * @package App\Movies\Controller
22
 */
23
class MovieController extends BaseController
24
{
25
    /**
26
     * Get all movies
27
     *
28
     * @Route("/api/movies", methods={"GET"})
29
     *
30
     * @param Request $request
31
     * @param MovieRepository $movieRepository
32
     * @return \Symfony\Component\HttpFoundation\JsonResponse
33
     */
34 3
    public function getAll(Request $request, MovieRepository $movieRepository)
35
    {
36 3
        $user = $this->getUser();
37
38 3
        if ($user instanceof User) {
39
            $movies = $movieRepository->findAllWithIsUserWatchedFlag($user);
40
        } else {
41 3
            $movies = $movieRepository->findAllWithIsGuestWatchedFlag($this->getGuest());
42
        }
43
44 3
        $offset = (int)$request->get('offset', 0);
45 3
        $limit = $request->get('limit', null);
46
47 3
        $movies = new PaginatedCollection($movies, $offset, $limit);
48
49 3
        return $this->response($movies, 200, [], [
50 3
            'groups' => ['list'],
51
        ]);
52
    }
53
54
    /**
55
     * Get movie resource
56
     *
57
     * @Route("/api/movies/{id}", methods={"GET"})
58
     * @param Movie $movie
59
     * @return \Symfony\Component\HttpFoundation\JsonResponse
60
     */
61
    public function getMovies(Movie $movie)
62
    {
63
        return $this->response($movie, 200, [], [
64
            'groups' => ['view'],
65
        ]);
66
    }
67
68
    /**
69
     * Get movies by title
70
     *
71
     * @Route("/api/movies/search", methods={"POST"})
72
     * @param SearchRequest $request
73
     * @param SearchService $searchService
74
     * @param Request $currentRequest
75
     * @throws \Exception
76
     * @return \Symfony\Component\HttpFoundation\JsonResponse
77
     */
78 2
    public function getSearch(SearchRequest $request, SearchService $searchService, Request $currentRequest)
79
    {
80 2
        $offset = (int)$request->get('offset', 0);
81 2
        $limit = $request->get('limit', null);
82
83 2
        $query = $request->get('query');
84 2
        $movies = $searchService->findByQuery($query, $currentRequest->getLocale(), $offset, $limit);
85
86 2
        return $this->response($movies, 200, [], [
87 2
            'groups' => ['list']
88
        ]);
89
    }
90
91
    /**
92
     * Create new movie
93
     *
94
     * @Route("/api/movies", methods={"POST"})
95
     *
96
     * @param CreateMovieRequest $request
97
     * @param MovieManageService $service
98
     * @param ValidatorInterface $validator
99
     * @throws \Exception
100
     * @return \Symfony\Component\HttpFoundation\JsonResponse
101
     */
102 2
    public function postMovies(CreateMovieRequest $request, MovieManageService $service, ValidatorInterface $validator)
103
    {
104 2
        $this->denyAccessUnlessGranted(UserRoles::ROLE_ADMIN);
105
106 1
        $movie = $service->createMovieByRequest($request);
107 1
        $errors = $validator->validate($movie);
108
109 1
        if (count($errors)) {
110
            return $request->getErrorResponse($errors);
111
        }
112
113 1
        $entityManager = $this->getDoctrine()->getManager();
114 1
        $entityManager->persist($movie);
115 1
        $entityManager->flush();
116
117 1
        return $this->response($movie, 200, [], [
118 1
            'groups' => ['view'],
119
        ]);
120
    }
121
}