maxcanna/gplaybadge

View on GitHub
src/Controller/BadgeController.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php
/**
 * User: massimilianocannarozzo
 * Date: 29/08/14
 * Time: 23:32
 */

namespace GPlayInfo\Controller;

use GPlayInfo\Service\BadgeGenerator;
use GuzzleHttp\Exception\RequestException;
use Silex\Application;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

const MIMETYPE = 'image/png';

class BadgeController
{
    protected $app;
    /** @var BadgeGenerator */
    private $badgeGenerator;

    public function __construct(Application $app)
    {
        $this->app = $app;
        $this->badgeGenerator = $this->app['service.generator'];
    }

    /**
     * @return Response
     */
    public function badgeAction()
    {
        /** @var Request $request */
        $request = $this->app['request_stack']->getCurrentRequest();
        $utc = new \DateTimeZone('UTC');

        /** @var ParameterBag $query */
        $query = $request->query;

        if (!$query->has('id')) {
            $this->app->abort(400, 'Missing package id');
            return null;
        }

        $packageId = $query->get('id');
        $lang = $query->has('lang') ? $query->get('lang') : 'en';

        $response = new Response();

        $now = new \DateTime('now', $utc);
        $eod = new \DateTime('23:59', $utc);

        $diff = $eod->diff($now);
        $age = $diff->s + ($diff->i + ($diff->h + $diff->d * 24) * 60) * 60;

        $response->setMaxAge($age);
        $response->setSharedMaxAge($age);
        $response->setExpires($eod);
        $response->setLastModified(new \DateTime('midnight', $utc));

        if ($this->app['debug']) {
            $response->headers->addCacheControlDirective('no-cache');
            $response->setPrivate();
            $response->setMaxAge(0);
            $response->setSharedMaxAge(0);
            $response->setExpires(new \DateTime('now', $utc));
        }

        if ($response->isNotModified($request)) {
            $response->setNotModified();
            return $response;
        }

        $img = $this->badgeGenerator->generate($packageId, $lang, $request->getHost());
        $response->setContent($img->encode(MIMETYPE));
        $response->headers->set('Content-Type', MIMETYPE);

        return $response;
    }
}