src/Controller/AppController.php line 160

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Domain;
  4. use App\Entity\Message;
  5. use App\Entity\User;
  6. use App\Repository\DomainRepository;
  7. use App\Repository\MessageRepository;
  8. use App\Repository\UserRepository;
  9. use App\Service\AppRestCore;
  10. use Bitrix24\SDK\Core\CoreBuilder;
  11. use DateTime;
  12. use DateTimeZone;
  13. use Doctrine\Persistence\ManagerRegistry;
  14. use Manao\Bitrix\Rest\Client\Client;
  15. use Manao\Bitrix\Rest\Client\Strategies\DefaultStrategy;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\RequestStack;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. use GuzzleHttp;
  24. use GuzzleHttp\Exception\ClientException;
  25. use Manao\Bitrix\Rest\Client\RestMethod;
  26. use Manao\Bundle\BitrixRestBundle\Event\UserAuthorized;
  27. use Monolog\Handler\StreamHandler;
  28. use Monolog\Logger;
  29. use Symfony\Component\EventDispatcher\EventDispatcher;
  30. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  31. use Symfony\Component\HttpClient\HttpClient;
  32. use Symfony\Component\Validator\Constraints\Date;
  33. use Symfony\Component\Validator\Validator\ValidatorInterface;
  34. use Throwable;
  35. class AppController extends AbstractController
  36. {
  37.     private RequestStack $requestStack;
  38.     private Request $request;
  39.     private ParameterBagInterface $parameterBag;
  40.     private AppRestCore $restCore;
  41.     public function __construct(RequestStack $requestStackParameterBagInterface $parameterBagAppRestCore $restCore)
  42.     {
  43.         $this->requestStack $requestStack;
  44.         $this->request $requestStack->getCurrentRequest();
  45.         $this->parameterBag $parameterBag;
  46.         $this->restCore $restCore;
  47.     }
  48.     
  49.     /**
  50.      * @Route("/install", name="install")
  51.      */
  52.     public function install(): Response
  53.     {
  54.         $arr = [
  55.             'AUTH_ID' => $this->request->get('AUTH_ID'),
  56.             'REFRESH_ID' => $this->request->get('REFRESH_ID'),
  57.             'AUTH_EXPIRES' => $this->request->get('AUTH_EXPIRES'),
  58.             'DOMAIN' => $this->request->get('DOMAIN'),
  59.         ];
  60.         // dd($arr);
  61.         dump($arr);
  62.         // $authId = 'ec449763005fa298005fa2920000000100000751008ef78a60d8f2c08b1326a44b77fb';
  63.         // $refreshId = 'dcc3be63005fa298005fa2920000000100000780e8b8b2985c6e2fc961147f128237e5';
  64.         // $authExpires = 3600;
  65.         // $domain = 'https://b24-6wunou.bitrix24.by';
  66.         $this->restCore->setCredentials($this->request->get('AUTH_ID'), $this->request->get('REFRESH_ID'), $this->request->get('AUTH_EXPIRES'), $this->request->get('DOMAIN'));
  67.         // 'app.info',
  68.         $resultBot $this->restCore->call(
  69.             'imbot.register',
  70.             [
  71.                 'CODE' => 'delayed.messages'// Строковой идентификатор бота, уникальный в рамках вашего приложения (обяз.)
  72.                 'TYPE' => 'S'// Тип бота, B - чат-бот, ответы поступают сразу, H - человек, ответы поступают с задержкой от 2-х до 10 секунд, O - чат-бот для Открытых линий, S - чат-бот с повышенными привилегиями (supervisor)
  73.                 'EVENT_HANDLER' => 'https://delayedmess.dev-bitrix.by/'// Ссылка на обработчик событий поступивших от сервера, см. Обработчики событий ниже (обяз).
  74.                 'OPENLINE' => 'Y'// Включение режима поддержки Открытых линий, можно не указывать, если TYPE = 'O'
  75.                 'CLIENT_ID' => ''// строковый идентификатор чат-бота, используется только в режиме Вебхуков
  76.                 'PROPERTIES' => [ // Личные данные чат-бота (обяз.)
  77.                     'NAME' => 'DelayedMessage'// Имя чат-бота (обязательное одно из полей NAME или LAST_NAME)
  78.                 ]
  79.             ]
  80.         );
  81.         if (isset($resultBot[0])) {
  82.             $botId $resultBot[0];
  83.         } else {
  84.             // some error message
  85.             // return
  86.         }
  87.         var_dump($botId);
  88.         $iconFileB64 base64_encode(file_get_contents($this->getParameter('kernel.project_dir') . '/public/assets/icon.png'));
  89.         // dd($iconFileB64);
  90.         // Возможно HASH нужно делать уникальным для каждого портала
  91.         $resultApp $this->restCore->call(
  92.             'imbot.app.register',
  93.             [
  94.                 'BOT_ID' => $botId// идентификатор бота владельца приложения для чата
  95.                 'CODE' => 'delayed_messages'// код приложения для чата
  96.                 'IFRAME' => 'https://delayedmess.dev-bitrix.by/frame',
  97.                 'IFRAME_WIDTH' => '591'// желаемая ширина фрейма. Минимальное значение - 250px
  98.                 'IFRAME_HEIGHT' => '420'// желаемая высота фрейма. Минимальное значение - 50px
  99.                 'HASH' => $this->parameterBag->get('iframe_hash_token'), // токен для доступа к вашему фрейму для проверки подписи, 32 символа.
  100.                 'ICON_FILE' => $iconFileB64// Иконка вашего приложения - base64
  101.                 'CONTEXT' => 'ALL'// контекст приложения
  102.                 'HIDDEN' => 'N'// скрытое приложение или нет
  103.                 'EXTRANET_SUPPORT' => 'N'// доступна ли команда пользователям экстранет, по умолчанию N
  104.                 'LIVECHAT_SUPPORT' => 'Y'// поддержка онлайн-чата
  105.                 'IFRAME_POPUP' => 'N'// iframe будет открыт с возможностью перемещения внутри мессенджера, переход между диалогами не будет закрывать такое окно.
  106.                 'LANG' => [ // массив переводов, желательно указывать как минимум для RU и EN
  107.                     ['LANGUAGE_ID' => 'ru''TITLE' => 'Отложенные сообщения''COPYRIGHT' => 'ManaoTeam'],
  108.                 ]
  109.             ]
  110.         );
  111.         $resultPlacement $this->restCore->call(
  112.             'placement.bind',
  113.             [
  114.                 'PLACEMENT' => 'REST_APP_URI',
  115.                 'HANDLER' => 'https://delayedmess.dev-bitrix.by/',
  116.             ]
  117.         );
  118.         // dd($resultPlacement);
  119.         return $this->render('app/install.html.twig', [
  120.             // 'test' => $this->parameterBag->get('client_id'),
  121.         ]);
  122.     }
  123.     /**
  124.      * @Route("/handler", name="handler")
  125.      */
  126.     public function handler(): Response
  127.     {
  128.         $arr = [
  129.             'AUTH_ID' => $this->request->get('AUTH_ID'),
  130.             'REFRESH_ID' => $this->request->get('REFRESH_ID'),
  131.             'AUTH_EXPIRES' => $this->request->get('AUTH_EXPIRES'),
  132.         ];
  133.         // $arr = $this->request->__toString();
  134.         dd($_REQUEST);
  135.         // dd($arr);
  136.         return $this->render('app/handler.html.twig', [
  137.             // 'controller_name' => 'AppController',
  138.             'test' => $this->parameterBag->get('client_id'),
  139.         ]);
  140.     }
  141.     /**
  142.      * @Route("/", name="index")
  143.      */
  144.     public function index(): Response
  145.     {
  146.         var_dump($_REQUEST);
  147.         return $this->render('app/index.html.twig', []);
  148.     }
  149.     /**
  150.      * @Route("/frame", name="frame")
  151.      */
  152.     public function frame(): Response
  153.     {
  154.         var_dump($_REQUEST);
  155.         return $this->render('app/frame.html.twig', []);
  156.     }
  157.     /**
  158.      * @Route("/test", name="test")
  159.      */
  160.     public function test(EventDispatcherInterface $eventDispatcher): Response
  161.     {
  162.         // user 1
  163.         $authId '84257663005f27a6005edfb200000001000007d01dc93f70fd966e019e3eab4028a733';
  164.         $refreshId '74a49d63005f27a6005edfb200000001000007dea6b6a602c515d00d923d8ccf94e782';
  165.         // user 8
  166.         $authId '1f2f7663005f27a6005edfb200000008000007ab8868ea2076a60885ff44225d0d53fa';
  167.         $refreshId '0fae9d63005f27a6005edfb20000000800000714f512e2643e562098844d821a544a09';
  168.         $arr = [
  169.             // 'AUTH_ID' => $this->request->get('AUTH_ID'),
  170.             // 'REFRESH_ID' => $this->request->get('REFRESH_ID'),
  171.         ];
  172.                 // // create a log channel
  173.                 // $result = ['qwe' => 101];
  174.                 // $log = new Logger('store');
  175.                 // $log->pushHandler(new StreamHandler(__FILE__ . 'store.log'));
  176.                 // // add records to the log
  177.                 // $log->info('$result===>', $result);
  178.                 
  179.         // Событие с записью логов
  180.         // $event = new UserAuthorized([
  181.         //     'access_token' => 'test_1',
  182.         //     'refresh_token' => 'test_2',
  183.         // ]);
  184.         // $eventDispatcher->dispatch($event);
  185.         dd($arr);
  186.         $strategy = new DefaultStrategy(
  187.             $authId,
  188.             $refreshId,
  189.             $this->parameterBag->get('client_id'),
  190.             $this->parameterBag->get('client_secret'),
  191.         );
  192.         // $arr = [
  193.         //     $authId,
  194.         //     $refreshId,
  195.         //     $this->parameterBag->get('client_id'),
  196.         //     $this->parameterBag->get('client_secret'),
  197.         // ];
  198.         $domain 'b24-1kvq8n.bitrix24.by';
  199.         // $domain = $this->request->get('DOMAIN');
  200.         $client = new Client(
  201.             new GuzzleHttp\Client(),
  202.             $strategy,
  203.             (new GuzzleHttp\Psr7\Uri('https://' $domain))
  204.                 ->withPath('/rest')
  205.         );
  206.         $method 'placement.list';
  207.         $body = [];
  208.         $method 'im.message.add';
  209.         $body = [
  210.             // 'DIALOG_ID' => 8,
  211.             'DIALOG_ID' => 'chat2',
  212.             'MESSAGE' => date('Y-m-d H:i:s'),
  213.         ];
  214.         // $method = 'user.get';
  215.         // $body = ['ID' => 1];
  216.         try {
  217.             $result $client->call(new RestMethod($method$body));
  218.             $result json_decode($result->getBody()->__toString());
  219.         } catch (ClientException $th) {
  220.             $response json_decode($th->getResponse()->getBody()->__toString());
  221.             $result = [
  222.                 'message' => $th->getMessage(),
  223.                 'error' => $response->error,
  224.                 'error_description' => $response->error_description
  225.             ];
  226.         }
  227.         dd($result);
  228.         return $this->render('app/handler.html.twig', [
  229.             // 'controller_name' => 'AppController',
  230.             'test' => $this->parameterBag->get('client_id'),
  231.         ]);
  232.     }
  233.     
  234.     /**
  235.      * @Route("/test1", name="test1")
  236.      */
  237.     public function test1(AppRestCore $restCore)
  238.     {
  239.         $authId 'ec449763005fa298005fa2920000000100000751008ef78a60d8f2c08b1326a44b77fb';
  240.         $refreshId 'dcc3be63005fa298005fa2920000000100000780e8b8b2985c6e2fc961147f128237e5';
  241.         $authExpires 3600;
  242.         $domain 'https://b24-6wunou.bitrix24.by';
  243.         $restCore->setCredentials($authId$refreshId$authExpires$domain);
  244.         // 'app.info',
  245.         $resultBot $restCore->call(
  246.             'imbot.register',
  247.             [
  248.                 'CODE' => 'delayed.messages'// Строковой идентификатор бота, уникальный в рамках вашего приложения (обяз.)
  249.                 'TYPE' => 'S'// Тип бота, B - чат-бот, ответы поступают сразу, H - человек, ответы поступают с задержкой от 2-х до 10 секунд, O - чат-бот для Открытых линий, S - чат-бот с повышенными привилегиями (supervisor)
  250.                 'EVENT_HANDLER' => 'https://delayedmess.dev-bitrix.by/'// Ссылка на обработчик событий поступивших от сервера, см. Обработчики событий ниже (обяз).
  251.                 'OPENLINE' => 'Y'// Включение режима поддержки Открытых линий, можно не указывать, если TYPE = 'O'
  252.                 'CLIENT_ID' => ''// строковый идентификатор чат-бота, используется только в режиме Вебхуков
  253.                 'PROPERTIES' => [ // Личные данные чат-бота (обяз.)
  254.                     'NAME' => 'DelayedMessage'// Имя чат-бота (обязательное одно из полей NAME или LAST_NAME)
  255.                 ]
  256.             ]
  257.         );
  258.         if (isset($resultBot[0])) {
  259.             $botId $resultBot[0];
  260.         } else {
  261.             // some error message
  262.             // return
  263.         }
  264.         var_dump($botId);
  265.         $iconFileB64 base64_encode(file_get_contents($this->getParameter('kernel.project_dir') . '/public/assets/icon.png'));
  266.         // dd($iconFileB64);
  267.         // Возможно HASH нужно делать уникальным для каждого портала
  268.         $resultApp $restCore->call(
  269.             'imbot.app.register',
  270.             [
  271.                 'BOT_ID' => $botId// идентификатор бота владельца приложения для чата
  272.                 'CODE' => 'delayed_messages'// код приложения для чата
  273.                 'IFRAME' => 'https://delayedmess.dev-bitrix.by/frame',
  274.                 'IFRAME_WIDTH' => '591'// желаемая ширина фрейма. Минимальное значение - 250px
  275.                 'IFRAME_HEIGHT' => '420'// желаемая высота фрейма. Минимальное значение - 50px
  276.                 'HASH' => $this->parameterBag->get('iframe_hash_token'), // токен для доступа к вашему фрейму для проверки подписи, 32 символа.
  277.                 'ICON_FILE' => $iconFileB64// Иконка вашего приложения - base64
  278.                 'CONTEXT' => 'ALL'// контекст приложения
  279.                 'HIDDEN' => 'N'// скрытое приложение или нет
  280.                 'EXTRANET_SUPPORT' => 'N'// доступна ли команда пользователям экстранет, по умолчанию N
  281.                 'LIVECHAT_SUPPORT' => 'Y'// поддержка онлайн-чата
  282.                 'IFRAME_POPUP' => 'N'// iframe будет открыт с возможностью перемещения внутри мессенджера, переход между диалогами не будет закрывать такое окно.
  283.                 'LANG' => [ // массив переводов, желательно указывать как минимум для RU и EN
  284.                     ['LANGUAGE_ID' => 'ru''TITLE' => 'Отложенные сообщения''COPYRIGHT' => 'ManaoTeam'],
  285.                 ]
  286.             ]
  287.         );
  288.         $resultPlacement $restCore->call(
  289.             'placement.bind',
  290.             [
  291.                 'PLACEMENT' => 'REST_APP_URI',
  292.                 'HANDLER' => 'https://delayedmess.dev-bitrix.by/',
  293.             ]
  294.         );
  295.         dd($resultPlacement);
  296.     }
  297.     /**
  298.      * @Route("/test2", name="test2")
  299.      */
  300.     public function test2(): JsonResponse
  301.     {
  302.         $result = ['message' => 'ok'];
  303.         return new JsonResponse($result);
  304.     }
  305.     /**
  306.      * @Route("/test3", name="test3")
  307.      */
  308.     public function test3(): JsonResponse
  309.     {
  310.         // $arr = [
  311.         //     // $this->parameterBag->get('client_id'),
  312.         //     // $this->parameterBag->get('client_secret'),
  313.         // ];
  314.         // dd($arr);
  315.         
  316.         $log = new Logger('test3_log');
  317.         // $log->pushHandler(new StreamHandler('b24-api-client-debug.log', Logger::DEBUG));
  318.         
  319.         $client HttpClient::create(['http_version' => '2.0']);
  320.         $traceableClient = new \Symfony\Component\HttpClient\TraceableHttpClient($client);
  321.         $traceableClient->setLogger($log);
  322.         
  323.         $appProfile = new \Bitrix24\SDK\Core\Credentials\ApplicationProfile(
  324.             $this->parameterBag->get('client_id'),
  325.             $this->parameterBag->get('client_secret'),
  326.             new \Bitrix24\SDK\Core\Credentials\Scope(
  327.                 [
  328.                     'user',
  329.                     'im',
  330.                     'imbot',
  331.                     'placement',
  332.                 ]
  333.             )
  334.         );
  335.         $authId 'ec449763005fa298005fa2920000000100000751008ef78a60d8f2c08b1326a44b77fb';
  336.         $refreshId 'dcc3be63005fa298005fa2920000000100000780e8b8b2985c6e2fc961147f128237e5';
  337.         $token = new \Bitrix24\SDK\Core\Credentials\AccessToken(
  338.             $authId,
  339.             $refreshId,
  340.             3600
  341.             // 1672408508
  342.         );
  343.         $domain 'https://b24-6wunou.bitrix24.by';
  344.         $credentials = \Bitrix24\SDK\Core\Credentials\Credentials::createFromOAuth($token$appProfile$domain);
  345.         
  346.         $apiClient = new \Bitrix24\SDK\Core\ApiClient($credentials$traceableClient$log);
  347.         
  348.         $appBuilder = new CoreBuilder();
  349.         $app $appBuilder->withApiClient($apiClient)->withCredentials($credentials)->withEventDispatcher(new EventDispatcher())->withLogger($log)->build();
  350.         // $app = $appBuilder->withCredentials($credentials)->build();
  351.         $method 'app.info';
  352.         $body = [];
  353.         // $method = 'im.message.add';
  354.         // $body = [
  355.         //     // 'DIALOG_ID' => 8,
  356.         //     'DIALOG_ID' => 'chat2',
  357.         //     'MESSAGE' => date('Y-m-d H:i:s'),
  358.         // ];
  359.         try {
  360.             $res $app->call($method$body);
  361.             $result $res->getResponseData()->getResult();
  362.         } catch (\Throwable $th) {
  363.             $result = [
  364.                 'error' => true,
  365.                 'message' => $th->getMessage(),
  366.             ];
  367.         }
  368.         $log->debug('================================');
  369.         
  370.         dd($result);
  371.     }
  372.     /**
  373.      * @Route("/orm", name="orm")
  374.      */
  375.     public function orm(ManagerRegistry $registryValidatorInterface $validator): Response
  376.     {
  377.         // Тестирую ORM
  378.         // Добавить Домен
  379.         // $domain = new Domain();
  380.         // $domain->setUrl('https://test1.bitrix24.by');
  381.         // $domain->setTimeZone('+3');
  382.         // $domainRepository = new DomainRepository($registry);
  383.         // $domainRepository->add($domain, true);
  384.         
  385.         
  386.         $domainRepository = new DomainRepository($registry);
  387.         $arrDomains $domainRepository->findBy(['url' => 'https://b24-6wunou.bitrix24.by']);
  388.         // $arrDomains = $domainRepository->findAll();
  389.         // dd($arrDomains[0]);
  390.         // $user = new User();
  391.         // $user->setAuthId('333444');
  392.         // $user->setRefreshId('444333');
  393.         // $user->setAuthExpires(3600);
  394.         // $user->setDomain($arrDomains[0]);
  395.         // $userRepository = new UserRepository($registry);
  396.         // $userRepository->add($user, true);
  397.         $userRepository = new UserRepository($registry);
  398.         $arrUsers $userRepository->findAll();
  399.         // dump($arrUsers[0]);
  400.         // dd($arrUsers[0]->getDomain()->getUrl());
  401.         $timeZone = new DateTimeZone('+0000');
  402.         $date = new DateTime(date('Y-m-d H:i:00'), $timeZone);
  403.         $message = (new Message())->setUser($arrUsers[0])
  404.             ->setDialogId('chat2')
  405.             ->setMessage('сообщение 4')
  406.             ->setDate($date)
  407.             ->setTime($date);
  408.         // $errors = $validator->validate($message);
  409.         // dd($errors);
  410.         // if (count($errors) > 0) {
  411.         // }
  412.         // dd($message);
  413.         $messageRepository = new MessageRepository($registry);
  414.         // $arrMessages = $messageRepository->add($message, true);
  415.         $arrMessages $messageRepository->findAll();
  416.         $count $messageRepository->count([]);
  417.         dump($count);
  418.         dump($arrMessages);
  419.         
  420.         $arrMessages $messageRepository->findBy(
  421.             [
  422.                 'time' => (new DateTime('17:36:00')),
  423.                 'date' => (new DateTime('2023-01-27')),
  424.                 // 'time' => (new DateTime('17:27:01')),
  425.                 // 'date' => (new DateTime('2023-01-13')),
  426.             ],
  427.             null,
  428.             50
  429.         );
  430.         foreach ($arrMessages as $mess) {
  431.             dump($mess->getTime()->format('H:i:s'));
  432.         }
  433.         dump($arrMessages);
  434.         // dd('ORM test');
  435.         // return new Response('ORM test');
  436.         return $this->render('app/index.html.twig', []);
  437.     }
  438. }