container = $container; $this->moduleConfig = $this->getModuleConfig(); $this->moduleByConditionsConfig = $this->getModuleByConditionsConfig(); } /** * Parse and return the products.yaml content * @return array */ private function getModuleConfig(): array{ $configDirectories = [self::OPENTALENT_CONFIG]; $fileLocator = new FileLocator($configDirectories); $yamlConfig = $fileLocator->locate('products.yaml', null, false)[0]; return Yaml::parseFile($yamlConfig); } /** * Parse and return the modulesbyconditions.yaml content * @return array */ private function getModuleByConditionsConfig(): array{ $configDirectories = [self::OPENTALENT_CONFIG]; $fileLocator = new FileLocator($configDirectories); $yamlConfig = $fileLocator->locate('modulesbyconditions.yaml', null, false)[0]; return Yaml::parseFile($yamlConfig); } /** * Get the module who enabled the access to the resource * @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; } /** * Get all the modules for one organization * @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; } /** * Get the module inside the organization's settings * @param Organization $organization * @return array */ 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; } /** * Get the modules by conditions, thanks to the modulebyconditions.yaml file * @param Organization $organization * @return array */ public function getModulesByConditions(Organization $organization): array { $modulesByConditions = []; $modules = $this->moduleByConditionsConfig['opentalent']['modulesbyconditions']; foreach ($modules as $moduleName => $module) { try{ $function = $this->container->get($module["conditions"]["service"]["name"]); $reflection = new \ReflectionClass(get_class($function)); $method = $reflection->getMethod($module["conditions"]["service"]["function"]); $response = $method->invokeArgs($function, array($organization)); if($response) { $modulesByConditions[] = $moduleName; } }catch (\Exception $exception){} } return $modulesByConditions; } /** * Get product configuration thanks to the products.yaml file * @param string $product * @return array|null */ 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; } }