*/ class Streams extends Controller { /** * @var StreamsRepository */ private $repository; /** * @var EndpointRepository */ private $endpointRepository; /** * Streams constructor. * @param StreamsRepository $repository * @param EndpointRepository $endpointRepository * @author Soner Sayakci */ public function __construct(StreamsRepository $repository, EndpointRepository $endpointRepository) { $this->repository = $repository; $this->endpointRepository = $endpointRepository; } /** * @Route(path="/list") * @author Soner Sayakci */ public function streams(): Response { /** @var User $user */ $user = $this->getUser(); return new JsonResponse($this->repository->getStreams($user)); } /** * @Route(path="/one") * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response * @author Soner Sayakci */ public function one(Request $request): Response { $stream = $this->repository->find($request->query->get('id')); if ($stream === null || $stream->getUserId() !== $this->getUser()->getId()) { return new Response('Access denied', 401); } $host = $request->getHost(); $data = $stream->jsonSerialize(); $data['streamUrl'] = sprintf('rtmp://%s/%s', $host, $stream->getUser()->getUsername() . '/' . $stream->getName()); return new JsonResponse($data); } /** * @Route(path="/update") * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response * @throws \Doctrine\ORM\ORMException * @throws \Doctrine\ORM\OptimisticLockException * @author Soner Sayakci */ public function update(Request $request): Response { $requestBody = $request->request->all(); $stream = !empty($requestBody['id']) ? $this->repository->find($requestBody['id']) : new \App\Entity\Streams(); if ($stream->getUserId() && $stream->getUserId() !== $this->getUser()->getId()) { return new Response('Access denied', 401); } if (empty($requestBody['name']) || !$this->isValidString($requestBody['name'])) { return new JsonResponse(['message' => 'Name is empty or contains illegal strings'], 500); } $stream->setUser($this->getUser()); $stream->setName($requestBody['name']); $stream->setActive($requestBody['active']); $manager = $this->get('doctrine.orm.entity_manager'); try { $manager->persist($stream); $manager->flush(); } catch (UniqueConstraintViolationException $e) { return new JsonResponse(['message' => sprintf('"%s" is already taken', $stream->getName())], 500); } return new JsonResponse($stream); } /** * @Route(path="/regenerate") * @author Soner Sayakci * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse * @throws \Doctrine\ORM\ORMException * @throws \Doctrine\ORM\OptimisticLockException * @throws \Doctrine\ORM\TransactionRequiredException */ public function regenerate(Request $request): Response { $manager = $this->get('doctrine.orm.entity_manager'); $streams = $manager->find(\App\Entity\Streams::class, $request->request->get('id')); if ($streams && $streams->getUserId() === $this->getUser()->getId()) { $streams->setStreamKey(uniqid('', true)); $manager->persist($streams); $manager->flush(); } return new JsonResponse(); } /** * @Route(path="/delete") * @author Soner Sayakci * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse * @throws \Doctrine\ORM\ORMException * @throws \Doctrine\ORM\OptimisticLockException * @throws \Doctrine\ORM\TransactionRequiredException */ public function delete(Request $request): Response { $manager = $this->get('doctrine.orm.entity_manager'); $streams = $manager->find(\App\Entity\Streams::class, $request->request->get('id')); if ($streams && $streams->getUserId() === $this->getUser()->getId()) { $manager->remove($streams); $manager->flush(); } return new JsonResponse(); } /** * @Route(path="/services") * @param ServiceManager $manager * @return JsonResponse * @author Soner Sayakci */ public function services(ServiceManager $manager): JsonResponse { return new JsonResponse($manager->getTemplateData()); } /** * @Route(path="/{id}/stats") * @param int $id * @param Stats $nginxStats * @return JsonResponse * @author Soner Sayakci */ public function stats(Stats $nginxStats, int $id): JsonResponse { $stream = $this->repository->find($id); if ($stream === null || $stream->getUserId() !== $this->getUser()->getId()) { return new JsonResponse([]); } return new JsonResponse($nginxStats->getStatsForStream($stream)); } /** * @Route(path="/{id}/endpoints/") * @author Soner Sayakci * @param int $id * @return JsonResponse */ public function listEndpoints(int $id): JsonResponse { return new JsonResponse($this->endpointRepository->getEndpoints($this->getUser(), $id)); } /** * @Route(path="/endpoint/{id}") * @author Soner Sayakci * @param int $id * @return JsonResponse */ public function endpoint(int $id): JsonResponse { return new JsonResponse($this->endpointRepository->find($id)); } /** * @Route(path="/{id}/endpoints/update") * @param Request $request * @param int $id * @return Response * @throws \Doctrine\ORM\ORMException * @throws \Doctrine\ORM\OptimisticLockException * @author Soner Sayakci */ public function updateEndpoint(Request $request, int $id): Response { $requestBody = $request->request->all(); $stream = $this->repository->find($id); if ($stream === null || $stream->getUserId() !== $this->getUser()->getId()) { return new JsonResponse([]); } if (empty($requestBody['name'])) { return new JsonResponse(['message' => 'Name is empty'], 500); } if (empty($requestBody['server']) || !$this->isValidString($requestBody['server'])) { return new JsonResponse(['message' => 'Server is empty or contains illegal strings'], 500); } if (!empty($requestBody['streamKey']) && !$this->isValidString($requestBody['streamKey'])) { return new JsonResponse(['message' => 'Stream-Key contains illegal strings'], 500); } $endpoint = !empty($requestBody['id']) ? $this->endpointRepository->find($requestBody['id']) : new Endpoint(); $endpoint->setName($requestBody['name']); $endpoint->setActive($requestBody['active']); $endpoint->setType($requestBody['type']); $endpoint->setServer($requestBody['server']); $endpoint->setStreamKey($requestBody['streamKey']); $endpoint->setChannelName($requestBody['channelName']); $endpoint->setStream($stream); $manager = $this->get('doctrine.orm.entity_manager'); $manager->persist($endpoint); $manager->flush(); return new JsonResponse($endpoint); } /** * @Route(path="/toggleEndpoint") * @param Request $request * @return JsonResponse * @throws \Doctrine\ORM\ORMException * @throws \Doctrine\ORM\OptimisticLockException * @author Soner Sayakci */ public function toggleEndpoint(Request $request): JsonResponse { $id = $request->request->get('id'); $endpoint = $this->endpointRepository->find($id); if ($endpoint === null || $endpoint->getStream()->getUserId() !== $this->getUser()->getId()) { return new JsonResponse([]); } $endpoint->setActive(!$endpoint->isActive()); $manager = $this->get('doctrine.orm.entity_manager'); $manager->persist($endpoint); $manager->flush(); return new JsonResponse($endpoint); } /** * @Route(path="/deleteEndpoint") * @author Soner Sayakci * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse * @throws \Doctrine\ORM\ORMException * @throws \Doctrine\ORM\OptimisticLockException * @throws \Doctrine\ORM\TransactionRequiredException */ public function deleteEndpoint(Request $request): Response { $manager = $this->get('doctrine.orm.entity_manager'); $endpoint = $manager->find(Endpoint::class, $request->request->get('id')); if ($endpoint && $endpoint->getStream()->getUserId() === $this->getUser()->getId()) { $manager->remove($endpoint); $manager->flush(); } return new JsonResponse(); } /** * @param null|string $string * @return false|int * @author Soner Sayakci */ private function isValidString(?string $string) { return preg_match('/^[a-z|A-Z|a-z|A-Z|0-9|.|\-|_|\{|\}|\:|\/]+$/', $string); } }