<?php
namespace Slivki\Controller\Admin;
use Slivki\Entity\UserBalanceActivityType;
use Slivki\Message\Query\Comment\GetCommentsPaginationQuery;
use Slivki\Messenger\Query\QueryBusInterface;
use Slivki\Paginator\Comment\CommentPaginatorInterface;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;
use Slivki\Entity\Comment;
use Slivki\Entity\MediaType;
use Slivki\Entity\User;
use Slivki\Entity\UserBalanceActivity;
use Slivki\Services\ImageService;
use Slivki\Services\Mailer;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class CommentController extends AdminController
{
/**
* @Route("/admin/comments/user/get/{userID}")
*/
public function getCommentsByUserAction($userID, Request $request) {
$entityManager = $this->getEntityManager();
$user = $entityManager->find(User::class, $userID);
if (!$user) {
return new Response();
}
$dql = "select comment, media from Slivki:Comment comment
left join comment.medias media
where comment.userID = :userID order by comment.createdOn desc";
$query = $this->getEntityManager()->createQuery($dql);
$query->setParameter('userID', $userID);
$query->setMaxResults(50);
return $this->render('Slivki/admin/users/comments_list.html.twig', [
'comments' => $query->getResult()
]);
}
/**
* @Route("/admin/comments/send_letter_to_supplier")
*/
public function sendLetterToSupplier(Request $request, Mailer $mailer) {
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$commentID = $request->request->getInt('commentID');
if ($commentID == 0) {
return new Response();
}
/** @var Comment $comment */
$comment = $this->getCommentRepository()->find($commentID);
if (!$comment) {
return new Response();
}
$entity = $this->getCommentRepository()->getCommentEntity($comment->getEntityID(), $comment->getTypeID());
if (!$entity) {
return new Response();
}
$directors = $entity->getDirectors();
$emailTo = [];
foreach($directors as $director) {
$emailTo[] = $director->getEmail();
}
if (empty($emailTo)) {
return new Response();
}
foreach ($emailTo as $email) {
$message = $mailer->createMessage();
$message->setSubject('Комментарий на сайте Slivki.by')
->setFrom("info@slivki.by", 'Slivki.by')
->setTo($email)
->setBody(
$request->request->get('message'),
'text/html'
);
$mailer->send($message);
}
return new Response();
}
/**
* @Route("/admin/comments/save")
*/
public function commentsSave(
Request $request,
Mailer $mailer,
ValidatorInterface $validator
) {
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$entityManager = $this->getEntityManager();
$userRepository = $this->getUserRepository();
$requestComments = $request->request->get('comments');
$comments = $entityManager->getRepository(Comment::class)->findBy(['ID' => array_keys($requestComments)]);
$changedComments = [];
/** @var Comment $comment */
foreach($comments as $comment) {
if ($comment->isChecked()) {
continue;
}
$currentCommentID = $comment->getID();
$hidden = (bool)$requestComments[$currentCommentID]['hidden'];
if ($comment->getComment() != $requestComments[$currentCommentID]['comment']
|| $comment->getAdminComment() != $requestComments[$currentCommentID]['adminComment']
|| $comment->isHidden() != $hidden || $comment->getRating() != $requestComments[$currentCommentID]['rating']) {
$changedComments[$comment->getEntityID()] = $comment->getTypeID();
}
$comment->setComment($requestComments[$currentCommentID]['comment']);
$comment->setAdminComment($requestComments[$currentCommentID]['adminComment']);
$checked = (bool)$requestComments[$currentCommentID]['checked'];
$comment->setChecked($checked);
if ($checked) {
$comment->setOperator($userRepository->find($this->getUser()->getID()));
$comment->setProcessedByOperatorOn(new \DateTime());
}
if ($comment->getTypeID() == Comment::TYPE_OFFER_COMMENT) {
$offer = $this->getOfferRepository()->find($comment->getEntityID());
if ($checked && $userRepository->addCommentBonus($comment, $offer)) {
$this->sendCommentBonusMessage($mailer, $validator, $comment);
}
if ($comment->isHidden() != $hidden) {
if ($hidden) {
$userRepository->removeCommentBonus($comment, $offer);
} else {
$userRepository->addCommentBonus($comment, $offer);
}
}
}
$comment->setHidden($hidden);
$comment->setRating((int)$requestComments[$currentCommentID]['rating']);
}
$entityManager->flush();
foreach ($changedComments as $entityID => $typeID) {
$this->resetCommentsCache($entityID, $typeID);
}
return new Response();
}
/**
* @Route("/admin/comments/get_comment_images")
*/
public function ajaxGetCommentImages(Request $request, ImageService $imageService){
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$result = [];
$commentID = $request->request->get('id');
$comment = $this->getCommentRepository()->find($commentID);
if (!$comment) {
return new Response('false');
}
foreach ($comment->getMedias() as $commentMedia) {
$result[] = $commentMedia ? $imageService->getImageURL($commentMedia, 0, 0) : '';
}
if (count($result) > 0) {
$data['commentImages'] = $result;
return new Response(json_encode($data));
} else {
return new Response('false');
}
}
/**
* @Route("/admin/comments/delete_comment_image")
*/
public function ajaxDeleteCommentImage(Request $request) {
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$commentID = $request->request->get('id');
$media = $request->request->get('media');
$commentRepository = $this->getCommentRepository();
$comment = $commentRepository->find($commentID);
$user = $comment->getUser();
$entityManager = $this->getDoctrine()->getManager();
$mediaCount = $comment->getMedias()->count();
foreach ($comment->getMedias() as $commentMedia) {
$media = str_replace('/znijki-media/initial' . MediaType::TYPE_USER_VOTE_IMAGE_PATH, '', $media);
if($commentMedia->getName() == $media) {
$entityManager->remove($commentMedia);
$userBalance = $comment->getUser()->getBalance();
if ($mediaCount == 1 && $userBalance > 0) {
$balanceActivity = $entityManager->getRepository(UserBalanceActivity::class)->findBy([
'entityID' => $comment->getID(),
'type' => $entityManager->find(UserBalanceActivityType::class, UserBalanceActivity::TYPE_COMMENT_PHOTO_BONUS)
]);
if (count($balanceActivity) > 0) {
$bonusAmount = $userBalance < $balanceActivity[0]->getAmount() ? $userBalance : $balanceActivity[0]->getAmount();
$balanceActivity = new UserBalanceActivity();
$balanceActivity->setType($entityManager->find(UserBalanceActivityType::class, UserBalanceActivity::TYPE_COMMENT_PHOTO_BONUS_CANCEL));
$balanceActivity->setAmount($bonusAmount * -1);
$balanceActivity->setUser($user);
$balanceActivity->setOperatorID($this->getUser()->getID());
$entityManager->persist($balanceActivity);
$comment->getUser()->setBalance($userBalance + $balanceActivity->getAmount());
}
}
$entityManager->flush();
}
}
$this->resetCommentsCache($comment->getEntityID(), $comment->getTypeID());
return new Response('true');
}
/**
* @Route("/admin/comments/get_operator_answer")
*/
public function ajaxGetOperatorAnswer(Request $request) {
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$operatorID = (int)$request->request->get('operatorID');
$requestDateFrom = $request->request->get('stat-since');
$requestDateTo = $request->request->get('stat-till');
$dateFrom = $requestDateFrom ? date('Y-m-d 00:00', strtotime($requestDateFrom)) : date('Y-m-d 00:00');
$dateTo = $requestDateTo ? date('Y-m-d 00:00', strtotime($requestDateTo)) : date('Y-m-d 00:00', strtotime('+1 days'));
$entityManager = $this->getDoctrine()->getManager('admin');
$operator = $this->getUserRepository()->find($operatorID);
if (!$operator) {
return new Response('Ошибка. Опертатор не найден!');
}
$dql = "select comment from Slivki:Comment comment
where comment.operator = :operator and comment.adminComment != ''
and comment.processedByOperatorOn >= :dateFrom and comment.processedByOperatorOn < :dateTo
order by comment.processedByOperatorOn desc";
$query = $entityManager->createQuery($dql)
->setParameter('operator', $operator)
->setParameter('dateFrom', $dateFrom)
->setParameter('dateTo', $dateTo)
->setMaxResults(100);
$data['commentList'] = $query->getResult();
return $this->render('Slivki/admin/comments/operator_answer_list.html.twig', $data);
}
/**
* @Route("/admin/comments/restore/{commentID}")
*/
public function ajaxRestoreComment($commentID){
$entityManager = $this->getDoctrine()->getManager('admin');
$commentRepository = $entityManager->getRepository(Comment::class);
$comment = $commentRepository->find($commentID);
if (!$comment) {
return new Response();
}
$comment->setDeleted(false);
$entityManager->flush();
$this->resetCommentsCache($comment->getEntityID(), $comment->getTypeID());
return new Response();
}
}