<?php
namespace App\Controller\Api;
use App\DTO\Transformer\Media\MediaAllAttributeDtoTransfomer;
use App\Entity\Media\Media;
use App\Entity\Media\MediaAccessByConsultation;
use App\Entity\Media\MediaAccessByLink;
use App\Entity\Media\MediaAccessByQr;
use App\Entity\Media\MediaAccessBySearch;
use App\Entity\Media\MediaFollowers;
use App\Entity\Media\MediaTeam;
use App\Entity\Posts;
use App\Entity\User;
use App\Form\MediaType;
use App\Service\Api;
use App\Service\Notification\NotificationPublisherService;
use App\Utils\InqResult;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Config\Definition\Exception\Exception;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
/**
* @Route("/api/media")
*/
class MediaController extends AbstractController
{
/**
* @var Security
*/
private $security;
private $api;
private $doctrine;
private $mediaAllAttributeDtoTransfomer;
private $notificationPublisherService;
public function __construct(
Security $security,
Api $api,
ManagerRegistry $doctrine,
MediaAllAttributeDtoTransfomer $mediaAllAttributeDtoTransfomer,
NotificationPublisherService $notificationPublisherService
)
{
$this->security = $security;
$this->api = $api;
$this->doctrine = $doctrine;
$this->mediaAllAttributeDtoTransfomer = $mediaAllAttributeDtoTransfomer;
$this->notificationPublisherService = $notificationPublisherService;
}
/**
* Finds and displays a Post entity.
*
* @Route("/{id<\d+>}", methods="GET", name="api_media_show")
*/
public function show(Media $media): Response
{
$user = $this->security->getUser();
$em = $this->doctrine->getManager();
$mediaFolloawed = $em
->getRepository('App\Entity\Media\MediaFollowers')
->findOneBy(["user" => $user->getId(), "media" => $media->getId()])
;
if ($mediaFolloawed) {
$media->isFollowed = true;
} else {
$media->isFollowed = false;
}
$nbrPosts = $em
->getRepository('App\Entity\Post\Post')->createQueryBuilder('p')
->select('count(p.id)')
->where("p.media = :media and p.isDeleted = false")
->setParameter("media", $media->getId())
->getQuery()->getSingleScalarResult();
$media->nbrPosts = $nbrPosts;
$dto = $this->mediaAllAttributeDtoTransfomer->transformFromObject($media);
return $this->api->getReponse($dto);
}
/**
* Finds and displays a Post entity.
*
* @Route("/{url}", methods="GET", name="api_media_show_by_url")
*/
public function showByUrl(Api $api, $url = null)
{
if ($url == null) {
throw new \Exception("Media not found", 304);
}
$medias = $this
->doctrine
->getManager()
->getRepository('App\Entity\Media\Media')
->findBy([
'url' => $url,
'isDeleted'=> false
])
;
if (sizeof($medias) == 0) {
throw new \Exception("Media not found", 304);
}
$media = $medias[0];
$user = $this->security->getUser();
$em = $this->doctrine->getManager();
$mediaFolloawed = $em
->getRepository('App\Entity\Media\MediaFollowers')
->findOneBy(["user" => $user->getId(), "media" => $media->getId()])
;
if ($mediaFolloawed) {
$media->isFollowed = true;
} else {
$media->isFollowed = false;
}
$nbrPosts = $em
->getRepository('App\Entity\Post\Post')->createQueryBuilder('p')
->select('count(p.id)')
->where("p.media = :media and p.isDeleted = false")
->setParameter("media", $media->getId())
->getQuery()->getSingleScalarResult();
$media->nbrPosts = $nbrPosts;
$dto = $this->mediaAllAttributeDtoTransfomer->transformFromObject($media);
return $this->api->getReponse($dto);
}
/**
* @Route("/{id<\d+>}/follower", name="api_media_like", methods={"POST"})
*/
public function follower(Media $media)
{
$result = new InqResult();
$result->result = false;
$user = $this->security->getUser();
$em = $this->doctrine->getManager();
$followers = $em
->getRepository('App\Entity\Media\MediaFollowers')
->findOneBy(["user" => $user->getId(), "media" => $media->getId()])
;
if ($followers) {
$em->remove($followers);
$media->setNbrFollowers($media->getNbrFollowers() - 1);
$user->setFollowing($user->getFollowing() - 1);
} else {
$media->setNbrFollowers($media->getNbrFollowers() + 1);
$user->setFollowing($user->getFollowing() + 1);
$follower = new MediaFollowers();
$follower->setMedia($media);
$follower->setUser($this->security->getUser());
$em->persist($follower);
$result->result = true;
$this->notificationPublisherService->followedMedia($media, $user);
}
$em->flush();
return $this->api->getReponse($result);
}
/**
* @Route("/{id<\d+>}/isfollowed", name="api_media_is_followed", methods={"GET"})
*/
public function isFollowed(Media $media)
{
$result = false;
$user = $this->security->getUser();
$em = $this->doctrine->getManager();
$followers = $em
->getRepository('App\Entity\Media\MediaFollowers')
->findOneBy(["user" => $user->getId(), "media" => $media->getId()])
;
if ($followers) {
$result = true;
}
return $this->api->getReponse($result);
}
/**
* @Route("/{id<\d+>}/accessByQR", name="api_media_accessByQR", methods={"POST"})
*/
public function accessByQR(Media $media)
{
$user = $this->security->getUser();
$mediaAccessByQr = new MediaAccessByQr();
$mediaAccessByQr->setUser($user);
$mediaAccessByQr->setMedia($media);
$em = $this->doctrine->getManager();
$em->persist($mediaAccessByQr);
$em->flush();
return $this->api->getReponse(new InqResult());
}
/**
* @Route("/{url}/accessByQR", name="api_media_accessByQR_with_url", methods={"POST"})
*/
public function accessByQR_withURL($url)
{
$media = $this
->doctrine
->getManager()
->getRepository('App\Entity\Media\Media')
->findOneBy([
'url' => $url,
'isDeleted'=> false
])
;
if (!$media) {
throw new \Exception("Media not found", 304);
}
$user = $this->security->getUser();
$mediaAccessByQr = new MediaAccessByQr();
$mediaAccessByQr->setUser($user);
$mediaAccessByQr->setMedia($media);
$em = $this->doctrine->getManager();
$em->persist($mediaAccessByQr);
$em->flush();
return $this->api->getReponse(new InqResult());
}
/**
* @Route("/{url}/accessByLink", name="api_media_accessByLink", methods={"POST"})
*/
public function accessByLink($url)
{
$media = $this
->doctrine
->getManager()
->getRepository('App\Entity\Media\Media')
->findOneBy([
'url' => $url,
'isDeleted'=> false
])
;
if (!$media) {
throw new \Exception("Media not found", 304);
}
$user = $this->security->getUser();
$mediaAccessByLink = new MediaAccessByLink();
$mediaAccessByLink->setUser($user);
$mediaAccessByLink->setMedia($media);
$em = $this->doctrine->getManager();
$em->persist($mediaAccessByLink);
$em->flush();
return $this->api->getReponse(new InqResult());
}
/**
* @Route("/{id<\d+>}/accessBySearch", name="api_media_accessBySearch", methods={"POST"})
*/
public function accessBySearch(Media $media)
{
$user = $this->security->getUser();
$MediaAccessBySearch = new MediaAccessBySearch();
$MediaAccessBySearch->setUser($user);
$MediaAccessBySearch->setMedia($media);
$em = $this->doctrine->getManager();
$em->persist($MediaAccessBySearch);
$em->flush();
return $this->api->getReponse("Ok");
}
/**
* @Route("/{id<\d+>}/accessByConsultation", name="api_media_accessByConsultation", methods={"POST"})
*/
public function accessByConsultation(Api $api, Media $media, Request $request)
{
$body = $request->getContent();
$data = json_decode($body, true);
$user = $this->security->getUser();
$mediaAccessByConsultation = new MediaAccessByConsultation();
$mediaAccessByConsultation->setUser($user);
$mediaAccessByConsultation->setMedia($media);
$mediaAccessByConsultation->setSource($data['source']);
$em = $this->doctrine->getManager();
$em->persist($mediaAccessByConsultation);
$em->flush();
return $api->getReponse(new InqResult());
}
}