src/Controller/DebugController.php line 155

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Service\Features;
  4. use Symfony\Bundle\FrameworkBundle\Console\Application;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\Console\Input\ArrayInput;
  7. use Symfony\Component\Console\Output\BufferedOutput;
  8. use Symfony\Component\Console\Output\NullOutput;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
  12. use Symfony\Component\HttpKernel\KernelInterface;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. class DebugController extends AbstractController
  15. {
  16.     private KernelInterface $kernel;
  17.     private Application $application;
  18.     public function __construct(KernelInterface $kernel)
  19.     {
  20.         $this->kernel $kernel;
  21.         $this->application = new Application($this->kernel);
  22.         $this->application->setAutoExit(false);
  23.     }
  24.     #[Route(path'/debug-features/'name'debug.task.debug_features')]
  25.     public function debugFeatures(Features $features): Response
  26.     {
  27.         $this->assertAvailable();
  28.         $features = [];
  29.         foreach ($_ENV as $k => $v) {
  30.             if(str_starts_with($k'FEATURE'))
  31.                 $features[$k] = $v;
  32.         }
  33.         ksort($features);
  34.         return $this->json($features);
  35.     }
  36.     #[Route(path'/task-charge-placed/'name'debug.task.charge_placements')]
  37.     public function taskChargePlacements(): Response
  38.     {
  39.         return $this->getResponse($this->runCommand('sales:profile-saloon:adboard:charge'));
  40.     }
  41.     #[Route(path'/task-charge-hidden/'name'debug.task.charge_hidings')]
  42.     public function taskChargeHidings(): Response
  43.     {
  44.         return $this->getResponse($this->runCommand('sales:profile:hiding:charge'));
  45.     }
  46.     #[Route(path'/task-profiles-rotate/'name'debug.task.profiles.rotate')]
  47.     public function taskProfilesRotate(): Response
  48.     {
  49.         $output $this->runCommand('sales:profile:adboard:rotate');
  50.         return $this->getResponse($output);
  51.     }
  52.     #[Route(path'/task-saloons-rotate/'name'debug.task.saloons.rotate')]
  53.     public function taskSaloonsRotate(): Response
  54.     {
  55.         $output $this->runCommand('sales:saloon:adboard:rotate');
  56.         return $this->getResponse($output);
  57.     }
  58.     #[Route(path'/task-rotate/'name'debug.task.rotate')]
  59.     public function taskRotate(): Response
  60.     {
  61.         $output $this->runCommand('sales:profile:adboard:rotate');
  62.         $output .= $this->runCommand('sales:saloon:adboard:rotate');
  63.         return $this->getResponse($output);
  64.     }
  65.     #[Route(path'/task-profiles-rotate-free/'name'debug.task.profiles.rotate_free')]
  66.     public function taskProfilesRotateFree(): Response
  67.     {
  68.         return $this->getResponse($this->runCommand('sales:profile:adboard:rotate-free'));
  69.     }
  70.     #[Route(path'/task-profiles-align/'name'debug.task.profiles.align')]
  71.     public function taskProfilesAlign(): Response
  72.     {
  73.         $output $this->runCommand('sales:profile:adboard:align-positions');
  74.         return $this->getResponse($output);
  75.     }
  76.     #[Route(path'/task-profiles-delete-rejected-on-moderation/'name'debug.task.profiles.delete_rejected_on_moderation')]
  77.     public function taskProfilesDeleteRejectedOnModeration(): Response
  78.     {
  79.         return $this->getResponse($this->runCommand('update:profiles:delete-rejected-on-moderation', [], ['interval' => '5 MINUTE']));
  80.     }
  81.     #[Route(path'/task-users-set-trusted/'name'debug.task.users.set_trusted')]
  82.     public function taskUsersSetTrusted(): Response
  83.     {
  84.         return $this->getResponse($this->runCommand('update:users:set-trusted'));
  85.     }
  86.     #[Route(path'/task-users-low-balance-notification/'name'debug.task.users.low_balance_notification')]
  87.     public function taskUsersLowBalanceNotification(): Response
  88.     {
  89.         return $this->getResponse($this->runCommand('sales:user:low-balance:notify'));
  90.     }
  91.     #[Route(path'/task-persist-ctr-values-permanent/'name'debug.task.profile_ctr.persist_permanent')]
  92.     public function taskPersistCtrValuesPermanent(): Response
  93.     {
  94.         return $this->getResponse($this->runCommand('maintenance:profile-ctr:persist-permanent'));
  95.     }
  96.     #[Route(path'/task-clear-ctr-values-cache/'name'debug.task.profile_ctr.clear_cache')]
  97.     public function taskClearCtrValuesCache(): Response
  98.     {
  99.         return $this->getResponse($this->runCommand('maintenance:profile-ctr:clear-cache'));
  100.     }
  101.     #[Route(path'/task-refresh-cold-start-recommendations/'name'debug.task.recommendations.cold_start.refresh')]
  102.     public function taskRefreshColdStartRecommendations(): Response
  103.     {
  104.         return $this->getResponse($this->runCommand('maintenance:recommendations:cold-start:refresh', [], ['verbose' => true]));
  105.     }
  106.     #[Route(path'/task-top-100-refresh/'name'debug.task.top_100.refresh')]
  107.     public function taskTop100Refresh(): Response
  108.     {
  109.         return $this->getResponse($this->runCommand('maintenance:top-100:refresh'));
  110.     }
  111.     #[Route(path'/process-bulk-background-actions/'name'debug.task.background.bulk.process_actions')]
  112.     public function taskProcessBulkBackgroundAction(): Response
  113.     {
  114.         set_time_limit(300);
  115.         $this->runCommand('account:bulk-queue:process');
  116.         return $this->getResponse('OK');
  117.     }
  118.     #[Route(path'/process-bulk-background-actions-via-consumer/'name'debug.task.background.bulk.process_actions_via_consumer')]
  119.     public function taskProcessBulkBackgroundActionViaConsumer(): Response
  120.     {
  121.         set_time_limit(600);
  122.         $this->runCommand('messenger:consume');
  123.         return $this->getResponse('OK');
  124.     }
  125.     #[Route(path'/process-support-broadcast-via-web/'name'debug.task.support_broadcast.process_via_web')]
  126.     public function taskProcessSupportBroadcastViaWeb(): Response
  127.     {
  128.         set_time_limit(120);
  129.         $output $this->runCommand('messenger:consume', ['receivers' => ['async']], [
  130.             'limit' => 100,
  131.             'time-limit' => 60,
  132.             'memory-limit' => '256M',
  133.             'no-reset' => true,
  134.         ]);
  135.         return $this->getResponse($output ?: 'OK');
  136.     }
  137.     #[Route(path'/process-video-transcoding/'name'debug.task.background.process_video_transcoding')]
  138.     public function taskProcessVideoTranscoding(): Response
  139.     {
  140.         set_time_limit(600);
  141.         $this->runCommand('messenger:consume', ['receivers' => ['transcoding']], ['limit' => 1]);
  142.         return $this->getResponse('OK');
  143.     }
  144.     #[Route(path'/process-test-data-dummy-profiles-create/'name'debug.task.test-data.dummy-profiles.create')]
  145.     public function taskCreateDummyProfiles(): Response
  146.     {
  147.         set_time_limit(600);
  148.         return $this->getResponse($this->runCommand('test-data:dummy-profiles:create', ['default_user' => true]));
  149.     }
  150.     #[Route(path'/task-hide-free-unapproved-placements/'name'debug.task.hide_free_unapproved_placements')]
  151.     public function taskHideFreeUnapprovedPlacements(): Response
  152.     {
  153.         return $this->getResponse($this->runCommand('update:profiles:hide-free-unapproved-placements'));
  154.     }
  155.     #[Route(path'/genereate-profiles-export/'name'debug.task.export.create')]
  156.     public function taskCreateProfilesExport(): Response
  157.     {
  158.         set_time_limit(600);
  159.         return $this->getResponse($this->runCommand('export:profiles', [], [
  160.             'city' => 'moscow',
  161.             'price_gte' => 15000,
  162.         ]));
  163.     }
  164.     #[Route(path'/task-stations-update/'name'debug.task.stations_update')]
  165.     public function taskStationsUpdate(): Response
  166.     {
  167.         return $this->getResponse($this->runCommand('stations:update'));
  168.     }
  169.     #[Route(path'/task-set-seo-phone-numbers-to-profiles/'name'debug.task.set_seo_phone_numbers_to_profiles')]
  170.     public function taskSetSeoPhoneNumbersToProfiles(): Response
  171.     {
  172.         return $this->getResponse($this->runCommand('maintenance:seo:set-phones-to-profiles'));
  173.     }
  174.     #[Route(path'/task-set-seo-phone-numbers-to-saloons/'name'debug.task.set_seo_phone_numbers_to_saloons')]
  175.     public function taskSetSeoPhoneNumbersToSaloons(): Response
  176.     {
  177.         return $this->getResponse($this->runCommand('maintenance:seo:set-phones-to-saloons'));
  178.     }
  179.     #[Route(path'/task-plan-placement-sync/'name'debug.task.plan_placement.sync'methods: ['GET''POST'])]
  180.     public function taskPlanPlacementSync(Request $request): Response
  181.     {
  182.         $this->assertAvailable();
  183.         $timezone = (string)$request->request->get('timezone''Europe/Moscow');
  184.         $at = (string)$request->request->get(
  185.             'at',
  186.             (new \DateTimeImmutable('now', new \DateTimeZone('Europe/Moscow')))->format('Y-m-d H:i:s')
  187.         );
  188.         $profile trim((string)$request->request->get('profile'''));
  189.         $onlySync = (bool)$request->request->get('only_sync'false);
  190.         $output null;
  191.         if ($request->isMethod('POST')) {
  192.             $options = [
  193.                 'at' => $at,
  194.                 'timezone' => $timezone,
  195.             ];
  196.             if ('' !== $profile) {
  197.                 $options['profile'] = $profile;
  198.             }
  199.             if ($onlySync) {
  200.                 $options['only-sync'] = true;
  201.             }
  202.             $output $this->runCommand('debug:plan-placement:sync', [], $options);
  203.         }
  204.         return $this->render('debug/plan_placement_sync.html.twig', [
  205.             'at' => $at,
  206.             'timezone' => $timezone,
  207.             'profile' => $profile,
  208.             'only_sync' => $onlySync,
  209.             'output' => $output,
  210.         ]);
  211.     }
  212.     protected function assertAvailable()
  213.     {
  214.         if($this->kernel->getEnvironment() != 'dev'
  215.             && $this->kernel->getEnvironment() != 'review')
  216.             throw new UnauthorizedHttpException('Not available');
  217.     }
  218.     protected function runCommand(string $command, array $arguments = [], array $options = []): string
  219.     {
  220.         $this->assertAvailable();
  221.         $arrayInput = [
  222.             'command' => $command,
  223.         ];
  224.         foreach ($arguments as $k => $v)
  225.             $arrayInput[$k] = $v;
  226.         foreach ($options as $k => $v)
  227.             $arrayInput['--'.$k] = $v;
  228.         $input = new ArrayInput($arrayInput);
  229.         $output = new BufferedOutput();
  230.         $this->application->run($input$output);
  231.         return $output->fetch();
  232.     }
  233.     protected function getResponse(string $output): Response
  234.     {
  235.         return new Response($outputheaders: ['Content-Type' => 'text/plain; charset=utf-8']);
  236.     }
  237. }