src/Controller/DebugController.php line 203

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-top-100-refresh/'name'debug.task.top_100.refresh')]
  102.     public function taskTop100Refresh(): Response
  103.     {
  104.         return $this->getResponse($this->runCommand('maintenance:top-100:refresh'));
  105.     }
  106.     #[Route(path'/process-bulk-background-actions/'name'debug.task.background.bulk.process_actions')]
  107.     public function taskProcessBulkBackgroundAction(): Response
  108.     {
  109.         set_time_limit(300);
  110.         $this->runCommand('account:bulk-queue:process');
  111.         return $this->getResponse('OK');
  112.     }
  113.     #[Route(path'/process-bulk-background-actions-via-consumer/'name'debug.task.background.bulk.process_actions_via_consumer')]
  114.     public function taskProcessBulkBackgroundActionViaConsumer(): Response
  115.     {
  116.         set_time_limit(600);
  117.         $this->runCommand('messenger:consume');
  118.         return $this->getResponse('OK');
  119.     }
  120.     #[Route(path'/process-support-broadcast-via-web/'name'debug.task.support_broadcast.process_via_web')]
  121.     public function taskProcessSupportBroadcastViaWeb(): Response
  122.     {
  123.         set_time_limit(120);
  124.         $output $this->runCommand('messenger:consume', ['receivers' => ['async']], [
  125.             'limit' => 100,
  126.             'time-limit' => 60,
  127.             'memory-limit' => '256M',
  128.             'no-reset' => true,
  129.         ]);
  130.         return $this->getResponse($output ?: 'OK');
  131.     }
  132.     #[Route(path'/process-video-transcoding/'name'debug.task.background.process_video_transcoding')]
  133.     public function taskProcessVideoTranscoding(): Response
  134.     {
  135.         set_time_limit(600);
  136.         $this->runCommand('messenger:consume', ['receivers' => ['transcoding']], ['limit' => 1]);
  137.         return $this->getResponse('OK');
  138.     }
  139.     #[Route(path'/process-test-data-dummy-profiles-create/'name'debug.task.test-data.dummy-profiles.create')]
  140.     public function taskCreateDummyProfiles(): Response
  141.     {
  142.         set_time_limit(600);
  143.         return $this->getResponse($this->runCommand('test-data:dummy-profiles:create', ['default_user' => true]));
  144.     }
  145.     #[Route(path'/task-hide-free-unapproved-placements/'name'debug.task.hide_free_unapproved_placements')]
  146.     public function taskHideFreeUnapprovedPlacements(): Response
  147.     {
  148.         return $this->getResponse($this->runCommand('update:profiles:hide-free-unapproved-placements'));
  149.     }
  150.     #[Route(path'/genereate-profiles-export/'name'debug.task.export.create')]
  151.     public function taskCreateProfilesExport(): Response
  152.     {
  153.         set_time_limit(600);
  154.         return $this->getResponse($this->runCommand('export:profiles', [], [
  155.             'city' => 'moscow',
  156.             'price_gte' => 15000,
  157.         ]));
  158.     }
  159.     #[Route(path'/task-stations-update/'name'debug.task.stations_update')]
  160.     public function taskStationsUpdate(): Response
  161.     {
  162.         return $this->getResponse($this->runCommand('stations:update'));
  163.     }
  164.     #[Route(path'/task-set-seo-phone-numbers-to-profiles/'name'debug.task.set_seo_phone_numbers_to_profiles')]
  165.     public function taskSetSeoPhoneNumbersToProfiles(): Response
  166.     {
  167.         return $this->getResponse($this->runCommand('maintenance:seo:set-phones-to-profiles'));
  168.     }
  169.     #[Route(path'/task-set-seo-phone-numbers-to-saloons/'name'debug.task.set_seo_phone_numbers_to_saloons')]
  170.     public function taskSetSeoPhoneNumbersToSaloons(): Response
  171.     {
  172.         return $this->getResponse($this->runCommand('maintenance:seo:set-phones-to-saloons'));
  173.     }
  174.     #[Route(path'/task-plan-placement-sync/'name'debug.task.plan_placement.sync'methods: ['GET''POST'])]
  175.     public function taskPlanPlacementSync(Request $request): Response
  176.     {
  177.         $this->assertAvailable();
  178.         $timezone = (string)$request->request->get('timezone''Europe/Moscow');
  179.         $at = (string)$request->request->get(
  180.             'at',
  181.             (new \DateTimeImmutable('now', new \DateTimeZone('Europe/Moscow')))->format('Y-m-d H:i:s')
  182.         );
  183.         $profile trim((string)$request->request->get('profile'''));
  184.         $onlySync = (bool)$request->request->get('only_sync'false);
  185.         $output null;
  186.         if ($request->isMethod('POST')) {
  187.             $options = [
  188.                 'at' => $at,
  189.                 'timezone' => $timezone,
  190.             ];
  191.             if ('' !== $profile) {
  192.                 $options['profile'] = $profile;
  193.             }
  194.             if ($onlySync) {
  195.                 $options['only-sync'] = true;
  196.             }
  197.             $output $this->runCommand('debug:plan-placement:sync', [], $options);
  198.         }
  199.         return $this->render('debug/plan_placement_sync.html.twig', [
  200.             'at' => $at,
  201.             'timezone' => $timezone,
  202.             'profile' => $profile,
  203.             'only_sync' => $onlySync,
  204.             'output' => $output,
  205.         ]);
  206.     }
  207.     protected function assertAvailable()
  208.     {
  209.         if($this->kernel->getEnvironment() != 'dev'
  210.             && $this->kernel->getEnvironment() != 'review')
  211.             throw new UnauthorizedHttpException('Not available');
  212.     }
  213.     protected function runCommand(string $command, array $arguments = [], array $options = []): string
  214.     {
  215.         $this->assertAvailable();
  216.         $arrayInput = [
  217.             'command' => $command,
  218.         ];
  219.         foreach ($arguments as $k => $v)
  220.             $arrayInput[$k] = $v;
  221.         foreach ($options as $k => $v)
  222.             $arrayInput['--'.$k] = $v;
  223.         $input = new ArrayInput($arrayInput);
  224.         $output = new BufferedOutput();
  225.         $this->application->run($input$output);
  226.         return $output->fetch();
  227.     }
  228.     protected function getResponse(string $output): Response
  229.     {
  230.         return new Response($outputheaders: ['Content-Type' => 'text/plain; charset=utf-8']);
  231.     }
  232. }