point-tools/src/Controller/UserController.php

131 lines
4.1 KiB
PHP
Raw Normal View History

2015-05-30 06:50:44 +00:00
<?php
declare(strict_types=1);
2015-05-30 06:50:44 +00:00
namespace App\Controller;
2015-05-30 06:50:44 +00:00
use App\DTO\{TopUserDTO, DailyEventsDTO};
use Knp\Component\Pager\PaginatorInterface;
2015-06-26 15:05:26 +00:00
use Ob\HighchartsBundle\Highcharts\Highchart;
use App\Entity\User;
use App\Repository\{SubscriptionEventRepository, UserRenameEventRepository, UserRepository};
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
2017-11-04 21:30:32 +00:00
use Symfony\Component\HttpFoundation\{Request, Response};
use Symfony\Contracts\Translation\TranslatorInterface;
2015-05-30 06:50:44 +00:00
2017-11-05 02:03:26 +00:00
class UserController extends AbstractController
2015-05-30 06:50:44 +00:00
{
public function __construct(
private readonly TranslatorInterface $translator,
) {
}
public function showAction(
Request $request,
string $login,
SubscriptionEventRepository $subscriptionEventRepository,
UserRepository $userRepository,
UserRenameEventRepository $renameEventRepository,
PaginatorInterface $paginator
): Response {
2015-06-23 10:34:53 +00:00
/** @var User $user */
$user = $userRepository->findUserByLogin($login);
if (!$user) {
throw $this->createNotFoundException('User ' . $login . ' not found.');
}
$subscriberEventsPagination = $paginator->paginate(
$subscriptionEventRepository->createUserLastSubscribersEventsQuery($user),
$request->query->getInt('page', 1),
10
);
2015-05-31 02:48:12 +00:00
return $this->render('SkobkinPointToolsBundle:User:show.html.twig', [
'user' => $user,
'subscribers' => $userRepository->findUserSubscribersById($user->getId()),
'subscriptions_log' => $subscriberEventsPagination,
'rename_log' => $renameEventRepository->findBy(['user' => $user], ['date' => 'DESC'], 10),
2015-05-31 02:48:12 +00:00
]);
2015-05-30 06:50:44 +00:00
}
public function topAction(UserRepository $userRepository, SubscriptionEventRepository $subscriptionEventRepository): Response
2015-05-30 06:50:44 +00:00
{
$topUsers = $userRepository->getTopUsers();
$eventsByDay = $subscriptionEventRepository->getLastEventsByDay();
2015-06-26 15:05:26 +00:00
return $this->render('@SkobkinPointTools/User/top.html.twig', [
'events_dynamic_chat' => $this->createEventsDynamicChart($eventsByDay),
'top_chart' => $this->createTopUsersGraph($topUsers),
]);
2015-05-30 06:50:44 +00:00
}
2015-05-31 07:02:00 +00:00
2015-06-26 15:05:26 +00:00
/**
* @param DailyEventsDTO[] $eventsByDay
*@todo move to the service
*
*/
private function createEventsDynamicChart(array $eventsByDay = []): Highchart
{
2017-01-13 00:00:20 +00:00
$data = [];
2017-01-13 00:00:20 +00:00
foreach ($eventsByDay as $dailyEvents) {
$data[$dailyEvents->date->format('d.m')] = $dailyEvents->eventsCount;
}
2017-01-13 00:00:20 +00:00
return $this->createChart('eventschart', 'line', $data, 'Events by day', 'amount');
}
/**
* @todo move to the service
*
* @param TopUserDTO[] $topUsers
2015-06-26 15:05:26 +00:00
*/
private function createTopUsersGraph(array $topUsers = []): Highchart
2017-01-13 00:00:20 +00:00
{
$data = [];
foreach ($topUsers as $topUser) {
$data[$topUser->login] = $topUser->subscribersCount;
2017-01-13 00:00:20 +00:00
}
return $this->createChart('topchart', 'bar', $data, 'Top users', 'amount');
}
private function createChart(string $blockId, string $type, array $data, string $bottomLabel, string $amountLabel): Highchart
2015-06-26 15:05:26 +00:00
{
$chartData = [
2017-01-13 00:00:20 +00:00
'keys' => [],
'values' => [],
2015-06-26 15:05:26 +00:00
];
// Preparing chart data
2017-01-13 00:00:20 +00:00
foreach ($data as $key => $value) {
$chartData['keys'][] = $key;
$chartData['values'][] = $value;
2015-06-26 15:05:26 +00:00
}
// Chart
$series = [[
'name' => $this->translator->trans($amountLabel),
2017-01-13 00:00:20 +00:00
'data' => $chartData['values'],
2015-06-26 15:05:26 +00:00
]];
// Initializing chart
$ob = new Highchart();
2017-01-13 00:00:20 +00:00
$ob->chart->renderTo($blockId);
$ob->chart->type($type);
$ob->title->text($this->translator->trans($bottomLabel));
2015-06-26 15:05:26 +00:00
$ob->xAxis->title(['text' => null]);
2017-01-13 00:00:20 +00:00
$ob->xAxis->categories($chartData['keys']);
$ob->yAxis->title(['text' => $this->translator->trans($amountLabel)]);
2015-06-26 15:05:26 +00:00
$ob->plotOptions->bar([
'dataLabels' => [
'enabled' => true
]
]);
$ob->series($series);
return $ob;
}
2015-05-30 06:50:44 +00:00
}