src/Controller/Search/DashboardSearchController.php line 47
<?phpnamespace App\Controller\Search;use App\Entity\Advertiser;use App\Entity\Comment;use App\Entity\Device;use App\Entity\Host;use App\Entity\ProxyUser;use App\Entity\SearchCampaign;use App\Entity\SearchFeed;use App\Entity\SearchFeedIsps;use App\Entity\User;use App\Repository\SearchCampaignRepository;use App\Repository\SearchFeedRepository;use EasyCorp\Bundle\EasyAdminBundle\Config\Action;use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;use EasyCorp\Bundle\EasyAdminBundle\Config\UserMenu;use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\Security\Core\User\UserInterface;use Symfony\UX\Chartjs\Builder\ChartBuilderInterface;use Symfony\UX\Chartjs\Model\Chart;class DashboardSearchController extends AbstractDashboardController{private SearchFeedRepository $searchFeedRepository;private SearchCampaignRepository $campaignRepository;private ChartBuilderInterface $chartBuilder;public function __construct(SearchCampaignRepository $campaignRepository, SearchFeedRepository $searchFeedRepository, ChartBuilderInterface $chartBuilder, private AdminUrlGenerator $adminUrlGenerator){$this->campaignRepository = $campaignRepository;$this->searchFeedRepository = $searchFeedRepository;$this->chartBuilder = $chartBuilder;}#[IsGranted('ROLE_USER')]#[Route('/', name: 'search')]public function index(): Response{$runningFeeds = $this->searchFeedRepository->findLatest();$enabledFeeds = $this->campaignRepository->findBy(['enabled' => true]);$lastSevenDaysUsages = $this->searchFeedRepository->lastSevenDaysUsages();// current month$firstDayOfMonth = (new \DateTime('first day of this month'))->format('Y-m-d');$today = (new \DateTime('now'))->format('Y-m-d');$currentMonthUsages = $this->searchFeedRepository->monthUsages($firstDayOfMonth, $today);// last month$firstDayOfLastMonth = (new \DateTime('first day of last month'))->format('Y-m-d');$lastDayOfLastMonth = (new \DateTime('last day of last month'))->format('Y-m-d');$lastMonthUsages = $this->searchFeedRepository->monthUsages($firstDayOfLastMonth, $lastDayOfLastMonth);$currentMonthUsagesByAdv = $this->searchFeedRepository->monthUsagesByAdv($firstDayOfMonth, $today);$lastMonthUsagesByAdv = $this->searchFeedRepository->monthUsagesByAdv($firstDayOfLastMonth, $lastDayOfLastMonth);return $this->render('admin/index_search.html.twig', ['enabledFeeds' => $enabledFeeds,'runningFeeds' => $runningFeeds,'lastSevenDaysUsages' => $lastSevenDaysUsages,'currentMonthUsages' => $currentMonthUsages,'lastMonthUsages' => $lastMonthUsages,'currentMonthUsagesByAdv' => $currentMonthUsagesByAdv,'lastMonthUsagesByAdv' => $lastMonthUsagesByAdv,'chart' => $this->createChart($currentMonthUsagesByAdv),]);}public function configureDashboard(): Dashboard{return Dashboard::new()->setTitle('Overflow Admin Search');}public function configureUserMenu(UserInterface $user): UserMenu{if (!$user instanceof User) {throw new \Exception('Wrong User');}return parent::configureUserMenu($user)->setAvatarUrl($user->getAvatarUrl())->setMenuItems([MenuItem::linkToUrl('My Profile', 'fa fa-user', $this->generateUrl('app_profile_show'))]);}public function configureCrud(): Crud{return parent::configureCrud()->setDefaultSort(['id' => 'DESC',])->overrideTemplate('crud/field/id', 'admin/field/id_with_icon.html.twig');}public function configureMenuItems(): iterable{yield MenuItem::linkToDashboard('Dashboard Search', 'fa fa-dashboard');yield MenuItem::section('Settings');yield MenuItem::linkToCrud('Advertisers', 'fa fa-users', Advertiser::class);yield MenuItem::linkToCrud('Search Campaings', 'fa fa-users', SearchCampaign::class);yield MenuItem::section();yield MenuItem::section('Search Campaings');yield MenuItem::linkToCrud('SearchFeed Today', 'fa fa-users', SearchFeed::class)->setController(SearchFeedCrudTodayController::class);yield MenuItem::linkToCrud('SearchFeed Yesterday', 'fa fa-users', SearchFeed::class)->setController(SearchFeedCrudYesterdayController::class);yield MenuItem::linkToCrud('SearchFeed', 'fa fa-users', SearchFeed::class)->setController(SearchFeedCrudController::class);yield MenuItem::section();yield MenuItem::linkToCrud('SearchFeed Isp\'s', 'fa fa-tags', SearchFeedIsps::class);yield MenuItem::linkToCrud('Hosts', 'fa fa-tags', Host::class);yield MenuItem::linkToCrud('Available Proxy Users', 'fa fa-users', ProxyUser::class);yield MenuItem::linkToCrud('Devices', 'fa fa-users', Device::class);yield MenuItem::linkToCrud('Comments', 'fa fa-users', Comment::class);yield MenuItem::section();yield MenuItem::linkToUrl('Apag', '', '/admin');}public function configureActions(): Actions{return parent::configureActions()->add(Crud::PAGE_INDEX, Action::DETAIL)->update(Crud::PAGE_DETAIL, Action::EDIT, static function (Action $action) {return $action->setIcon('fa fa-edit');})->update(Crud::PAGE_DETAIL, Action::INDEX, static function (Action $action) {return $action->setIcon('fa fa-list');});}public function configureAssets(): Assets{return parent::configureAssets()->addWebpackEncoreEntry('admin');}private function createChart(array $currentMonthUsagesByAdv): Chart{$labels = [];$sumClicks = [];$sumRevenue = [];$sumCosts = [];$sumProfit = [];foreach ($currentMonthUsagesByAdv as $data) {// Assuming all keys are always present, if not, use null coalescing like $data['sumClicks'] ?? 0$labels[] = $data['advertiserName'];$sumClicks[] = (int)$data['sumClicks'];$sumRevenue[] = (float)$data['sumCosts'];$sumCosts[] = (float)$data['sumUsages'] * 2.7;$sumProfit[] = (float)$data['sumCosts'] - (float)$data['sumUsages'] * 2.7;}$chart = $this->chartBuilder->createChart(Chart::TYPE_RADAR);$chart->setOptions(['plugins' => ['title' => ['display' => true,'text' => strtoupper('Usages Adv This Month'),'fontColor' => '#ce1111','fontSize' => 16//'padding' => 50],],'scales' => ['y' => ['suggestedMin' => 0,'suggestedMax' => 100,],],]);$chart->setData(['labels' => $labels,'datasets' => [['label' => 'Sum Clicks','backgroundColor' => 'rgb(22, 99, 132, 0.2)','borderColor' => 'rgb(22, 99, 132)','data' => $sumClicks,'hidden' => true,],['label' => 'Sum Revenue','backgroundColor' => 'rgb(45, 220, 126, 0.2)','borderColor' => 'rgb(45, 220, 126)','data' => $sumRevenue,],['label' => 'Sum Costs','backgroundColor' => 'rgb(255, 99, 132, 0.2)','borderColor' => 'rgb(255, 99, 132)','data' => $sumCosts,],['label' => 'Sum Profit',// 'backgroundColor' => 'rgb(255, 99, 132)',// 'borderColor' => 'rgb(255, 99, 132)','data' => $sumProfit,],],]);return $chart;}}