point-tools/src/Skobkin/Bundle/PointToolsBundle/Controller/UserController.php

108 lines
3.4 KiB
PHP
Raw Normal View History

2015-05-30 06:50:44 +00:00
<?php
namespace Skobkin\Bundle\PointToolsBundle\Controller;
use Doctrine\ORM\EntityManager;
use Skobkin\Bundle\PointToolsBundle\DTO\TopUserDTO;
2015-05-31 02:48:12 +00:00
use Skobkin\Bundle\PointToolsBundle\Entity\User;
use Skobkin\Bundle\PointToolsBundle\Service\UserApi;
2015-05-30 06:50:44 +00:00
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
2015-06-26 15:05:26 +00:00
use Ob\HighchartsBundle\Highcharts\Highchart;
2015-05-31 07:02:00 +00:00
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
2015-05-30 06:50:44 +00:00
class UserController extends Controller
{
2015-05-31 02:48:12 +00:00
/**
* @param string $login
2015-05-31 02:48:12 +00:00
*/
public function showAction(Request $request, string $login): Response
2015-05-30 06:50:44 +00:00
{
2015-06-23 10:34:53 +00:00
/** @var EntityManager $em */
$em = $this->getDoctrine()->getManager();
2015-06-23 10:34:53 +00:00
/** @var User $user */
$user = $em->getRepository('SkobkinPointToolsBundle:User')->findUserByLogin($login);
if (!$user) {
throw $this->createNotFoundException('User ' . $login . ' not found.');
}
$paginator = $this->get('knp_paginator');
$subscriberEventsPagination = $paginator->paginate(
$em->getRepository('SkobkinPointToolsBundle:SubscriptionEvent')->createUserLastSubscribersEventsQuery($user),
$request->query->getInt('page', 1),
10
);
$userApi = $this->get('app.point.api_user');
2015-05-31 02:48:12 +00:00
return $this->render('SkobkinPointToolsBundle:User:show.html.twig', [
'user' => $user,
2015-06-23 10:34:53 +00:00
'subscribers' => $em->getRepository('SkobkinPointToolsBundle:User')->findUserSubscribersById($user->getId()),
'subscriptions_log' => $subscriberEventsPagination,
'rename_log' => $em->getRepository('SkobkinPointToolsBundle:UserRenameEvent')->findBy(['user' => $user], ['date' => 'DESC'], 10),
2015-05-31 02:48:12 +00:00
'avatar_url' => $userApi->getAvatarUrl($user, UserApi::AVATAR_SIZE_LARGE),
]);
2015-05-30 06:50:44 +00:00
}
public function topAction(): Response
2015-05-30 06:50:44 +00:00
{
2015-06-26 15:05:26 +00:00
$topUsers = $this->getDoctrine()->getManager()->getRepository('SkobkinPointToolsBundle:User')->getTopUsers();
$topChart = $this->createTopUsersGraph($topUsers);
return $this->render('@SkobkinPointTools/User/top.html.twig', [
2015-06-26 15:05:26 +00:00
'top_users' => $topUsers,
'top_chart' => $topChart,
]);
2015-05-30 06:50:44 +00:00
}
2015-05-31 07:02:00 +00:00
2015-06-26 15:05:26 +00:00
/**
* @todo move to the service
*
2015-06-26 15:05:26 +00:00
* @param TopUserDTO[] $topUsers
*
2015-06-26 15:05:26 +00:00
* @return Highchart
*/
private function createTopUsersGraph(array $topUsers = []): Highchart
2015-06-26 15:05:26 +00:00
{
$translator = $this->get('translator');
2015-06-26 15:05:26 +00:00
$chartData = [
'titles' => [],
'subscribers' => [],
];
// Preparing chart data
foreach ($topUsers as $user) {
2016-12-11 22:26:27 +00:00
$chartData['titles'][] = $user->getLogin();
$chartData['subscribers'][] = $user->getSubscribersCount();
2015-06-26 15:05:26 +00:00
}
// Chart
$series = [[
'name' => $translator->trans('Subscribers'),
'data' => $chartData['subscribers'],
]];
// Initializing chart
$ob = new Highchart();
$ob->chart->renderTo('topchart');
2015-06-26 15:05:26 +00:00
$ob->chart->type('bar');
$ob->title->text($translator->trans('Top users'));
$ob->xAxis->title(['text' => null]);
$ob->xAxis->categories($chartData['titles']);
$ob->yAxis->title(['text' => $translator->trans('amount')]);
$ob->plotOptions->bar([
'dataLabels' => [
'enabled' => true
]
]);
$ob->series($series);
return $ob;
}
2015-05-30 06:50:44 +00:00
}