foundershub/StartupWeekendBundle

View on GitHub
Controller/TwitterFeedController.php

Summary

Maintainability
A
50 mins
Test Coverage
<?php

namespace Foundershub\Bundle\StartupWeekendBundle\Controller;

use Dothiv\ValueObject\ClockValue;
use Foundershub\Bundle\StartupWeekendBundle\Exception\RuntimeException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

require_once __DIR__ . '/../../../../../../abraham/twitteroauth/twitteroauth/twitteroauth.php';

/**
 * This controller provides the twitter stream for the social board.
 */
class TwitterFeedController
{

    /**
     * @var string
     */
    private $consumer_key;

    /**
     * @var string
     */
    private $consumer_secret;

    /**
     * @var string
     */
    private $oauth_access_token;

    /**
     * @var string
     */
    private $oauth_access_token_secret;

    /**
     * @var int
     */
    private $pageLifetime;

    /**
     * @var string
     */
    private $screenName;

    /**
     * @var ClockValue
     */
    private $clock;

    /**
     * @param string     $screen_name
     * @param string     $consumer_key
     * @param string     $consumer_secret
     * @param string     $oauth_access_token
     * @param string     $oauth_access_token_secret
     * @param ClockValue $clock
     * @param int        $pageLifetime
     */
    public function __construct(
        $screen_name,
        $consumer_key,
        $consumer_secret,
        $oauth_access_token,
        $oauth_access_token_secret,
        ClockValue $clock,
        $pageLifetime
    )
    {
        $this->screenName                = $screen_name;
        $this->consumer_key              = $consumer_key;
        $this->consumer_secret           = $consumer_secret;
        $this->oauth_access_token        = $oauth_access_token;
        $this->oauth_access_token_secret = $oauth_access_token_secret;
        $this->clock                     = $clock;
        $this->pageLifetime              = $pageLifetime;
    }

    /**
     * @param Request $request
     *
     * @return Response
     *
     * @throws RuntimeException
     */
    public function twitterAction(Request $request)
    {
        $auth              = new \TwitterOAuth($this->consumer_key, $this->consumer_secret, $this->oauth_access_token, $this->oauth_access_token_secret);
        $auth->host        = "https://api.twitter.com/1.1/";
        $auth->decode_json = false;
        $stream            = $auth->get('statuses/user_timeline', ['count' => $request->get('count'), 'exclude_replies' => $request->get('exclude_replies'), 'screen_name' => $this->screenName]);

        if (!$stream) {
            throw new RuntimeException('Failed to fetch Twitter stream.');
        }

        $response = new Response();
        $response->headers->set('Content-Type', 'application/json; charset=utf-8');
        $response->headers->set('Expires', '-1');
        $response->setStatusCode(200);
        $response->setMaxAge(0);
        $response->setPublic();
        $response->setSharedMaxAge($this->pageLifetime);
        $response->setExpires($this->clock->getNow()->modify(sprintf('+%d seconds', $this->pageLifetime)));
        $response->setContent($stream);
        return $response;
    }
}