src/Service/Backend.php line 297

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Model\User;
  4. use App\Utils\JwtUtils;
  5. use MiladRahimi\Jwt\Exceptions\InvalidKeyException;
  6. use Psr\Log\LoggerInterface;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  12. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  13. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  14. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  15. use Symfony\Component\Serializer\SerializerInterface;
  16. use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  17. use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
  18. use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
  19. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  20. use Symfony\Contracts\HttpClient\HttpClientInterface;
  21. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  22. use Symfony\Contracts\HttpClient\ResponseInterface;
  23. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  24. class Backend
  25. {
  26. //    use SessionUtils;
  27.     use JwtUtils;
  28.     protected $backend_url;
  29.     protected $cert_dir;
  30.     protected $api_url;
  31.     protected $proxy_api_url;
  32.     protected $serializer;
  33.     protected $client;
  34.     // User Backend
  35. //    const LOGIN = 'user/login'; // Used
  36.     const LOGIN 'api/login'// Used
  37.     const TOKEN 'user/token'// Not used
  38.     const ACTIVATE 'api/users/'// 'user/activate'; //Use for POST and PUT
  39.     const REACTIVATE 'api/emails/bubbles/' //Resend activation
  40.     const USER_UPDATE_ROLE 'user/role';
  41.     const GET_USER 'user/passwordReset'//Use for POST and PUT
  42.     const USER_RESET_PASSWORD_BY_EMAIL 'api/emails/reset-password';
  43.     const USER_RESET_PASSWORD 'api/users/reset-password';
  44.     // Bubble Backend
  45.     const BUBBLE 'api/bubbles';  // Used for POST new xx
  46.     const ACTIVATE_BUBBLE 'bubble/activate'// Used for PUT
  47.     const ADD_BUBBLE_USER 'api/bubbles/'// Used for POST xx
  48.     const DELETE_BUBBLE_USER 'bubble/user/'// Not used
  49.     const DELETE_BUBBLE_PROFILE 'api/bubbles/'//xx
  50.     const GET_BUBBLE_USER 'bubble/users';
  51. //    const GET_BUBBLE_PROFILES = 'bubble/profiles/all'; //xx
  52.     const GET_BUBBLE_PROFILES 'api/bubbles/';  // 'api/bubbles/:b_id/users/profiles'
  53.     const GET_BUBBLE_PROFILE_RIGTHS 'api/bubbles/'//Get one profile by profile id xx
  54.     const BUBBLE_PROFILES 'profiles/bubble/';
  55.     const BUBBLE_UPDATE_PROFILES 'api/bubbles/'//xx
  56.     const GET_VALIDATORS 'bubble/validators/print'// get the user validator of a bubble
  57.     const GET_USER_BY_PROFILE 'users/byProfile';
  58. //    const GET_ONE_PROFILE_RIGHTS = 'bubble/profiles/user/'; //To get the new profiles rights for one user
  59.     const GET_ONE_PROFILE_RIGHTS 'api/bubbles/';
  60. //    const GET_ALL_PROFILE_RIGHTS = 'bubble/profiles/default'; //To get the new profiles rights for all users xx
  61.     const GET_ALL_PROFILE_RIGHTS 'api/bubbles/';
  62.     // Site Backend
  63.     const ADD_SITE 'api/sites';  // POST  new site
  64. //    const SITE = 'site/';  // GET  get sites by Bubble ID
  65.     const SITES 'api/sites';  // GET  get sites by Bubble ID
  66.     const SITE_ADD_USER 'site/add/user'// Add user to a site
  67. //    const UPDATE_SITE = 'sites/'; // PUT site OLD
  68.     const UPDATE_SITE 'api/sites/';
  69.     const GET_SITE_BY_ID 'api/sites/'// GET site by ID
  70.     // Organization Backend
  71.     const ADD_ORGANIZATION 'organization'//POST new organization
  72.     const GET_ORGANIZATIONS 'organizations/'//GET organizations
  73.     const GET_ORGANIZATION_BY_ID 'organization/'//GET one organization by id
  74.     const UPDATE_ORGANIZATION 'organization/'//UPDATE organization
  75.     // Formation backend
  76.     const ADD_FORMATION 'formation'//POST new formation
  77.     const GET_FORMATIONS 'formations/b_id'//GET formation
  78.     const GET_FORMATION_BY_ID 'formation/'//GET one organization by id
  79.     //Structure backend
  80. //    const ADD_STRUCTURE = 'structure'; //POST new structure
  81.     const ADD_STRUCTURE 'api/structures'//POST new structure
  82.     const GET_STRUCTURE_ORG 'api/bubbles/'//'structures/organization/'; //GET structures org
  83.     const GET_STRUCTURE_FORM 'api/bubbles/'//GET structures form
  84.     const GET_STRUCTURE_CHILDREN 'api/structures/'//'structures/'; // GET structures children
  85.     const UPDATE_STRUCTURE 'api/structures/'//PUT structures
  86.     const GET_STRUCTURE_BY_ID 'api/structures/'//GET structure by ID
  87.     const GET_STRUCTURE_BY_B_ID 'api/structures/';
  88.     const DELETE_STRUCTURE 'api/structures';
  89.     // PrintJob Backend
  90.     const PRINT_REQUEST 'printJob/request';
  91.     const GET_PRINT_REQUEST 'printJob/requests';
  92. //    const GET_PRINT_LOGS = 'printJob/refreshPrintJob'; // get the print logs of BA and OP
  93.     const GET_PRINT_LOGS 'api/dashboards/';
  94.     const START_PRINT_JOB 'printJob/startPrint'//Start Print Job
  95.     const CRM_UPDATE_JOB 'api/job-orders/'// 'sites/job_orders/status/'; //Update job for crm
  96.     // Production Order
  97.     const ADD_PRODUCTION_ORDER 'api/production_orders'// POST production order
  98.     const GET_PRODUCTION_ORDER 'api/production_orders'// GET production order
  99.     const GET_EXTRA_PRODUCTION_ORDER 'productionOrder/children/'// GET production order
  100.     const PRODUCTION_ORDER_RECEIVED 'api/production_orders/received'// GET production order received
  101.     const GET_PO_BY_ID 'api/production_orders'//GET PO by ID
  102.     // Plan Backend
  103.     const GET_PLANS 'api/plans';
  104.     const POST_PLAN 'api/plans';
  105.     const VALIDATE_PLAN 'api/plans/'// to validate a plan as VPLAN
  106.     const ECO_MODEL 'api/plans/'// 'plan/eco_model'; // Add (POST), GET (GET) and UPDATE (PUT) an ecoModel
  107.     const PLAN_EM_TRANCHES 'plan/tranche';
  108.     const GET_PLAN 'api/plans/';
  109.     const GET_PLAN_PIECES 'api/plans/';
  110.     const PLAN_ADD_PIECE 'api/plans/'// 'plans/pieces';
  111.     const PLAN_DELETE_PIECE 'api/plans/'// Used for DELETE
  112.     const PLAN_ADD_INDUS 'plans/indus';
  113.     const PLAN_ATTACH_INDUS 'api/plans'//PATCH
  114. //    const PLAN_DELETE_INDUS = 'plans/indus';
  115.     const PLAN_DELETE_INDUS 'api/plans/'// 'api/industrials'; // 'plans/indus';
  116.     const PLAN_DELETE 'api/plans/'// "plans/";
  117.     const PLAN_UPDATE "plans/pieces";
  118.     const PLAN_PIECE_UPDATE 'api/plans/';
  119.     const NON_CATALOG_FILE 'api/prototype_orders';
  120.     const PLAN_MATERIALS 'api/materials/';
  121.     // Categorie
  122.     const GET_CATEGORIES 'api/categories/';
  123.     // Printer Backend
  124.     const ADD_PRINTER 'printer/';
  125. //    const GET_PRINTERS = 'sites/printers/'; // get the printers of a bubble
  126. //    const GET_PRINTER_PER_SITE = 'site/printers/' ; // get printers per site
  127.     const GET_PRINTERS 'api/printers';
  128.     const GET_PRINTER_PER_SITE 'api/printers/';
  129.     const GET_PRINTERS_BY_BULLE 'api/bubbles/';
  130.     const DELETE_SITE 'api/sites/';
  131.     // PRODUCTION PLANNING Backend
  132.     const GET_PLANNING 'api/planning';
  133.     const POST_PLANNING 'api/planning';
  134.     const DELETE_PLANNING 'api/planning/';
  135.     const UPDATE_PLANNING 'api/planning/';
  136.     // Job Order Backend
  137.     const GET_JOB_ORDERS 'api/job-orders'//'sites/job_orders/'; // get job order
  138.     const GET_JOB_ORDER_BY_ID 'api/job-orders/'//get one job order by id
  139.     const ADD_JOB_ORDER "api/job-orders"//POST job order
  140.     const GET_JOB_ORDERS_BY_STATUS "api/job-orders/controlled/job-order-status/"//GET job order by :job_order_status= All Error Finished
  141.     // INDUSTRIAL Backend
  142.     //const GET_INDUSTRIALS = 'industrials/'; // GET INDUSTRIALS OLD
  143.     const GET_INDUSTRIALS 'api/industrials/';
  144.     const POST_INDUSTRIAL 'api/industrials/'// POST INDUSTRIAL
  145.     // QUALITY CONTROL
  146.     const GET_QC 'api/quality_controls';
  147.     const SEND_QC 'api/quality_controls'//'printJob/qualityControl';
  148.     // const GET_QC_CRM = 'api/quality_controls/'; //'sites/job_orders/qualityControl/'; // get job order crm case
  149.     const GET_QC_CRM 'api/job-orders'//'sites/job_orders/qualityControl/'; // get job order crm case
  150.     // BILLS
  151.     const GET_BILLS 'bills/';
  152.     const GET_BILL_DETAILS 'bills/'// id en get
  153.     // API
  154. //    const GET_API_TOKENS = 'bubble/apikeys'; //xx
  155.     const GET_API_TOKENS 'api/bubbles/';
  156.     const BUBBLE_API_TOKEN "tokens/bubble";
  157. //    const SITE_API_TOKEN = "tokens/site";
  158.     // DASHBOARD
  159.     const GET_DASHBOARD_LOGS 'api/dashboards/'// 'dashboard/logs/'; // get the print logs of BA and OP
  160.     // STRIPE
  161.     const GET_STRIPE_PAYMENT_METHOD 'api/stripe/payment-method/';
  162.     const POST_CREATE_PAYMENT_INTENT 'api/stripe/create-payment-intent/';
  163.     const CONTACT_EMAIL 'api/emails/';
  164. //    private RequestStack $requestStack;
  165.     /**
  166.      * @param UrlGeneratorInterface $urlGenerator
  167.      * @param SerializerInterface $serializer
  168.      * @param HttpClientInterface $client
  169.      * @param ParameterBagInterface $param
  170.      * @param SessionInterface $session
  171.      * @param RequestStack $requestStack
  172.      * @param LoggerInterface $logger
  173.      */
  174.     public function __construct(
  175.         UrlGeneratorInterface $urlGenerator,
  176.         SerializerInterface $serializer,
  177.         HttpClientInterface $client,
  178.         ParameterBagInterface $param,
  179.         SessionInterface $session,
  180.         RequestStack $requestStack,
  181.         LoggerInterface $logger
  182.     ) {
  183.         $this->urlGenerator $urlGenerator;
  184.         $this->serializer $serializer;
  185.         $this->client$client;
  186.         $this->param $param;
  187.         $this->session $session;
  188.         $this->requestStack $requestStack;
  189.         $this->logger $logger;
  190.         $this->backend_url $param->get('backend_url');
  191.         $this->api_url $param->get('api_url');
  192.         $this->proxy_api_url $param->get('proxy_api_url');
  193.     }
  194.     /**
  195.      * When we need to make a call to the backend api, we should always use this function.
  196.      * It will make the call and log what we did
  197.      * It's all about control !
  198.      *
  199.      * @param string $reqType
  200.      * @param string $actionPath
  201.      * @param array $unloggedArguments
  202.      * @param array $loggedArguments
  203.      * @return ResponseInterface
  204.      * @throws InvalidKeyException
  205.      * @throws TransportExceptionInterface
  206.      */
  207.     public function apiRequestLogin(string $reqTypestring $actionPath, array $unloggedArguments, array $loggedArguments//: JsonResponse
  208.     {
  209.         $this->logger->info('Je rentre dans la fonction : apiRequestLogin de la classe : src/Service/Backend.php ');
  210.         $password $loggedArguments['u_pwd'];
  211.         $email $loggedArguments['u_email'];
  212.         // Credantials from login form
  213.         $credantials = [
  214.             'u_email' => $email,
  215.             'u_pwd' => $password
  216.         ];
  217.         $loggedArguments['verify_peer'] = false;
  218.         $jwtKeysDir $this->param->get('jwt.file.dir');
  219.         $token $this->generateFrontendJwtToken($jwtKeysDir$credantials);
  220.         if (!empty($unloggedArguments['x-token-keycloak']) && $unloggedArguments['x-token-keycloak'] != '') {
  221.             $headers =  [
  222.                 'Content-Type' => 'application/json',
  223.                 'Accept' => 'application/json',
  224.                 'Authorization' => 'Bearer ' $token,
  225.                 'x-token-keycloak' => $this->session->get('oidc_access_token'),
  226.                 'verify_peer' => false
  227.             ];
  228.         } else {
  229.             $headers = [
  230.                 'Content-Type' => 'application/json',
  231.                 'Accept' => 'application/json',
  232.                 'Authorization' => 'Bearer ' $token,
  233.                 'verify_peer' => false
  234.             ];
  235.         }
  236.         // Send request to backend API
  237.         $response $this->client->request($reqType$this->proxy_api_url $actionPath, [
  238.             'headers' => $headers,
  239.             'body' => json_encode($credantials),
  240.             'verify_peer' => false
  241.         ]);
  242.         $this->logger->debug(sprintf("[src/Service/Backend.php] Le status de la réponse du front api lors du logging : %s"$response->getStatusCode()));
  243.         return $response;
  244.     }
  245.     /**
  246.      * @param string $reqType
  247.      * @param string $actionPath
  248.      * @param array $unloggedArguments
  249.      * @param array $loggedArguments
  250.      * @return ResponseInterface
  251.      * @throws ClientExceptionInterface
  252.      * @throws RedirectionExceptionInterface
  253.      * @throws ServerExceptionInterface
  254.      * @throws TransportExceptionInterface
  255.      */
  256.     public function apiRequestNewUrls(string $reqTypestring $actionPath, array $unloggedArguments, array $loggedArguments)
  257.     {
  258.         $this->logger->info('[src/Service/Backend.php] Je rentre dans la fonction apiRequestNewUrls');
  259.         $session $this->requestStack->getMainRequest()->getSession();
  260.         $token $session->get('apiJwtToken');
  261.         $accessToken $session->get('oidc_access_token'); //  $session->get('keycloak_access_token');
  262.         if (!empty($accessToken) && $accessToken != '') {
  263.             $headers =  [
  264.                 'Content-Type' => 'application/json',
  265.                 'Accept' => 'application/json',
  266.                 'Authorization' => 'Bearer ' $token,
  267.                 'x-token-keycloak' => $accessToken
  268.             ];
  269.         } else {
  270.             $headers = [
  271.                 'Content-Type' => 'application/json',
  272.                 'Accept' => 'application/json',
  273.                 'Authorization' => 'Bearer ' $token
  274.             ];
  275.         }
  276.         $startTime microtime(true);
  277.         $response $this->client->request($reqType$this->proxy_api_url $actionPath, [
  278.             'headers' => $headers,
  279.             'body' => json_encode($loggedArguments),
  280.             'verify_peer' => false
  281.         ]);
  282.         $endTime microtime(true);
  283.         $executionTime $endTime $startTime;
  284.         $this->logger->info('[src/Service/Backend.php, METHOD : ' $reqType ', URL : ' $this->proxy_api_url $actionPath ', Response Time : ] ' $executionTime);
  285.         $this->logger->info('[src/Service/Backend.php - fonction: apiRequestNewUrls] Le status de la réponse pour chaque requête entre front api et le front web : ' $response->getStatusCode());
  286.         $this->logger->info('[src/Service/Backend.php - fonction: apiRequestNewUrls] La réponse pour chaque requête entre front api et le front web : ' $response->getContent(false));
  287.         return $response;
  288.     }
  289.     /**
  290.      * Activate user bulle
  291.      *
  292.      * @param string $reqType
  293.      * @param string $actionPath
  294.      * @param array $unloggedArguments
  295.      * @param array $loggedArguments
  296.      * @return ResponseInterface
  297.      * @throws ClientExceptionInterface
  298.      * @throws InvalidKeyException
  299.      * @throws RedirectionExceptionInterface
  300.      * @throws ServerExceptionInterface
  301.      * @throws TransportExceptionInterface
  302.      */
  303.     public function apiRequestAdmin(string $reqTypestring $actionPath, array $unloggedArguments, array $loggedArguments): ResponseInterface
  304.     {
  305.         $token $this->generateFrontendJwtToken(
  306.             $this->param->get('jwt.file.dir'), [
  307.             'u_email' => $loggedArguments['u_email'],
  308.             'u_pwd' => $loggedArguments['u_pwd']
  309.         ]);
  310.         $loggedArguments['verify_peer'] = false;
  311.         $headers = [
  312.             'Content-Type' => 'application/json',
  313.             'Accept' => 'application/json',
  314.             'Authorization' => 'Bearer ' $token,
  315.             'verify_peer' => false
  316.         ];
  317.         $response $this->client->request($reqType$this->proxy_api_url $actionPath, [
  318.             'headers' => $headers,
  319.             'body' => json_encode($loggedArguments),
  320.             'verify_peer' => false
  321.         ]);
  322.         $this->logger->debug(sprintf("[src/Service/Backend.php - fonction: apiRequestAdmin()] Le status de la réponse lors du logging du super admin : %s",  $response->getStatusCode()));
  323.         $this->logger->debug(sprintf("[src/Service/Backend.php - fonction: apiRequestAdmin()] La réponse  lors du logging du super admin : %s",  $response->getContent(false)));
  324.         return $response;
  325.     }
  326.     /**
  327.      * @param string $reqType
  328.      * @param string $actionPath
  329.      * @param array $unloggedArguments
  330.      * @param array $loggedArguments
  331.      * @return ResponseInterface
  332.      * @throws ClientExceptionInterface
  333.      * @throws InvalidKeyException
  334.      * @throws RedirectionExceptionInterface
  335.      * @throws ServerExceptionInterface
  336.      * @throws TransportExceptionInterface
  337.      */
  338.     public function apiRequestPW(string $reqTypestring $actionPath, array $unloggedArguments, array $loggedArguments): ResponseInterface
  339.     {
  340.         $token $this->generateFrontendJwtToken(
  341.             $this->param->get('jwt.file.dir'), [
  342.             'u_email' => $loggedArguments['u_email'],
  343.             'u_pwd' => $loggedArguments['u_pwd']
  344.         ]);
  345.         $response $this->getRequest($token$token$reqType$actionPath$loggedArguments);
  346.         $this->logger->debug(sprintf("[src/Service/Backend.php - fonction: apiRequestPW()] Le status de la réponse lors du changement de mot de passe : %s",  $response->getStatusCode()));
  347.         $this->logger->debug(sprintf("[src/Service/Backend.php - fonction: apiRequestPW()] La réponse  lors du changement de mot de passe : %s",  $response->getContent(false)));
  348.         return $response;
  349.     }
  350.     /**
  351.      * @param mixed $accessToken
  352.      * @param mixed $token
  353.      * @param string $reqType
  354.      * @param string $actionPath
  355.      * @param array $loggedArguments
  356.      * @return ResponseInterface
  357.      * @throws TransportExceptionInterface
  358.      */
  359.     public function getRequest(mixed $accessTokenmixed $tokenstring $reqTypestring $actionPath, array $loggedArguments): ResponseInterface
  360.     {
  361.         $headers = [
  362.             'Content-Type' => 'application/json',
  363.             'Accept' => 'application/json',
  364.             'Authorization' => 'Bearer ' $token
  365.         ];
  366.         return $this->client->request($reqType$this->proxy_api_url $actionPath, [
  367.             'headers' => $headers,
  368.             'body' => json_encode($loggedArguments),
  369.             'verify_peer' => false
  370.         ]);
  371.     }
  372. }