Module.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\Security;
  4. use App\Entity\Organization\Organization;
  5. use App\Service\Utils\Parser;
  6. use App\Service\Utils\Reflection;
  7. use App\Test\Service\Security\ModuleTest;
  8. use Doctrine\Common\Cache\ApcuCache;
  9. use Symfony\Component\Config\FileLocator;
  10. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  11. /**
  12. * Class Module : classe gérant la récupération de l'ensemble des modules possédées par une organisation
  13. * @package App\Service\Security
  14. */
  15. class Module
  16. {
  17. private array $moduleConfig;
  18. private array $moduleByConditionsConfig;
  19. public function __construct(private Reflection $reflection, private Parser $parser, private string $opentalentConfig)
  20. {
  21. $this->moduleConfig = $this->getModuleConfig();
  22. $this->moduleByConditionsConfig = $this->getModuleByConditionsConfig();
  23. }
  24. /**
  25. * @todo activer le cache après que la fin de la migration.
  26. * Récupère tous les modules de l'oganisation
  27. * @param Organization $organization
  28. * @return array
  29. */
  30. public function getOrganizationModules(Organization $organization): array {
  31. // $cacheDriver = new ApcuCache();
  32. // //If the modules are all ready available inside the APCu cache
  33. // if($cacheDriver->contains('organization_modules_' . $organization->getId())){
  34. // return $cacheDriver->fetch('organization_modules_' . $organization->getId());
  35. // }
  36. $modulesBySettings = $this->getModuleBySettings($organization);
  37. $modulesByConditions = $this->getModulesByConditions($organization);
  38. $product = $organization->getSettings()->getProduct();
  39. $modulesForProduct = $this->getModulesByProductConfiguration($product);
  40. $organizationModules = array_merge_recursive($modulesForProduct, $modulesBySettings, $modulesByConditions);
  41. // //Keep the modules inside the APCu cache
  42. // $cacheDriver->save('organization_modules_' . $organization->getId(), $organizationModules, '86400');
  43. return $organizationModules;
  44. }
  45. /**
  46. * Récupère les modules disponibles dans les settings de l'organisation (Sms, Pes, etc)
  47. * @param Organization $organization
  48. * @return array
  49. * @see ModuleTest::testGetModuleBySettings()
  50. */
  51. public function getModuleBySettings(Organization $organization): array{
  52. $moduleByOptions = [];
  53. $modulesOptions = $organization->getSettings()->getModules();
  54. if(!empty($modulesOptions)){
  55. foreach($modulesOptions as $moduleOptionName => $moduleOptionValue){
  56. if($moduleOptionValue)
  57. $moduleByOptions[] = $moduleOptionName;
  58. }
  59. }
  60. return $moduleByOptions;
  61. }
  62. /**
  63. * Récupère les modules par conditions, grace au fichier modulebyconditions.yaml
  64. * @param Organization $organization
  65. * @return array
  66. * @see ModuleTest::testGetModulesByConditions()
  67. */
  68. public function getModulesByConditions(Organization $organization): array {
  69. $modulesByConditions = [];
  70. $modules = $this->moduleByConditionsConfig['opentalent']['modulesbyconditions'];
  71. foreach ($modules as $moduleName => $module) {
  72. try{
  73. $response = $this->reflection->dynamicInvokeServiceWithArgsAndMethod(
  74. $module["conditions"]["service"]["name"],
  75. $module["conditions"]["service"]["function"],
  76. array($organization)
  77. );
  78. if($response) {
  79. $modulesByConditions[] = $moduleName;
  80. }
  81. }catch (\Exception $exception){
  82. throw new \LogicException($exception->getMessage(), 400, $exception);
  83. }
  84. }
  85. return $modulesByConditions;
  86. }
  87. /**
  88. * Récupère les modules disponibles par produit grace au fichier products.yaml
  89. * @param string $product
  90. * @return array|null
  91. * @see ModuleTest::testGetModulesByProductConfiguration()
  92. */
  93. public function getModulesByProductConfiguration(string $product): ?array {
  94. $product = str_replace('-', '_', $product);
  95. if (!array_key_exists($product, $this->moduleConfig['opentalent']['products'])) {
  96. throw new AccessDeniedHttpException(sprintf('The product %s does not exist !', $product));
  97. }
  98. $productConfig = $this->moduleConfig['opentalent']['products'][$product];
  99. $modules = $productConfig['modules'] ?? [];
  100. if (array_key_exists('extend', $productConfig)) {
  101. $modules = array_merge($modules, $this->getModulesByProductConfiguration($productConfig['extend']));
  102. unset($productConfig['extend']);
  103. }
  104. return $modules;
  105. }
  106. /**
  107. * Parse et retourne le contenu du fichier products.yaml
  108. * @return array
  109. * @throws \Exception
  110. */
  111. private function getModuleConfig(): array{
  112. return $this->parser->yamlParser($this->opentalentConfig, 'products.yaml');
  113. }
  114. /**
  115. * Parse et retourne le contenu du fichier modulesbyconditions.yaml
  116. * @return array
  117. * @throws \Exception
  118. */
  119. private function getModuleByConditionsConfig(): array{
  120. return $this->parser->yamlParser($this->opentalentConfig, 'modulesbyconditions.yaml');
  121. }
  122. /**
  123. * Retourne le module possédant la resource passée en paramètre
  124. * @param string $resource
  125. * @return int|null|string
  126. */
  127. public function getModuleByResourceName(string $resource): ?string {
  128. $modules = $this->moduleConfig['opentalent']['modules'];
  129. foreach ($modules as $module => $data) {
  130. if ($data['entities'] && in_array($resource, $data['entities'], true)) {
  131. return $module;
  132. }
  133. }
  134. return null;
  135. }
  136. }