1 | <?php |
||
23 | class WatchedMovieService |
||
24 | { |
||
25 | private $em; |
||
26 | /** |
||
27 | * @var MovieRepository |
||
28 | */ |
||
29 | private $repository; |
||
30 | |||
31 | private $searchService; |
||
32 | |||
33 | private $producer; |
||
34 | |||
35 | 9 | public function __construct(EntityManagerInterface $entityManager, SearchService $searchService, ProducerInterface $producer) |
|
42 | |||
43 | /** |
||
44 | * @param User $user |
||
45 | * @param WatchedMovieDTO $watchedMovieDTO |
||
46 | * @param string $locale |
||
47 | * |
||
48 | * @throws \Exception |
||
49 | * |
||
50 | * @return bool |
||
51 | */ |
||
52 | 6 | public function addUserWatchedMovie(User $user, WatchedMovieDTO $watchedMovieDTO, string $locale): bool |
|
85 | |||
86 | 2 | public function updateUserWatchedMovie(WatchedMovie $watchedMovie, WatchedMovieDTO $watchedMovieDTO) |
|
91 | |||
92 | /** |
||
93 | * @param GuestSession $guestSession |
||
94 | * @param WatchedMovieDTO $watchedMovieDTO |
||
95 | * @param string $locale |
||
96 | * |
||
97 | * @throws \Exception |
||
98 | * |
||
99 | * @return bool |
||
100 | */ |
||
101 | 3 | public function addGuestWatchedMovie(GuestSession $guestSession, WatchedMovieDTO $watchedMovieDTO, string $locale): bool |
|
102 | { |
||
103 | 3 | $movie = $this->repository->findOneByIdOrTmdbId($watchedMovieDTO->getMovieId(), $watchedMovieDTO->getTmdbId()); |
|
104 | |||
105 | 3 | if ($movie === null) { |
|
106 | // Lets try to find it in TMDB library |
||
107 | 1 | $movie = $this->searchService->findByTmdbId($watchedMovieDTO->getTmdbId(), $locale); |
|
108 | } |
||
109 | |||
110 | 2 | if ($movie === null) { |
|
111 | return false; |
||
112 | } |
||
113 | |||
114 | 2 | $newWatchedMovie = new GuestWatchedMovie($guestSession, $movie, $watchedMovieDTO->getVote(), $watchedMovieDTO->getWatchedAt()); |
|
115 | |||
116 | 2 | if ($movie->getId() === null) { |
|
117 | $this->saveWatchedMovies([$newWatchedMovie]); |
||
118 | |||
119 | return true; |
||
120 | } |
||
121 | |||
122 | try { |
||
123 | 2 | $this->em->persist($newWatchedMovie); |
|
124 | 2 | $this->em->flush(); |
|
125 | 2 | $this->onMovieAdded($newWatchedMovie); |
|
126 | } catch (UniqueConstraintViolationException $exception) { |
||
127 | // You can throw new BadRequestHttpException('This movie already in your library of watched movies'); |
||
128 | // But I think its nice to return 202 like operation was successful |
||
129 | return true; |
||
130 | } |
||
131 | |||
132 | 2 | return true; |
|
133 | } |
||
134 | |||
135 | /** |
||
136 | * @param GuestSession $guestSession |
||
137 | * @param User $user |
||
138 | * |
||
139 | * @throws \Exception |
||
140 | */ |
||
141 | public function mergeWatchedMovies(GuestSession $guestSession, User $user): void |
||
163 | |||
164 | /** |
||
165 | * @param array|UserWatchedMovie[]|GuestWatchedMovie[] $watchedMovies |
||
166 | */ |
||
167 | private function saveWatchedMovies(array $watchedMovies): void |
||
168 | { |
||
169 | $watchedMoviesSerialized = serialize($watchedMovies); |
||
170 | $this->producer->sendEvent(WatchedMovieProcessor::ADD_WATCHED_MOVIE_TMDB, $watchedMoviesSerialized); |
||
171 | } |
||
172 | |||
173 | 8 | private function onMovieAdded(WatchedMovie $watchedMovie): void |
|
180 | } |
||
181 |