| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- <?php
- declare(strict_types=1);
- namespace App\Service\Security;
- use App\Entity\Organization\Organization;
- use App\Enum\Organization\SettingsProductEnum;
- use App\Service\Utils\Reflection;
- use Doctrine\Common\Cache\ApcuCache;
- use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
- 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.
- */
- class Module
- {
- public function __construct(
- readonly private Reflection $reflection,
- readonly private ParameterBagInterface $parameterBag
- ) {
- }
- /**
- * @todo activer le cache après que la fin de la migration.
- * Récupère tous les modules de l'organisation
- *
- * @return list<string>
- */
- 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());
- // }
- // Get modules from the organization settings
- $modulesBySettings = $this->getModuleBySettings($organization);
- // Get modules according to the conditions defined in the config
- $modulesByConditions = $this->getModulesByConditions($organization);
- // Get the modules from the owned product
- $product = $organization->getSettings()->getProduct();
- $modulesForProduct = $this->getModulesByProductConfiguration($product);
- // Controls that no modules where setup in different locations (this should not happen, and can lead to unexpected
- // behaviors whend serializing the OrganizationProfile)
- $intersection = array_merge(
- array_intersect($modulesBySettings, $modulesByConditions),
- array_intersect($modulesByConditions, $modulesForProduct),
- array_intersect($modulesBySettings, $modulesForProduct)
- );
- if (!empty($intersection)) {
- throw new \RuntimeException('Those modules are defined more than once : '.implode(', ', $intersection));
- }
- $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).
- *
- * @return list<string>
- *
- * @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.
- *
- * @return list<string>
- *
- * @see ModuleTest::testGetModulesByConditions()
- */
- public function getModulesByConditions(Organization $organization): array
- {
- $modulesByConditions = [];
- $modules = $this->parameterBag->get('opentalent.modulesbyconditions');
- foreach ($modules as $moduleName => $module) {
- try {
- $service = $module['conditions']['service'];
- $args = $service['args'] ?? [];
- $response = $this->reflection->dynamicInvokeServiceWithArgsAndMethod(
- $service['name'],
- $service['function'],
- array_merge([$organization], $args)
- );
- 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.
- *
- * @return list<string>|null
- *
- * @see ModuleTest::testGetModulesByProductConfiguration()
- */
- public function getModulesByProductConfiguration(SettingsProductEnum $product): ?array
- {
- $opentalentProducts = $this->parameterBag->get('opentalent.products');
- if (!array_key_exists($product->value, $opentalentProducts)) {
- throw new AccessDeniedHttpException(sprintf('The product %s does not exist !', $product->value));
- }
- $productConfig = $opentalentProducts[$product->value];
- $modules = $productConfig['modules'] ?? [];
- if (array_key_exists('extend', $productConfig)) {
- $modules = array_merge(
- $modules,
- $this->getModulesByProductConfiguration(SettingsProductEnum::from($productConfig['extend']))
- );
- unset($productConfig['extend']);
- }
- return $modules;
- }
- /**
- * Retourne le module possédant la resource passée en paramètre.
- */
- public function getModuleByResourceName(string $resource): int|string|null
- {
- $modules = $this->parameterBag->get('opentalent.modules');
- foreach ($modules as $module => $data) {
- if ($data['entities'] && in_array($resource, $data['entities'], true)) {
- return $module;
- }
- }
- return null;
- }
- }
|