| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- <?php
- declare(strict_types=1);
- namespace App\Service\Security;
- use App\Entity\Organization\Organization;
- use App\Service\Utils\Parser;
- use App\Service\Utils\Reflection;
- use App\Test\Service\Security\ModuleTest;
- use Doctrine\Common\Cache\ApcuCache;
- use Symfony\Component\Config\FileLocator;
- use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
- /**
- * Class Module : classe gérant la récupération de l'ensemble des modules possédées par une organisation
- * @package App\Service\Security
- */
- class Module
- {
- private array $moduleConfig;
- private array $moduleByConditionsConfig;
- public function __construct(private Reflection $reflection, private Parser $parser, private string $opentalentConfig)
- {
- $this->moduleConfig = $this->getModuleConfig();
- $this->moduleByConditionsConfig = $this->getModuleByConditionsConfig();
- }
- /**
- * @todo activer le cache après que la fin de la migration.
- * Récupère tous les modules de l'oganisation
- * @param Organization $organization
- * @return array
- */
- public function getOrganizationModules(Organization $organization): array {
- // $cacheDriver = new ApcuCache();
- // //If the modules are all ready available inside the APCu cache
- // if($cacheDriver->contains('organization_modules_' . $organization->getId())){
- // return $cacheDriver->fetch('organization_modules_' . $organization->getId());
- // }
- $modulesBySettings = $this->getModuleBySettings($organization);
- $modulesByConditions = $this->getModulesByConditions($organization);
- $product = $organization->getSettings()->getProduct();
- $modulesForProduct = $this->getModulesByProductConfiguration($product);
- $organizationModules = array_merge_recursive($modulesForProduct, $modulesBySettings, $modulesByConditions);
- // //Keep the modules inside the APCu cache
- // $cacheDriver->save('organization_modules_' . $organization->getId(), $organizationModules, '86400');
- return $organizationModules;
- }
- /**
- * Récupère les modules disponibles dans les settings de l'organisation (Sms, Pes, etc)
- * @param Organization $organization
- * @return array
- * @see ModuleTest::testGetModuleBySettings()
- */
- public function getModuleBySettings(Organization $organization): array{
- $moduleByOptions = [];
- $modulesOptions = $organization->getSettings()->getModules();
- if(!empty($modulesOptions)){
- foreach($modulesOptions as $moduleOptionName => $moduleOptionValue){
- if($moduleOptionValue)
- $moduleByOptions[] = $moduleOptionName;
- }
- }
- return $moduleByOptions;
- }
- /**
- * Récupère les modules par conditions, grace au fichier modulebyconditions.yaml
- * @param Organization $organization
- * @return array
- * @see ModuleTest::testGetModulesByConditions()
- */
- public function getModulesByConditions(Organization $organization): array {
- $modulesByConditions = [];
- $modules = $this->moduleByConditionsConfig['opentalent']['modulesbyconditions'];
- foreach ($modules as $moduleName => $module) {
- try{
- $response = $this->reflection->dynamicInvokeServiceWithArgsAndMethod(
- $module["conditions"]["service"]["name"],
- $module["conditions"]["service"]["function"],
- array($organization)
- );
- if($response) {
- $modulesByConditions[] = $moduleName;
- }
- }catch (\Exception $exception){
- throw new \LogicException($exception->getMessage(), 400, $exception);
- }
- }
- return $modulesByConditions;
- }
- /**
- * Récupère les modules disponibles par produit grace au fichier products.yaml
- * @param string $product
- * @return array|null
- * @see ModuleTest::testGetModulesByProductConfiguration()
- */
- public function getModulesByProductConfiguration(string $product): ?array {
- $product = str_replace('-', '_', $product);
- if (!array_key_exists($product, $this->moduleConfig['opentalent']['products'])) {
- throw new AccessDeniedHttpException(sprintf('The product %s does not exist !', $product));
- }
- $productConfig = $this->moduleConfig['opentalent']['products'][$product];
- $modules = $productConfig['modules'] ?? [];
- if (array_key_exists('extend', $productConfig)) {
- $modules = array_merge($modules, $this->getModulesByProductConfiguration($productConfig['extend']));
- unset($productConfig['extend']);
- }
- return $modules;
- }
- /**
- * Parse et retourne le contenu du fichier products.yaml
- * @return array
- * @throws \Exception
- */
- private function getModuleConfig(): array{
- return $this->parser->yamlParser($this->opentalentConfig, 'products.yaml');
- }
- /**
- * Parse et retourne le contenu du fichier modulesbyconditions.yaml
- * @return array
- * @throws \Exception
- */
- private function getModuleByConditionsConfig(): array{
- return $this->parser->yamlParser($this->opentalentConfig, 'modulesbyconditions.yaml');
- }
- /**
- * Retourne le module possédant la resource passée en paramètre
- * @param string $resource
- * @return int|null|string
- */
- public function getModuleByResourceName(string $resource): ?string {
- $modules = $this->moduleConfig['opentalent']['modules'];
- foreach ($modules as $module => $data) {
- if ($data['entities'] && in_array($resource, $data['entities'], true)) {
- return $module;
- }
- }
- return null;
- }
- }
|