<?php
namespace App\Controller\Mailbox;
use App\Constant\Mailbox\SectionConstant;
use App\Serializer\Mailbox\EmailNormalizerInterface;
use App\Service\Mailbox\MailboxService;
use App\Service\Mailbox\RealtimeApi\RealtimeUpdateInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class MailboxController extends AbstractController
{
private $mailboxService;
private $normalizer;
private $realtimeUpdate;
public function __construct(
MailboxService $mailboxService,
EmailNormalizerInterface $normalizer,
RealtimeUpdateInterface $realtimeUpdate
) {
$this->mailboxService = $mailboxService;
$this->normalizer = $normalizer;
$this->realtimeUpdate = $realtimeUpdate;
}
/**
* @Route("/api/immo/v2/mailbox/emails", methods={"GET"})
* @IsGranted("IS_AUTHENTICATED_FULLY")
* @param Request $request
* @return JsonResponse
*/
public function emails(Request $request): JsonResponse
{
$user = $this->getUser();
$userId = $user->getId();
$category = $request->query->get('category', 'all');
$received = $request->query->getBoolean('received');
$page = $request->query->getInt('page', 1);
$itemsPerPage = $request->query->getInt('itemsPerPage', 10);
$section = $request->query->get('section', SectionConstant::PRIVATE);
$count = $this->mailboxService->count($userId, $category, $received, $section);
$data = $this->mailboxService->getList(
$userId,
$category,
$received,
$page,
$itemsPerPage,
$section,
$user->getInboxId(),
$user->getEmail()
);
return new JsonResponse([
'data' => $this->normalizer->normalizeArray(
$data,
[
'received' => $request->query->getBoolean('received'),
'currentUserId' => $this->getUser()->getId(),
]
),
'success' => true,
'message' => 'Email list',
'total' => $count,
'last_page' => ceil($count / $itemsPerPage),
'current_page' => $page,
]);
}
/**
* @Route("/api/immo/v2/mailbox/email", methods={"GET"})
* @IsGranted("IS_AUTHENTICATED_FULLY")
* @param Request $request
* @return JsonResponse
*/
public function details(Request $request): JsonResponse
{
return new JsonResponse([
'data' => $this->normalizer->normalizeDetails(
$this->mailboxService->getDetails(
$request->query->getInt('emailId'),
$this->getUser()->getId()
),
[
'received' => $request->query->getBoolean('received'),
'currentUserId' => $this->getUser()->getId(),
]
),
'success' => true,
'message' => 'Email list'
]);
}
/**
* @Route("/api/immo/v2/mailbox/email/send", methods={"POST"})
* @param Request $request
* @return JsonResponse
*/
public function post(Request $request): JsonResponse
{
$emailToReplyId = $request->request->getInt('emailId', 0);
$email = $this->mailboxService->send(
$this->getUser() ? $this->getUser()->getEmail() : $_ENV['ADMIN_EMAIL'],
$request->request->get('to', ''),
$request->request->get('category'),
$request->request->get('body'),
$emailToReplyId,
$request->files->get('documents', []),
[
'mailSubject' => $request->request->get('subject', null),
'senderType' => $request->request->get('senderType', SectionConstant::PRIVATE),
'receiverType' => $request->request->get('receiverType', SectionConstant::PRIVATE),
]
);
if ($emailToReplyId > 0) {
$data = $this->normalizer->normalizeReply($email);
} else {
$data = $this->normalizer->normalize(
$email,
[ 'received' => false, 'currentUserId' => $this->getUser() ? $this->getUser()->getId() : null ]
);
}
$emailData = $email->getEmailToReply() ? $email->getEmailToReply() : $email;
$emailData->setDate($email->getDate());
$this->realtimeUpdate->realtimeUpdate(
json_encode(
$this->normalizer->normalize($emailData, [
'received' => true,
'currentUserId' => $email->getReceiver()->getId(),
'withoutReplies' => true,
])
),
['userId' => 'email/' . $email->getReceiver()->getId()]
);
return new JsonResponse(
[
'data' => $data,
'success' => true,
'message' => 'Email sended'
]
);
}
/**
* @Route("/api/immo/v2/mailbox/email/count", methods={"GET"})
* @IsGranted("IS_AUTHENTICATED_FULLY")
* @param Request $request
* @return JsonResponse
*/
public function count(Request $request): JsonResponse
{
$section = $request->query->get('section');
return new JsonResponse([
'data' => $this->mailboxService->getNumberOfUnreadMessages(
$this->getUser()->getId(),
$section
),
'success' => true,
'message' => 'Total of email not seen'
]);
}
/**
* @Route("/api/immo/v2/mailbox/email/delete", methods={"DELETE"})
* @IsGranted("IS_AUTHENTICATED_FULLY")
* @param Request $request
* @return JsonResponse
*/
public function delete(Request $request): JsonResponse
{
$email = $this->mailboxService->getOne($request->query->getInt('emailId', 0));
$this->mailboxService->markDelete(
$email,
$email->getReceiver()->getId() === $this->getUser()->getId()
);
$this->realtimeUpdate->realtimeUpdate(
json_encode($this->mailboxService->getNumberOfUnreadMessages($this->getUser()->getId())),
['userId' => $this->getUser()->getId()]
);
return new JsonResponse([
'data' => [],
'success' => true,
'message' => 'Email deleted successfully'
]);
}
}