<?php
namespace App\Controller;
use App\Entity\Customer;
use App\Entity\Inquiry;
use App\Entity\Make;
use App\Entity\Offer;
use App\Entity\PrivateMessage;
use App\Form\PrivateMessageFilterType;
use App\Repository\NotificationsRepository;
use App\Repository\OfferRepository;
use App\Repository\PrivateMessageRepository;
use App\Services\InquiryService;
use App\Services\PaginationService;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
class PrivateMessageController extends DictionaryController {
protected $inquiryService;
protected $offerRepository;
protected $notificationsRepository;
public function __construct(Environment $twig,
TranslatorInterface $translator,
AuthenticationUtils $authenticationUtils,
SessionInterface $session,
PrivateMessageRepository $entityRepository,
InquiryService $inquiryService,
OfferRepository $offerRepository,
NotificationsRepository $notificationsRepository
) {
parent::__construct($twig, $translator, $authenticationUtils, $session);
$this->entityRepository = $entityRepository;
$this->inquiryService = $inquiryService;
$this->offerRepository = $offerRepository;
$this->notificationsRepository = $notificationsRepository;
}
public function index(Request $request, FormFactoryInterface $formFactory) : Response
{
$queryBuilder = $this->entityRepository->createQueryBuilder('entity');
$queryBuilder
->select('COUNT(entity.id)')
->leftJoin(Offer::class, 'o', 'WITH', 'entity.offer = o.id')
->leftJoin(Inquiry::class, 'i', 'WITH', 'o.inquiry = i.id')
->leftJoin(Customer::class, 'recipient', 'WITH', 'entity.recipient = recipient.id')
->leftJoin(Customer::class, 'author', 'WITH', 'entity.author = author.id')
->leftJoin(Make::class, 'mak', 'WITH', 'mak.id=i.make')
;
$filter = $this->submitFilter($request, $formFactory);
if ($filter instanceof RedirectResponse) {
return $filter;
}
$this->prepareFilter($request, $queryBuilder, $filter);
$recordsCount = $queryBuilder->getQuery()->getSingleScalarResult();
$paginationInfo = PaginationService::getPaginationInfo($request->attributes->get('page'), $recordsCount);
$queryBuilder
->select('entity')
->setFirstResult($paginationInfo['offset'])
->setMaxResults($paginationInfo['limit'])
->orderBy('entity.id', 'DESC');
$entities = $queryBuilder->getQuery()->getResult();
return new Response(
$this->getTwig()->render(
$this->getConfiguration()['templates']['index'],
[
'paginationInfo' => $paginationInfo,
'entities' => $entities,
'indexRouting' => $this->getConfiguration()['routings']['index'],
'filter' => ($filter !== null) ? $filter->createView() : null,
]
)
);
}
public function show(Request $request) : Response
{
$privateMessage = $this->entityRepository->find($request->attributes->get('id'));
return new Response(
$this->getTwig()->render(
'PrivateMessage/show.html.twig',
[
'privateMessage' => $privateMessage
]
)
);
}
public function uploadFile(Request $request)
{
$files = $this->inquiryService->uploadTemporaryPrivateMessageAttachment($_FILES, $request->attributes->get('id'), $this->getUser()->getId());
return new JsonResponse([
'file' => $files,
'offerId' => $request->attributes->get('id'),
'userId' => $this->getUser()->getId(),
'width' => $files['width'],
'height' => $files['height']
]);
}
public function deleteFile(Request $request)
{
$files = glob($_SERVER['DOCUMENT_ROOT'] . '/upload/' . $request->request->get('offerId') . '/'. $request->request->get('userId') . '/' . $request->request->get('file'));
foreach ($files as $file) {
unlink($file);
}
return new JsonResponse(['message' => 'Usunięto plik '. $request->request->get('file'), 'status' => 'success'], 200);
}
public function getPrivateMessages($id)
{
$customer = $this->get('security.token_storage')->getToken()->getUser();
$offer = $this->offerRepository->find($id);
if ($this->getUser()->getIsSupplier() && ($this->getUser()->getId() != $offer->getSupplier()->getId()) && !$this->getUser()->getIsRecipient()) {
return new JsonResponse(['status' => 'ERROR', 'message' => $this->getTranslator()->trans('offer.messages.you_cannot_see_not_yours_offers')]);
}
if ($this->getUser()->getIsRecipient() && ($this->getUser()->getId() !== $offer->getInquiry()->getRecipient()->getId()) && !$this->getUser()->getIsSupplier()) {
return new JsonResponse(['status' => 'ERROR', 'message' => $this->getTranslator()->trans('offer.messages.you_cannot_see_not_yours_offers')]);
}
if(($this->getUser()->getIsRecipient() && $offer->getInquiry()->getRecipient()->getId() !== $this->getUser()->getId()) && ($this->getUser()->getIsSupplier() && $offer->getSupplier()->getId() != $this->getUser()->getId())){
return new JsonResponse(['status' => 'ERROR', 'message' => $this->getTranslator()->trans('offer.messages.you_cannot_see_not_yours_offers')]);
}
$privateMessages = $this->entityRepository->findBy(['offer' => $id], ['id' => 'DESC']);
$privateMessageIds = [];
/** @var PrivateMessage $privateMessage */
foreach ($privateMessages as $privateMessage) {
$privateMessageIds[$privateMessage->getId()] = $privateMessage;
}
$notificationsForMessagesArray = [];
$notificationsForMessages = $this->notificationsRepository->findBy(['entityType' => 'offer', 'entityId' => $id, 'contentId' => $privateMessageIds]);
foreach ($notificationsForMessages as $notificationsForMessage) {
$notificationsForMessagesArray[$notificationsForMessage->getContentId()] = $notificationsForMessage;
}
$html = $this->getTwig()->render('ClientOffer/privateMessage.html.twig', [
'privateMessages' => $privateMessages,
'notificationsForMessages' => $notificationsForMessagesArray
]);
return new JsonResponse(['html' => $html], 200);
}
public function getConfiguration()
{
return [
'templates' => [
'index' => 'PrivateMessage/index.html.twig',
],
'routings' => [
'index' => 'private_message_index'
],
'classes' => [
'entity' => PrivateMessage::class,
'filter' => PrivateMessageFilterType::class
]
];
}
}