NexmoWebHookHandler.php 3.19 KB
<?php


namespace NexmoBundle\WebHook;

use AppBundle\Service\ConsoleInvoker;
use CobrandBundle\CobrandInstance;
use CobrandBundle\Service\CobrandFactory;
use JMS\DiExtraBundle\Annotation\Inject;
use JMS\DiExtraBundle\Annotation\InjectParams;
use JMS\DiExtraBundle\Annotation\Service;
use Monolog\Logger;
use NexmoBundle\Manager\NexmoCallManager;
use Sentry\SentryBundle\SentrySymfonyClient;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;

/**
 * Class NexmoWebHookHandler
 * @Service("nexmo.webhooks.base", abstract=true, autowire=true, public=true)
 */
abstract class NexmoWebHookHandler
{
    /**
     * @var Request
     */
    protected $request;

    protected $logger;

    protected $responseData = [];

    /**
     * @var SentrySymfonyClient
     */
    protected $sentry;

    /**
     * @var CobrandInstance
     */
    protected $currentCobrand;

    /**
     * @var ConsoleInvoker
     */
    protected $consoleInvoker;

    /**
     * @param Logger $logger
     * @InjectParams({
     *     "logger" = @Inject("logger", required=false)
     * })
     */
    public function injectLogger(Logger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @param CobrandFactory $factory
     * @InjectParams({
     *     "factory" = @Inject("cobrand.factory", required=false)
     * })
     */
    public function injectCurrentCobrand(CobrandFactory $factory)
    {
        $this->currentCobrand = $factory->current();
    }

    /**
     * @param SentrySymfonyClient $client
     * @InjectParams({
     *     "client" = @Inject("sentry.client", required=false)
     * })
     */
    public function injectSentryClient(SentrySymfonyClient $client)
    {
        $this->sentry = $client;
    }

    /**
     * @param ConsoleInvoker $invoker
     * @InjectParams({
     *     "invoker" = @Inject("spoke.console_invoker", required=false)
     * })
     */
    public function injectConsoleInvoker(ConsoleInvoker $invoker)
    {
        $this->consoleInvoker = $invoker;
    }

    /**
     * @param Request $request
     * @return JsonResponse
     */
    final public function handle(Request $request)
    {
        $this->responseData = [];
        $this->request = $request;

        try {
            $this->processRequest();

            return new JsonResponse($this->responseData, Response::HTTP_OK);
        } catch (\Exception $exception) {
            // Important: Nexmo webhooks needs 200 response code, even for error.
            $this->sentry->captureException($exception);
            return new JsonResponse(["error" => $exception->getMessage()], Response::HTTP_OK);
        }
    }

    protected function getRequestParam($key, $required = true)
    {
        $val = $this->request->get($key, null);
        if ($required && is_null($val)) {
            throw new BadRequestHttpException(sprintf('Missing required parameter for nexmo webhook: %s', $key));
        }

        return $val;
    }

    protected function logInfo($string)
    {
        $this->logger->info("[NEXMO_WEBHOOK]: {$string}");
    }

    abstract protected function processRequest();
}