| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- <?php
- namespace App\Service\Utils;
- use App\Entity\Organization\Organization;
- use Doctrine\Common\Cache\ApcuCache;
- use Symfony\Component\Config\FileLocator;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
- use Symfony\Component\Yaml\Yaml;
- class Module
- {
- const OPENTALENT_CONFIG = __DIR__.'/../../../config/opentalent';
- /** @var array */
- private $moduleConfig;
- /** @var array */
- private $moduleByConditionsConfig;
- /** @var ContainerInterface */
- private $container;
- public function __construct(ContainerInterface $container)
- {
- $this->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;
- }
- }
|