diff --git a/Makefile b/Makefile index 7aec792..1e10be2 100644 --- a/Makefile +++ b/Makefile @@ -28,3 +28,11 @@ codeception: .PHONY: ci ci: phpcs codeception phpstan + +.PHONY: clean +clean: + rm -Rf composer.lock + rm -Rf ./vendor + find ./tests/_output/ -not -name .gitignore -delete + rm -Rf src/Generated/* + rm -Rf src/Orm/* diff --git a/src/FondOfImpala/Shared/CompanyTypeRole/Transfer/company_type_role.transfer.xml b/src/FondOfImpala/Shared/CompanyTypeRole/Transfer/company_type_role.transfer.xml index 98029f4..67b69c0 100644 --- a/src/FondOfImpala/Shared/CompanyTypeRole/Transfer/company_type_role.transfer.xml +++ b/src/FondOfImpala/Shared/CompanyTypeRole/Transfer/company_type_role.transfer.xml @@ -1,7 +1,7 @@ + xsi:schemaLocation="spryker:transfer-01 https://static.spryker.com/transfer-01.xsd"> @@ -32,4 +32,17 @@ + + + + + + + + + + + + + diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Builder/CompanyRoleCriteriaFilterBuilder.php b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Builder/CompanyRoleCriteriaFilterBuilder.php deleted file mode 100644 index 0b341cb..0000000 --- a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Builder/CompanyRoleCriteriaFilterBuilder.php +++ /dev/null @@ -1,32 +0,0 @@ -setOrderBy(SpyCompanyRoleTableMap::COL_ID_COMPANY_ROLE) - ->setOrderDirection('asc'); - - $paginationTransfer = (new PaginationTransfer()) - ->setPage($page) - ->setMaxPerPage($maxPerPage); - - return (new CompanyRoleCriteriaFilterTransfer()) - ->setFilter($filterTransfer) - ->setPagination($paginationTransfer); - } -} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Builder/CompanyRoleCriteriaFilterBuilderInterface.php b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Builder/CompanyRoleCriteriaFilterBuilderInterface.php deleted file mode 100644 index 8768442..0000000 --- a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Builder/CompanyRoleCriteriaFilterBuilderInterface.php +++ /dev/null @@ -1,16 +0,0 @@ -createCompanyTypeNameFilter(), - $this->createPermissionIntersection(), - $this->createCompanyRoleCriteriaFilterBuilder(), + $this->createCompanyRoleReader(), $this->getCompanyRoleFacade(), - $this->getPermissionFacade(), + ); + } + + /** + * @return \FondOfImpala\Zed\CompanyTypeRole\Business\Reader\CompanyRoleReaderInterface + */ + protected function createCompanyRoleReader(): CompanyRoleReaderInterface + { + return new CompanyRoleReader( + $this->createNewPermissionReader(), + $this->createPermissionKeyMapper(), + $this->getRepository(), + ); + } + + /** + * @return \FondOfImpala\Zed\CompanyTypeRole\Business\Reader\PermissionReaderInterface + */ + protected function createNewPermissionReader(): NewPermissionReaderInterface + { + return new NewPermissionReader( + $this->createPermissionIntersection(), $this->getConfig(), + $this->getPermissionFacade(), ); } + /** + * @return \FondOfImpala\Zed\CompanyTypeRole\Business\Mapper\PermissionKeyMapperInterface + */ + protected function createPermissionKeyMapper(): PermissionKeyMapperInterface + { + return new PermissionKeyMapper(); + } + /** * @return \FondOfImpala\Zed\CompanyTypeRole\Business\Synchronizer\CompanyRoleSynchronizerInterface */ @@ -131,14 +161,6 @@ protected function createCompanyUserReader(): CompanyUserReaderInterface ); } - /** - * @return \FondOfImpala\Zed\CompanyTypeRole\Business\Filter\CompanyTypeNameFilterInterface - */ - protected function createCompanyTypeNameFilter(): CompanyTypeNameFilterInterface - { - return new CompanyTypeNameFilter($this->getCompanyTypeFacade()); - } - /** * @return \FondOfImpala\Zed\CompanyTypeRole\Business\Intersection\PermissionIntersectionInterface */ @@ -147,14 +169,6 @@ protected function createPermissionIntersection(): PermissionIntersectionInterfa return new PermissionIntersection(); } - /** - * @return \FondOfImpala\Zed\CompanyTypeRole\Business\Builder\CompanyRoleCriteriaFilterBuilderInterface - */ - protected function createCompanyRoleCriteriaFilterBuilder(): CompanyRoleCriteriaFilterBuilderInterface - { - return new CompanyRoleCriteriaFilterBuilder(); - } - /** * @return \FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyUserFacadeInterface */ diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Filter/CompanyTypeNameFilter.php b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Filter/CompanyTypeNameFilter.php deleted file mode 100644 index aa0507b..0000000 --- a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Filter/CompanyTypeNameFilter.php +++ /dev/null @@ -1,47 +0,0 @@ -companyTypeFacade = $companyTypeFacade; - } - - /** - * @param \Generated\Shared\Transfer\CompanyRoleTransfer $companyRoleTransfer - * - * @return string|null - */ - public function filterFromCompanyRole(CompanyRoleTransfer $companyRoleTransfer): ?string - { - $companyTransfer = $companyRoleTransfer->getCompany(); - - if ($companyTransfer === null || $companyTransfer->getFkCompanyType() === null) { - return null; - } - - $companyTypeTransfer = $this->companyTypeFacade->getCompanyTypeById( - (new CompanyTypeTransfer())->setIdCompanyType($companyTransfer->getFkCompanyType()), - ); - - if ($companyTypeTransfer === null) { - return null; - } - - return $companyTypeTransfer->getName(); - } -} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Filter/CompanyTypeNameFilterInterface.php b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Filter/CompanyTypeNameFilterInterface.php deleted file mode 100644 index 6c45e3d..0000000 --- a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Filter/CompanyTypeNameFilterInterface.php +++ /dev/null @@ -1,15 +0,0 @@ - + */ + public function fromPermissionCollection(PermissionCollectionTransfer $permissionCollectionTransfer): array + { + $permissionKeys = []; + + foreach ($permissionCollectionTransfer->getPermissions() as $permissionTransfer) { + $permissionKey = $this->fromPermission($permissionTransfer); + + if ($permissionKey === null) { + continue; + } + + $permissionKeys[] = $permissionKey; + } + + return array_unique($permissionKeys); + } + + /** + * @param \Generated\Shared\Transfer\PermissionTransfer $permissionTransfer + * + * @return string|null + */ + public function fromPermission(PermissionTransfer $permissionTransfer): ?string + { + return $permissionTransfer->getKey(); + } +} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Mapper/PermissionKeyMapperInterface.php b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Mapper/PermissionKeyMapperInterface.php new file mode 100644 index 0000000..645771a --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Mapper/PermissionKeyMapperInterface.php @@ -0,0 +1,25 @@ + + */ + public function fromPermissionCollection( + PermissionCollectionTransfer $permissionCollectionTransfer + ): array; + + /** + * @param \Generated\Shared\Transfer\PermissionTransfer $permissionTransfer + * + * @return string|null + */ + public function fromPermission(PermissionTransfer $permissionTransfer): ?string; +} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/CompanyRoleReader.php b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/CompanyRoleReader.php new file mode 100644 index 0000000..48b94f8 --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/CompanyRoleReader.php @@ -0,0 +1,107 @@ +permissionReader = $permissionReader; + $this->permissionKeyMapper = $permissionKeyMapper; + $this->repository = $repository; + } + + /** + * @return array<\Generated\Shared\Transfer\SyncableCompanyRoleTransfer> + */ + public function findSyncableCompanyRoles(): array + { + $syncableCompanyRoles = []; + $permissionSets = $this->permissionReader->getPermissionSets(); + + foreach ($permissionSets as $permissionSet) { + $syncableCompanyRole = $this->findSyncableCompanyRoleByPermissionSet($permissionSet); + + if ($syncableCompanyRole === null) { + continue; + } + + $syncableCompanyRoles[] = $syncableCompanyRole; + } + + return $syncableCompanyRoles; + } + + /** + * @param \Generated\Shared\Transfer\PermissionSetTransfer $permissionSetTransfer + * + * @return \Generated\Shared\Transfer\SyncableCompanyRoleTransfer|null + */ + public function findSyncableCompanyRoleByPermissionSet( + PermissionSetTransfer $permissionSetTransfer + ): ?SyncableCompanyRoleTransfer { + $companyType = $permissionSetTransfer->getCompanyType(); + $companyRoleName = $permissionSetTransfer->getCompanyRoleName(); + $permissionCollectionTransfer = $permissionSetTransfer->getEntries(); + + if ( + $companyType === null || + $companyRoleName === null || + $permissionCollectionTransfer === null || + $permissionCollectionTransfer->getPermissions()->count() < 1 + ) { + return null; + } + + $permissionKeys = $this->permissionKeyMapper->fromPermissionCollection($permissionCollectionTransfer); + $companyRolesIds = $this->repository->findSyncableCompanyRoleIds( + $companyType, + $companyRoleName, + $permissionKeys, + ); + + return (new SyncableCompanyRoleTransfer())->setIds($companyRolesIds) + ->setName($companyRoleName) + ->setCompanyType($companyType) + ->setPermissions($permissionCollectionTransfer); + } + + /** + * @param array $companyRoleIds + * + * @return \Generated\Shared\Transfer\CompanyRoleCollectionTransfer + */ + public function findCompanyRolesByCompanyRoleIds(array $companyRoleIds): CompanyRoleCollectionTransfer + { + return $this->repository->findCompanyRolesByCompanyRoleIds($companyRoleIds); + } +} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/CompanyRoleReaderInterface.php b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/CompanyRoleReaderInterface.php new file mode 100644 index 0000000..aa210e4 --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/CompanyRoleReaderInterface.php @@ -0,0 +1,31 @@ + + */ + public function findSyncableCompanyRoles(): array; + + /** + * @param \Generated\Shared\Transfer\PermissionSetTransfer $permissionSetTransfer + * + * @return \Generated\Shared\Transfer\SyncableCompanyRoleTransfer|null + */ + public function findSyncableCompanyRoleByPermissionSet( + PermissionSetTransfer $permissionSetTransfer + ): ?SyncableCompanyRoleTransfer; + + /** + * @param array $companyRoleIds + * + * @return \Generated\Shared\Transfer\CompanyRoleCollectionTransfer + */ + public function findCompanyRolesByCompanyRoleIds(array $companyRoleIds): CompanyRoleCollectionTransfer; +} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/PermissionReader.php b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/PermissionReader.php new file mode 100644 index 0000000..7aab9a0 --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/PermissionReader.php @@ -0,0 +1,79 @@ +permissionIntersection = $permissionIntersection; + $this->config = $config; + $this->permissionFacade = $permissionFacade; + } + + /** + * @return \Generated\Shared\Transfer\PermissionCollectionTransfer + */ + public function getPermissions(): PermissionCollectionTransfer + { + return $this->permissionFacade->findAll(); + } + + /** + * @return array<\Generated\Shared\Transfer\PermissionSetTransfer> + */ + public function getPermissionSets(): array + { + $permissionSets = []; + $allPermissionCollectionTransfer = $this->getPermissions(); + $groupedPermissionKeys = $this->config->getGroupedPermissionKeys(); + + foreach (array_keys($groupedPermissionKeys) as $companyTypeName) { + foreach (array_keys($groupedPermissionKeys[$companyTypeName]) as $companyRoleName) { + $permissionKeys = $groupedPermissionKeys[$companyTypeName][$companyRoleName]; + + $permissionSet = (new PermissionSetTransfer())->setCompanyType($companyTypeName) + ->setCompanyRoleName($companyRoleName) + ->setEntries( + $this->permissionIntersection->intersect( + $allPermissionCollectionTransfer, + $permissionKeys, + ), + ); + + $permissionSets[] = $permissionSet; + } + } + + return $permissionSets; + } +} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/PermissionReaderInterface.php b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/PermissionReaderInterface.php new file mode 100644 index 0000000..16cc00d --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/PermissionReaderInterface.php @@ -0,0 +1,18 @@ + + */ + public function getPermissionSets(): array; +} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Synchronizer/PermissionSynchronizer.php b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Synchronizer/PermissionSynchronizer.php index 398294b..a97bcf6 100644 --- a/src/FondOfImpala/Zed/CompanyTypeRole/Business/Synchronizer/PermissionSynchronizer.php +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Business/Synchronizer/PermissionSynchronizer.php @@ -2,36 +2,15 @@ namespace FondOfImpala\Zed\CompanyTypeRole\Business\Synchronizer; -use FondOfImpala\Zed\CompanyTypeRole\Business\Builder\CompanyRoleCriteriaFilterBuilderInterface; -use FondOfImpala\Zed\CompanyTypeRole\Business\Filter\CompanyTypeNameFilterInterface; -use FondOfImpala\Zed\CompanyTypeRole\Business\Intersection\PermissionIntersectionInterface; -use FondOfImpala\Zed\CompanyTypeRole\CompanyTypeRoleConfig; +use FondOfImpala\Zed\CompanyTypeRole\Business\Reader\CompanyRoleReaderInterface; use FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyRoleFacadeInterface; -use FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToPermissionFacadeInterface; -use Generated\Shared\Transfer\CompanyRoleCollectionTransfer; -use Generated\Shared\Transfer\PermissionCollectionTransfer; class PermissionSynchronizer implements PermissionSynchronizerInterface { /** - * @var int + * @var \FondOfImpala\Zed\CompanyTypeRole\Business\Reader\CompanyRoleReaderInterface */ - public const PAGINATION_MAX_PER_PAGE = 100; - - /** - * @var \FondOfImpala\Zed\CompanyTypeRole\Business\Filter\CompanyTypeNameFilterInterface - */ - protected $companyTypeNameFilter; - - /** - * @var \FondOfImpala\Zed\CompanyTypeRole\Business\Intersection\PermissionIntersectionInterface - */ - protected $permissionIntersection; - - /** - * @var \FondOfImpala\Zed\CompanyTypeRole\Business\Builder\CompanyRoleCriteriaFilterBuilderInterface - */ - protected $companyRoleCriteriaFilterBuilder; + protected $companyRoleReader; /** * @var \FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyRoleFacadeInterface @@ -39,37 +18,15 @@ class PermissionSynchronizer implements PermissionSynchronizerInterface protected $companyRoleFacade; /** - * @var \FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToPermissionFacadeInterface - */ - protected $permissionFacade; - - /** - * @var \FondOfImpala\Zed\CompanyTypeRole\CompanyTypeRoleConfig - */ - protected $config; - - /** - * @param \FondOfImpala\Zed\CompanyTypeRole\Business\Filter\CompanyTypeNameFilterInterface $companyTypeNameFilter - * @param \FondOfImpala\Zed\CompanyTypeRole\Business\Intersection\PermissionIntersectionInterface $permissionIntersection - * @param \FondOfImpala\Zed\CompanyTypeRole\Business\Builder\CompanyRoleCriteriaFilterBuilderInterface $companyRoleCriteriaFilterBuilder + * @param \FondOfImpala\Zed\CompanyTypeRole\Business\Reader\CompanyRoleReaderInterface $companyRoleReader * @param \FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyRoleFacadeInterface $companyRoleFacade - * @param \FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToPermissionFacadeInterface $permissionFacade - * @param \FondOfImpala\Zed\CompanyTypeRole\CompanyTypeRoleConfig $config */ public function __construct( - CompanyTypeNameFilterInterface $companyTypeNameFilter, - PermissionIntersectionInterface $permissionIntersection, - CompanyRoleCriteriaFilterBuilderInterface $companyRoleCriteriaFilterBuilder, - CompanyTypeRoleToCompanyRoleFacadeInterface $companyRoleFacade, - CompanyTypeRoleToPermissionFacadeInterface $permissionFacade, - CompanyTypeRoleConfig $config + CompanyRoleReaderInterface $companyRoleReader, + CompanyTypeRoleToCompanyRoleFacadeInterface $companyRoleFacade ) { - $this->companyTypeNameFilter = $companyTypeNameFilter; - $this->permissionIntersection = $permissionIntersection; - $this->companyRoleCriteriaFilterBuilder = $companyRoleCriteriaFilterBuilder; + $this->companyRoleReader = $companyRoleReader; $this->companyRoleFacade = $companyRoleFacade; - $this->permissionFacade = $permissionFacade; - $this->config = $config; } /** @@ -77,71 +34,24 @@ public function __construct( */ public function sync(): void { - $permissionCollectionTransfer = $this->permissionFacade->findAll(); - - if ($permissionCollectionTransfer->getPermissions()->count() === 0) { - return; - } - - $companyRoleCollectionTransfer = $this->companyRoleFacade->getCompanyRoleCollection( - $this->companyRoleCriteriaFilterBuilder->buildByPageAndMaxPerPage(1, 1), - ); + $syncableCompanyRoles = $this->companyRoleReader->findSyncableCompanyRoles(); - $paginationTransfer = $companyRoleCollectionTransfer->getPagination(); + foreach ($syncableCompanyRoles as $syncableCompanyRole) { + $syncableCompanyRoleIds = $syncableCompanyRole->getIds(); - if ($paginationTransfer === null || $paginationTransfer->getNbResults() === 0) { - return; - } - - $page = 1; - $total = $paginationTransfer->getNbResults(); - - while ($page <= ceil($total / static::PAGINATION_MAX_PER_PAGE)) { - $companyRoleCollectionTransfer = $this->companyRoleFacade->getCompanyRoleCollection( - $this->companyRoleCriteriaFilterBuilder->buildByPageAndMaxPerPage( - $page, - static::PAGINATION_MAX_PER_PAGE, - ), - ); - - $this->syncChunk($companyRoleCollectionTransfer, $permissionCollectionTransfer); - - $page++; - } - } - - /** - * @param \Generated\Shared\Transfer\CompanyRoleCollectionTransfer $companyRoleCollectionTransfer - * @param \Generated\Shared\Transfer\PermissionCollectionTransfer $permissionCollectionTransfer - * - * @return void - */ - protected function syncChunk( - CompanyRoleCollectionTransfer $companyRoleCollectionTransfer, - PermissionCollectionTransfer $permissionCollectionTransfer - ): void { - foreach ($companyRoleCollectionTransfer->getRoles() as $companyRoleTransfer) { - $companyRoleName = $companyRoleTransfer->getName(); - $companyTypeName = $this->companyTypeNameFilter->filterFromCompanyRole($companyRoleTransfer); - - if ($companyTypeName === null || $companyRoleName === null) { - continue; - } - - $permissionKeys = $this->config->getPermissionKeys($companyTypeName, $companyRoleName); - - if (count($permissionKeys) === 0) { + if (count($syncableCompanyRoleIds) < 1) { continue; } - $intersectedPermissionCollectionTransfer = $this->permissionIntersection->intersect( - $permissionCollectionTransfer, - $permissionKeys, - ); + foreach (array_chunk($syncableCompanyRoleIds, 100) as $chunk) { + $companyRoleCollectionTransfer = $this->companyRoleReader->findCompanyRolesByCompanyRoleIds($chunk); - $companyRoleTransfer->setPermissionCollection($intersectedPermissionCollectionTransfer); + foreach ($companyRoleCollectionTransfer->getRoles() as $companyRoleTransfer) { + $companyRoleTransfer->setPermissionCollection($syncableCompanyRole->getPermissions()); - $this->companyRoleFacade->update($companyRoleTransfer); + $this->companyRoleFacade->update($companyRoleTransfer); + } + } } } } diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleConfig.php b/src/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleConfig.php index 3f9e1ee..5bc9374 100644 --- a/src/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleConfig.php +++ b/src/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleConfig.php @@ -156,6 +156,14 @@ public function getPermissionKeys(string $companyTypeName, string $roleName): ar return $permissionKeys[$companyTypeName][$roleName]; } + /** + * @return array>> + */ + public function getGroupedPermissionKeys(): array + { + return $this->get(CompanyTypeRoleConstants::PERMISSION_KEYS, []); + } + /** * @param array $permissionKeys * diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleDependencyProvider.php b/src/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleDependencyProvider.php index c4ab3e1..9f403ee 100644 --- a/src/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleDependencyProvider.php +++ b/src/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleDependencyProvider.php @@ -7,10 +7,14 @@ use FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyTypeFacadeBridge; use FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyUserFacadeBridge; use FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToPermissionFacadeBridge; +use FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToPropelFacadeBridge; use Orm\Zed\CompanyUser\Persistence\SpyCompanyUserQuery; use Spryker\Zed\Kernel\AbstractBundleDependencyProvider; use Spryker\Zed\Kernel\Container; +/** + * @codeCoverageIgnore + */ class CompanyTypeRoleDependencyProvider extends AbstractBundleDependencyProvider { /** @@ -38,6 +42,11 @@ class CompanyTypeRoleDependencyProvider extends AbstractBundleDependencyProvider */ public const FACADE_COMPANY_USER = 'FACADE_COMPANY_USER'; + /** + * @var string + */ + public const FACADE_PROPEL = 'FACADE_PROPEL'; + /** * @var string */ @@ -149,7 +158,9 @@ public function providePersistenceLayerDependencies(Container $container): Conta { $container = parent::providePersistenceLayerDependencies($container); - return $this->addCompanyUserQuery($container); + $container = $this->addCompanyUserQuery($container); + + return $this->addPropelFacade($container); } /** @@ -165,4 +176,20 @@ protected function addCompanyUserQuery(Container $container): Container return $container; } + + /** + * @param \Spryker\Zed\Kernel\Container $container + * + * @return \Spryker\Zed\Kernel\Container + */ + protected function addPropelFacade(Container $container): Container + { + $container[static::FACADE_PROPEL] = static function (Container $container) { + return new CompanyTypeRoleToPropelFacadeBridge( + $container->getLocator()->propel()->facade(), + ); + }; + + return $container; + } } diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Dependency/Facade/CompanyTypeRoleToPropelFacadeBridge.php b/src/FondOfImpala/Zed/CompanyTypeRole/Dependency/Facade/CompanyTypeRoleToPropelFacadeBridge.php new file mode 100644 index 0000000..ff78beb --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Dependency/Facade/CompanyTypeRoleToPropelFacadeBridge.php @@ -0,0 +1,29 @@ +propelFacade = $propelFacade; + } + + /** + * @return string + */ + public function getCurrentDatabaseEngine(): string + { + return $this->propelFacade->getCurrentDatabaseEngine(); + } +} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Dependency/Facade/CompanyTypeRoleToPropelFacadeInterface.php b/src/FondOfImpala/Zed/CompanyTypeRole/Dependency/Facade/CompanyTypeRoleToPropelFacadeInterface.php new file mode 100644 index 0000000..eab3e73 --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Dependency/Facade/CompanyTypeRoleToPropelFacadeInterface.php @@ -0,0 +1,11 @@ +getProvidedDependency(CompanyTypeRoleDependencyProvider::PROPEL_QUERY_COMPANY_USER); } + + /** + * @return \FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToPropelFacadeInterface + */ + public function getPropelFacade(): CompanyTypeRoleToPropelFacadeInterface + { + return $this->getProvidedDependency(CompanyTypeRoleDependencyProvider::FACADE_PROPEL); + } } diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/CompanyTypeRoleRepository.php b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/CompanyTypeRoleRepository.php index 2266aeb..96297da 100644 --- a/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/CompanyTypeRoleRepository.php +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/CompanyTypeRoleRepository.php @@ -2,10 +2,17 @@ namespace FondOfImpala\Zed\CompanyTypeRole\Persistence; +use Generated\Shared\Transfer\CompanyRoleCollectionTransfer; +use Orm\Zed\CompanyRole\Persistence\Base\SpyCompanyRoleQuery; +use Orm\Zed\CompanyRole\Persistence\Map\SpyCompanyRoleTableMap; use Orm\Zed\CompanyUser\Persistence\Map\SpyCompanyUserTableMap; +use Orm\Zed\Permission\Persistence\Map\SpyPermissionTableMap; use Spryker\Zed\Kernel\Persistence\AbstractRepository; +use Spryker\Zed\Propel\PropelConfig; /** + * @codeCoverageIgnore + * * @method \FondOfImpala\Zed\CompanyTypeRole\Persistence\CompanyTypeRolePersistenceFactory getFactory() */ class CompanyTypeRoleRepository extends AbstractRepository implements CompanyTypeRoleRepositoryInterface @@ -17,7 +24,7 @@ class CompanyTypeRoleRepository extends AbstractRepository implements CompanyTyp */ public function findActiveCompanyUserIdsByIdCustomer(int $idCustomer): array { - /** @phpstan-ignore-next-line */ + // @phpstan-ignore-next-line return $this->getFactory()->getCompanyUserQuery() ->clear() ->filterByIsActive(true) @@ -26,4 +33,87 @@ public function findActiveCompanyUserIdsByIdCustomer(int $idCustomer): array ->find() ->toArray(); } + + /** + * @param string $companyTypeName + * @param string $companyRoleName + * @param array $permissionKeys + * + * @return array + */ + public function findSyncableCompanyRoleIds( + string $companyTypeName, + string $companyRoleName, + array $permissionKeys + ): array { + sort($permissionKeys); + + $havingClause = sprintf( + "string_agg(%s, ',' ORDER BY %s) != ?", + SpyPermissionTableMap::COL_KEY, + SpyPermissionTableMap::COL_KEY, + ); + + if ($this->getFactory()->getPropelFacade()->getCurrentDatabaseEngine() !== PropelConfig::DB_ENGINE_PGSQL) { + $havingClause = sprintf( + 'GROUP_CONCAT(%s ORDER BY %s) != ?', + SpyPermissionTableMap::COL_KEY, + SpyPermissionTableMap::COL_KEY, + ); + } + + // @phpstan-ignore-next-line + return SpyCompanyRoleQuery::create() + ->useSpyCompanyRoleToPermissionQuery() + ->innerJoinPermission() + ->endUse() + ->useCompanyQuery() + ->useFosCompanyTypeQuery() + ->filterByName($companyTypeName) + ->endUse() + ->endUse() + ->filterByName($companyRoleName) + ->orderBy(SpyCompanyRoleTableMap::COL_ID_COMPANY_ROLE) + ->select([SpyCompanyRoleTableMap::COL_ID_COMPANY_ROLE]) + ->groupByIdCompanyRole() + ->having($havingClause, implode(',', $permissionKeys)) + ->find() + ->toArray(); + } + + /** + * @param array $companyRoleIds + * + * @return \Generated\Shared\Transfer\CompanyRoleCollectionTransfer + */ + public function findCompanyRolesByCompanyRoleIds( + array $companyRoleIds + ): CompanyRoleCollectionTransfer { + $spyCompanyRoles = SpyCompanyRoleQuery::create() + ->filterByIdCompanyRole_In($companyRoleIds) + ->find(); + + $companyRoleCollectionTransfer = new CompanyRoleCollectionTransfer(); + + foreach ($spyCompanyRoles as $spyCompanyRole) { + $companyRoleTransfer = $this->getFactory() + ->createCompanyRoleMapper() + ->fromSpyCompanyRole($spyCompanyRole); + + $companyTransfer = $this->getFactory() + ->createCompanyMapper() + ->fromSpyCompanyRole($spyCompanyRole); + + $permissionCollectionTransfer = $this->getFactory() + ->createPermissionMapper() + ->fromSpyCompanyRole($spyCompanyRole); + + $companyRoleTransfer->setPermissionCollection($permissionCollectionTransfer) + ->setCompany($companyTransfer); + + $companyRoleCollectionTransfer->addRole($companyRoleTransfer); + } + + return $companyRoleCollectionTransfer; + } } diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/CompanyTypeRoleRepositoryInterface.php b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/CompanyTypeRoleRepositoryInterface.php index 9b5d1b9..58a546c 100644 --- a/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/CompanyTypeRoleRepositoryInterface.php +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/CompanyTypeRoleRepositoryInterface.php @@ -2,6 +2,8 @@ namespace FondOfImpala\Zed\CompanyTypeRole\Persistence; +use Generated\Shared\Transfer\CompanyRoleCollectionTransfer; + interface CompanyTypeRoleRepositoryInterface { /** @@ -10,4 +12,26 @@ interface CompanyTypeRoleRepositoryInterface * @return array */ public function findActiveCompanyUserIdsByIdCustomer(int $idCustomer): array; + + /** + * @param string $companyTypeName + * @param string $companyRoleName + * @param array $permissionKeys + * + * @return array + */ + public function findSyncableCompanyRoleIds( + string $companyTypeName, + string $companyRoleName, + array $permissionKeys + ): array; + + /** + * @param array $companyRoleIds + * + * @return \Generated\Shared\Transfer\CompanyRoleCollectionTransfer + */ + public function findCompanyRolesByCompanyRoleIds( + array $companyRoleIds + ): CompanyRoleCollectionTransfer; } diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/CompanyMapper.php b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/CompanyMapper.php new file mode 100644 index 0000000..1633e6e --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/CompanyMapper.php @@ -0,0 +1,25 @@ +getCompany(); + + return (new CompanyTransfer()) + ->fromArray($spyCompany->toArray(), true); + } +} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/CompanyMapperInterface.php b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/CompanyMapperInterface.php new file mode 100644 index 0000000..fc092ff --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/CompanyMapperInterface.php @@ -0,0 +1,16 @@ +fromArray($spyCompanyRole->toArray(), true); + } +} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/CompanyRoleMapperInterface.php b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/CompanyRoleMapperInterface.php new file mode 100644 index 0000000..dfe0eb4 --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/CompanyRoleMapperInterface.php @@ -0,0 +1,16 @@ +getPermissions() as $spyPermission) { + $permissionTransfer = (new PermissionTransfer()) + ->fromArray($spyPermission->toArray(), true); + + $permissionCollectionTransfer->addPermission($permissionTransfer); + } + + return $permissionCollectionTransfer; + } +} diff --git a/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/PermissionMapperInterface.php b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/PermissionMapperInterface.php new file mode 100644 index 0000000..0d11a16 --- /dev/null +++ b/src/FondOfImpala/Zed/CompanyTypeRole/Persistence/Mapper/PermissionMapperInterface.php @@ -0,0 +1,16 @@ +companyRoleCriteriaFilterBuilder = new CompanyRoleCriteriaFilterBuilder(); - } - - /** - * @return void - */ - public function testBuildByPageAndMaxPerPage(): void - { - $page = 1; - $maxPerPage = 10; - - $companyRoleCriteriaFilterTransfer = $this->companyRoleCriteriaFilterBuilder->buildByPageAndMaxPerPage( - $page, - $maxPerPage, - ); - - static::assertEquals( - $page, - $companyRoleCriteriaFilterTransfer->getPagination()->getPage(), - ); - - static::assertEquals( - $maxPerPage, - $companyRoleCriteriaFilterTransfer->getPagination()->getMaxPerPage(), - ); - - static::assertEquals( - 'asc', - $companyRoleCriteriaFilterTransfer->getFilter()->getOrderDirection(), - ); - - static::assertEquals( - SpyCompanyRoleTableMap::COL_ID_COMPANY_ROLE, - $companyRoleCriteriaFilterTransfer->getFilter()->getOrderBy(), - ); - } -} diff --git a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/CompanyTypeRoleBusinessFactoryTest.php b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/CompanyTypeRoleBusinessFactoryTest.php index a4c2729..b11c044 100644 --- a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/CompanyTypeRoleBusinessFactoryTest.php +++ b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/CompanyTypeRoleBusinessFactoryTest.php @@ -158,21 +158,18 @@ public function testCreatePermissionSynchronizer(): void $this->containerMock->expects(static::atLeastOnce()) ->method('has') ->withConsecutive( - [CompanyTypeRoleDependencyProvider::FACADE_COMPANY_TYPE], - [CompanyTypeRoleDependencyProvider::FACADE_COMPANY_ROLE], [CompanyTypeRoleDependencyProvider::FACADE_PERMISSION], + [CompanyTypeRoleDependencyProvider::FACADE_COMPANY_ROLE], )->willReturnOnConsecutiveCalls(true, true, true); $this->containerMock->expects(static::atLeastOnce()) ->method('get') ->withConsecutive( - [CompanyTypeRoleDependencyProvider::FACADE_COMPANY_TYPE], - [CompanyTypeRoleDependencyProvider::FACADE_COMPANY_ROLE], [CompanyTypeRoleDependencyProvider::FACADE_PERMISSION], + [CompanyTypeRoleDependencyProvider::FACADE_COMPANY_ROLE], )->willReturnOnConsecutiveCalls( - $this->companyTypeFacadeMock, - $this->companyRoleFacadeMock, $this->permissionFacadeMock, + $this->companyRoleFacadeMock, ); $permissionSynchronizer = $this->companyTypeRoleBusinessFactory->createPermissionSynchronizer(); diff --git a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Filter/CompanyTypeNameFilterTest.php b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Filter/CompanyTypeNameFilterTest.php deleted file mode 100644 index d4745b8..0000000 --- a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Filter/CompanyTypeNameFilterTest.php +++ /dev/null @@ -1,192 +0,0 @@ -companyTypeFacadeMock = $this->getMockBuilder(CompanyTypeRoleToCompanyTypeFacadeInterface::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->companyRoleTransferMock = $this->getMockBuilder(CompanyRoleTransfer::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->companyTransferMock = $this->getMockBuilder(CompanyTransfer::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->companyTypeTransferMock = $this->getMockBuilder(CompanyTypeTransfer::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->companyTypeNameFilter = new CompanyTypeNameFilter($this->companyTypeFacadeMock); - } - - /** - * @return void - */ - public function testFilterFromCompanyRole(): void - { - $fkCompanyType = 1; - $companyTypeName = 'foo bar'; - - $this->companyRoleTransferMock->expects(static::atLeastOnce()) - ->method('getCompany') - ->willReturn($this->companyTransferMock); - - $this->companyTransferMock->expects(static::atLeastOnce()) - ->method('getFkCompanyType') - ->willReturn($fkCompanyType); - - $this->companyTypeFacadeMock->expects(static::atLeastOnce()) - ->method('getCompanyTypeById') - ->with( - static::callback( - static function (CompanyTypeTransfer $companyTypeTransfer) use ($fkCompanyType) { - return $companyTypeTransfer->getIdCompanyType() === $fkCompanyType; - }, - ), - )->willReturn($this->companyTypeTransferMock); - - $this->companyTypeTransferMock->expects(static::atLeastOnce()) - ->method('getName') - ->willReturn($companyTypeName); - - static::assertEquals( - $companyTypeName, - $this->companyTypeNameFilter->filterFromCompanyRole($this->companyRoleTransferMock), - ); - } - - /** - * @return void - */ - public function testFilterFromCompanyRoleWithoutCompany(): void - { - $this->companyRoleTransferMock->expects(static::atLeastOnce()) - ->method('getCompany') - ->willReturn(null); - - $this->companyTransferMock->expects(static::never()) - ->method('getFkCompanyType'); - - $this->companyTypeFacadeMock->expects(static::never()) - ->method('getCompanyTypeById'); - - $this->companyTypeTransferMock->expects(static::never()) - ->method('getName'); - - static::assertEquals( - null, - $this->companyTypeNameFilter->filterFromCompanyRole($this->companyRoleTransferMock), - ); - } - - /** - * @return void - */ - public function testFilterFromCompanyRoleWithoutCompanyType(): void - { - $fkCompanyType = 1; - - $this->companyRoleTransferMock->expects(static::atLeastOnce()) - ->method('getCompany') - ->willReturn($this->companyTransferMock); - - $this->companyTransferMock->expects(static::atLeastOnce()) - ->method('getFkCompanyType') - ->willReturn($fkCompanyType); - - $this->companyTypeFacadeMock->expects(static::atLeastOnce()) - ->method('getCompanyTypeById') - ->with( - static::callback( - static function (CompanyTypeTransfer $companyTypeTransfer) use ($fkCompanyType) { - return $companyTypeTransfer->getIdCompanyType() === $fkCompanyType; - }, - ), - )->willReturn(null); - - $this->companyTypeTransferMock->expects(static::never()) - ->method('getName'); - - static::assertEquals( - null, - $this->companyTypeNameFilter->filterFromCompanyRole($this->companyRoleTransferMock), - ); - } - - /** - * @return void - */ - public function testFilterFromCompanyRoleWithoutCompanyTypeName(): void - { - $fkCompanyType = 1; - - $this->companyRoleTransferMock->expects(static::atLeastOnce()) - ->method('getCompany') - ->willReturn($this->companyTransferMock); - - $this->companyTransferMock->expects(static::atLeastOnce()) - ->method('getFkCompanyType') - ->willReturn($fkCompanyType); - - $this->companyTypeFacadeMock->expects(static::atLeastOnce()) - ->method('getCompanyTypeById') - ->with( - static::callback( - static function (CompanyTypeTransfer $companyTypeTransfer) use ($fkCompanyType) { - return $companyTypeTransfer->getIdCompanyType() === $fkCompanyType; - }, - ), - )->willReturn($this->companyTypeTransferMock); - - $this->companyTypeTransferMock->expects(static::atLeastOnce()) - ->method('getName') - ->willReturn(null); - - static::assertEquals( - null, - $this->companyTypeNameFilter->filterFromCompanyRole($this->companyRoleTransferMock), - ); - } -} diff --git a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Mapper/PermissionKeyMapperTest.php b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Mapper/PermissionKeyMapperTest.php new file mode 100644 index 0000000..831e68f --- /dev/null +++ b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Mapper/PermissionKeyMapperTest.php @@ -0,0 +1,81 @@ +permissionCollectionTransferMock = $this->getMockBuilder(PermissionCollectionTransfer::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->permissionTransferMock = $this->getMockBuilder(PermissionTransfer::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->invalidPermissionTransferMock = $this->getMockBuilder(PermissionTransfer::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->permissionKeyMapper = new PermissionKeyMapper(); + } + + /** + * @return void + */ + public function testFromPermissionCollection(): void + { + $permissionKeys = ['foo']; + + $this->permissionCollectionTransferMock->expects(static::atLeastOnce()) + ->method('getPermissions') + ->willReturn(new ArrayObject([ + $this->invalidPermissionTransferMock, + $this->permissionTransferMock, + ])); + + $this->invalidPermissionTransferMock->expects(static::atLeastOnce()) + ->method('getKey') + ->willReturn(null); + + $this->permissionTransferMock->expects(static::atLeastOnce()) + ->method('getKey') + ->willReturn($permissionKeys[0]); + + static::assertEquals( + $permissionKeys, + $this->permissionKeyMapper->fromPermissionCollection($this->permissionCollectionTransferMock), + ); + } +} diff --git a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Model/CompanyRoleAssignerTest.php b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Model/CompanyRoleAssignerTest.php index c5130e6..8778062 100644 --- a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Model/CompanyRoleAssignerTest.php +++ b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Model/CompanyRoleAssignerTest.php @@ -64,7 +64,7 @@ class CompanyRoleAssignerTest extends Unit protected $availablePermissionCollectionMock; /** - * @var \ArrayObject|\Generated\Shared\Transfer\PermissionTransfer[]|\PHPUnit\Framework\MockObject\MockObject[] + * @var \ArrayObject<\Generated\Shared\Transfer\PermissionTransfer|\PHPUnit\Framework\MockObject\MockObject> */ protected $availablePermissionMocks; @@ -74,7 +74,7 @@ class CompanyRoleAssignerTest extends Unit protected $companyRolePermissionCollectionMock; /** - * @var \ArrayObject|\Generated\Shared\Transfer\PermissionTransfer[]|\PHPUnit\Framework\MockObject\MockObject[] + * @var \ArrayObject<\Generated\Shared\Transfer\PermissionTransfer|\PHPUnit\Framework\MockObject\MockObject> */ protected $companyRolePermissionMocks; diff --git a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/CompanyRoleReaderTest.php b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/CompanyRoleReaderTest.php new file mode 100644 index 0000000..b8d07b0 --- /dev/null +++ b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/CompanyRoleReaderTest.php @@ -0,0 +1,185 @@ +permissionReaderMock = $this->getMockBuilder(PermissionReaderInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->permissionKeyMapperMock = $this->getMockBuilder(PermissionKeyMapperInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->repositoryMock = $this->getMockBuilder(CompanyTypeRoleRepositoryInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->companyRoleCollectionTransferMock = $this->getMockBuilder(CompanyRoleCollectionTransfer::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->permissionSetTransferMock = $this->getMockBuilder(PermissionSetTransfer::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->invalidPermissionSetTransferMock = $this->getMockBuilder(PermissionSetTransfer::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->permissionCollectionTransferMock = $this->getMockBuilder(PermissionCollectionTransfer::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->permissionTransferMock = $this->getMockBuilder(PermissionTransfer::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->companyRoleReader = new CompanyRoleReader( + $this->permissionReaderMock, + $this->permissionKeyMapperMock, + $this->repositoryMock, + ); + } + + /** + * @return void + */ + public function testFindCompanyRolesByCompanyRoleIds(): void + { + $companyRoleIds = [1, 2, 3]; + + $this->repositoryMock->expects(static::atLeastOnce()) + ->method('findCompanyRolesByCompanyRoleIds') + ->with($companyRoleIds) + ->willReturn($this->companyRoleCollectionTransferMock); + + static::assertEquals( + $this->companyRoleCollectionTransferMock, + $this->companyRoleReader->findCompanyRolesByCompanyRoleIds($companyRoleIds), + ); + } + + /** + * @return void + */ + public function testFindSyncableCompanyRoles(): void + { + $companyType = 'foo'; + $companyRoleName = 'bar'; + $permissionKeys = ['key1']; + $companyRoleIds = [1, 2, 4]; + + $this->permissionReaderMock->expects(static::atLeastOnce()) + ->method('getPermissionSets') + ->willReturn([$this->permissionSetTransferMock, $this->invalidPermissionSetTransferMock]); + + $this->invalidPermissionSetTransferMock->expects(static::atLeastOnce()) + ->method('getCompanyType') + ->willReturn(null); + + $this->invalidPermissionSetTransferMock->expects(static::atLeastOnce()) + ->method('getCompanyRoleName') + ->willReturn($companyRoleName); + + $this->invalidPermissionSetTransferMock->expects(static::atLeastOnce()) + ->method('getEntries') + ->willReturn(null); + + $this->permissionSetTransferMock->expects(static::atLeastOnce()) + ->method('getCompanyType') + ->willReturn($companyType); + + $this->permissionSetTransferMock->expects(static::atLeastOnce()) + ->method('getCompanyRoleName') + ->willReturn($companyRoleName); + + $this->permissionSetTransferMock->expects(static::atLeastOnce()) + ->method('getEntries') + ->willReturn($this->permissionCollectionTransferMock); + + $this->permissionCollectionTransferMock->expects(static::atLeastOnce()) + ->method('getPermissions') + ->willReturn(new ArrayObject([$this->permissionTransferMock])); + + $this->permissionKeyMapperMock->expects(static::atLeastOnce()) + ->method('fromPermissionCollection') + ->with($this->permissionCollectionTransferMock) + ->willReturn($permissionKeys); + + $this->repositoryMock->expects(static::atLeastOnce()) + ->method('findSyncableCompanyRoleIds') + ->with($companyType, $companyRoleName, $permissionKeys) + ->willReturn($companyRoleIds); + + $syncableCompanyRoles = $this->companyRoleReader->findSyncableCompanyRoles(); + + static::assertCount(1, $syncableCompanyRoles); + static::assertEquals($companyType, $syncableCompanyRoles[0]->getCompanyType()); + static::assertEquals($companyRoleName, $syncableCompanyRoles[0]->getName()); + static::assertEquals($companyRoleIds, $syncableCompanyRoles[0]->getIds()); + static::assertEquals($this->permissionCollectionTransferMock, $syncableCompanyRoles[0]->getPermissions()); + } +} diff --git a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/PermissionReaderTest.php b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/PermissionReaderTest.php new file mode 100644 index 0000000..36f911e --- /dev/null +++ b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Reader/PermissionReaderTest.php @@ -0,0 +1,120 @@ +permissionIntersectionMock = $this->getMockBuilder(PermissionIntersectionInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->configMock = $this->getMockBuilder(CompanyTypeRoleConfig::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->permissionFacadeMock = $this->getMockBuilder(CompanyTypeRoleToPermissionFacadeInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->permissionCollectionTransferMock = $this->getMockBuilder(PermissionCollectionTransfer::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->permissionReader = new PermissionReader( + $this->permissionIntersectionMock, + $this->configMock, + $this->permissionFacadeMock, + ); + } + + /** + * @return void + */ + public function testGetPermissions(): void + { + $this->permissionFacadeMock->expects(static::atLeastOnce()) + ->method('findAll') + ->willReturn($this->permissionCollectionTransferMock); + + static::assertEquals( + $this->permissionCollectionTransferMock, + $this->permissionReader->getPermissions(), + ); + } + + /** + * @return void + */ + public function testGetPermissionSets(): void + { + $companyType = 'foo'; + $companyRoleName = 'bar'; + + $groupedPermissionKeys = [ + $companyType => [ + $companyRoleName => [ + 'key1', + 'key3', + ], + ], + ]; + + $this->configMock->expects(static::atLeastOnce()) + ->method('getGroupedPermissionKeys') + ->willReturn($groupedPermissionKeys); + + $this->permissionFacadeMock->expects(static::atLeastOnce()) + ->method('findAll') + ->willReturn($this->permissionCollectionTransferMock); + + $this->permissionIntersectionMock->expects(static::atLeastOnce()) + ->method('intersect') + ->with($this->permissionCollectionTransferMock, $groupedPermissionKeys[$companyType][$companyRoleName]) + ->willReturn($this->permissionCollectionTransferMock); + + $permissionSets = $this->permissionReader->getPermissionSets(); + + static::assertCount(1, $permissionSets); + static::assertEquals($companyType, $permissionSets[0]->getCompanyType()); + static::assertEquals($companyRoleName, $permissionSets[0]->getCompanyRoleName()); + static::assertEquals($this->permissionCollectionTransferMock, $permissionSets[0]->getEntries()); + } +} diff --git a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Synchronizer/PermissionSynchronizerTest.php b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Synchronizer/PermissionSynchronizerTest.php index 1001527..5fdd057 100644 --- a/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Synchronizer/PermissionSynchronizerTest.php +++ b/tests/FondOfImpala/Zed/CompanyTypeRole/Business/Synchronizer/PermissionSynchronizerTest.php @@ -4,35 +4,19 @@ use ArrayObject; use Codeception\Test\Unit; -use FondOfImpala\Zed\CompanyTypeRole\Business\Builder\CompanyRoleCriteriaFilterBuilderInterface; -use FondOfImpala\Zed\CompanyTypeRole\Business\Filter\CompanyTypeNameFilterInterface; -use FondOfImpala\Zed\CompanyTypeRole\Business\Intersection\PermissionIntersectionInterface; -use FondOfImpala\Zed\CompanyTypeRole\CompanyTypeRoleConfig; +use FondOfImpala\Zed\CompanyTypeRole\Business\Reader\CompanyRoleReaderInterface; use FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyRoleFacadeInterface; -use FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToPermissionFacadeInterface; use Generated\Shared\Transfer\CompanyRoleCollectionTransfer; -use Generated\Shared\Transfer\CompanyRoleCriteriaFilterTransfer; use Generated\Shared\Transfer\CompanyRoleTransfer; -use Generated\Shared\Transfer\PaginationTransfer; use Generated\Shared\Transfer\PermissionCollectionTransfer; -use Generated\Shared\Transfer\PermissionTransfer; +use Generated\Shared\Transfer\SyncableCompanyRoleTransfer; class PermissionSynchronizerTest extends Unit { - /** - * @var \FondOfImpala\Zed\CompanyTypeRole\Business\Filter\CompanyTypeNameFilterInterface|\PHPUnit\Framework\MockObject\MockObject - */ - protected $companyTypeNameFilterMock; - - /** - * @var \FondOfImpala\Zed\CompanyTypeRole\Business\Intersection\PermissionIntersectionInterface|\PHPUnit\Framework\MockObject\MockObject - */ - protected $permissionIntersectionMock; - - /** - * @var \FondOfImpala\Zed\CompanyTypeRole\Business\Builder\CompanyRoleCriteriaFilterBuilderInterface&\PHPUnit\Framework\MockObject\MockObject|\PHPUnit\Framework\MockObject\MockObject - */ - protected $companyRoleCriteriaFilterBuilderMock; + /** + * @var (\FondOfImpala\Zed\CompanyTypeRole\Business\Reader\CompanyRoleReaderInterface&\PHPUnit\Framework\MockObject\MockObject)|\PHPUnit\Framework\MockObject\MockObject + */ + protected $companyRoleReaderMock; /** * @var \FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyRoleFacadeInterface|\PHPUnit\Framework\MockObject\MockObject @@ -40,49 +24,29 @@ class PermissionSynchronizerTest extends Unit protected $companyRoleFacadeMock; /** - * @var \FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToPermissionFacadeInterface|\PHPUnit\Framework\MockObject\MockObject + * @var (\Generated\Shared\Transfer\SyncableCompanyRoleTransfer&\PHPUnit\Framework\MockObject\MockObject)|\PHPUnit\Framework\MockObject\MockObject */ - protected $permissionFacadeMock; - - /** - * @var \FondOfImpala\Zed\CompanyTypeRole\CompanyTypeRoleConfig|\PHPUnit\Framework\MockObject\MockObject - */ - protected $configMock; - - /** - * @var \Generated\Shared\Transfer\PermissionCollectionTransfer|\PHPUnit\Framework\MockObject\MockObject - */ - protected $permissionCollectionTransferMock; + protected $syncableCompanyRoleTransfer; /** - * @var array<\PHPUnit\Framework\MockObject\MockObject>|array<\Generated\Shared\Transfer\PermissionTransfer> + * @var (\Generated\Shared\Transfer\SyncableCompanyRoleTransfer&\PHPUnit\Framework\MockObject\MockObject)|\PHPUnit\Framework\MockObject\MockObject */ - protected $permissionTransferMocks; + protected $invalidSyncableCompanyRoleTransfer; /** - * @var array<\Generated\Shared\Transfer\CompanyRoleCollectionTransfer|\PHPUnit\Framework\MockObject\MockObject> + * @var (\Generated\Shared\Transfer\CompanyRoleCollectionTransfer&\PHPUnit\Framework\MockObject\MockObject)|\PHPUnit\Framework\MockObject\MockObject */ - protected $companyRoleCollectionTransferMocks; + protected $companyRoleCollectionTransferMock; /** - * @var array<\PHPUnit\Framework\MockObject\MockObject>|array<\Generated\Shared\Transfer\CompanyRoleTransfer> + * @var (\Generated\Shared\Transfer\PermissionCollectionTransfer&\PHPUnit\Framework\MockObject\MockObject)|\PHPUnit\Framework\MockObject\MockObject */ - protected $companyRoleTransferMocks; - - /** - * @var \Generated\Shared\Transfer\PermissionCollectionTransfer|\PHPUnit\Framework\MockObject\MockObject - */ - protected $intersectedPermissionCollectionTransferMock; - - /** - * @var array<\Generated\Shared\Transfer\CompanyRoleCriteriaFilterTransfer|\PHPUnit\Framework\MockObject\MockObject> - */ - protected $companyRoleCriteriaFilterTransferMocks; + protected $permissionCollectionTransferMock; /** - * @var \Generated\Shared\Transfer\PaginationTransfer&\PHPUnit\Framework\MockObject\MockObject|\PHPUnit\Framework\MockObject\MockObject + * @var (\Generated\Shared\Transfer\CompanyRoleTransfer&\PHPUnit\Framework\MockObject\MockObject)|\PHPUnit\Framework\MockObject\MockObject */ - protected $paginationTransferMock; + protected $companyRoleTransferMock; /** * @var \FondOfImpala\Zed\CompanyTypeRole\Business\Synchronizer\PermissionSynchronizer @@ -96,15 +60,7 @@ protected function _before(): void { parent::_before(); - $this->companyTypeNameFilterMock = $this->getMockBuilder(CompanyTypeNameFilterInterface::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->permissionIntersectionMock = $this->getMockBuilder(PermissionIntersectionInterface::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->companyRoleCriteriaFilterBuilderMock = $this->getMockBuilder(CompanyRoleCriteriaFilterBuilderInterface::class) + $this->companyRoleReaderMock = $this->getMockBuilder(CompanyRoleReaderInterface::class) ->disableOriginalConstructor() ->getMock(); @@ -112,69 +68,30 @@ protected function _before(): void ->disableOriginalConstructor() ->getMock(); - $this->permissionFacadeMock = $this->getMockBuilder(CompanyTypeRoleToPermissionFacadeInterface::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->configMock = $this->getMockBuilder(CompanyTypeRoleConfig::class) + $this->syncableCompanyRoleTransfer = $this->getMockBuilder(SyncableCompanyRoleTransfer::class) ->disableOriginalConstructor() ->getMock(); - $this->permissionCollectionTransferMock = $this->getMockBuilder(PermissionCollectionTransfer::class) + $this->invalidSyncableCompanyRoleTransfer = $this->getMockBuilder(SyncableCompanyRoleTransfer::class) ->disableOriginalConstructor() ->getMock(); - $this->permissionTransferMocks = [ - $this->getMockBuilder(PermissionTransfer::class) - ->disableOriginalConstructor() - ->getMock(), - ]; - - $this->companyRoleCollectionTransferMocks = [ - $this->getMockBuilder(CompanyRoleCollectionTransfer::class) - ->disableOriginalConstructor() - ->getMock(), + $this->companyRoleCollectionTransferMock = $this->getMockBuilder(CompanyRoleCollectionTransfer::class) ->disableOriginalConstructor() - ->getMock(), - ]; + ->getMock(); - $this->companyRoleTransferMocks = [ - $this->getMockBuilder(CompanyRoleTransfer::class) - ->disableOriginalConstructor() - ->getMock(), - $this->getMockBuilder(CompanyRoleTransfer::class) - ->disableOriginalConstructor() - ->getMock(), - $this->getMockBuilder(CompanyRoleTransfer::class) - ->disableOriginalConstructor() - ->getMock(), - ]; - - $this->intersectedPermissionCollectionTransferMock = $this->getMockBuilder(PermissionCollectionTransfer::class) + $this->permissionCollectionTransferMock = $this->getMockBuilder(PermissionCollectionTransfer::class) ->disableOriginalConstructor() ->getMock(); - $this->companyRoleCriteriaFilterTransferMocks = [ - $this->getMockBuilder(CompanyRoleCriteriaFilterTransfer::class) + $this->companyRoleTransferMock = $this->getMockBuilder(CompanyRoleTransfer::class) ->disableOriginalConstructor() - ->getMock(), - $this->getMockBuilder(CompanyRoleCriteriaFilterTransfer::class) - ->disableOriginalConstructor() - ->getMock(), - ]; - - $this->paginationTransferMock = $this->getMockBuilder(PaginationTransfer::class) - ->disableOriginalConstructor() - ->getMock(); + ->getMock(); $this->permissionSynchronizer = new PermissionSynchronizer( - $this->companyTypeNameFilterMock, - $this->permissionIntersectionMock, - $this->companyRoleCriteriaFilterBuilderMock, + $this->companyRoleReaderMock, $this->companyRoleFacadeMock, - $this->permissionFacadeMock, - $this->configMock, ); } @@ -183,98 +100,47 @@ protected function _before(): void */ public function testSync(): void { - $companyTypeNames = ['TypeA', 'TypeB']; - $companyRoleNames = ['RoleA', 'RoleB']; - $permissionKeys = ['PermissionA']; + $companyRoleIds = [1]; - $this->permissionFacadeMock->expects(static::atLeastOnce()) - ->method('findAll') - ->willReturn($this->permissionCollectionTransferMock); + $this->companyRoleReaderMock->expects(static::atLeastOnce()) + ->method('findSyncableCompanyRoles') + ->willReturn([ + $this->invalidSyncableCompanyRoleTransfer, + $this->syncableCompanyRoleTransfer, + ]); - $this->permissionCollectionTransferMock->expects(static::atLeastOnce()) - ->method('getPermissions') - ->willReturn(new ArrayObject($this->permissionTransferMocks)); + $this->invalidSyncableCompanyRoleTransfer->expects(static::atLeastOnce()) + ->method('getIds') + ->willReturn([]); - $this->companyRoleCriteriaFilterBuilderMock->expects(static::atLeastOnce()) - ->method('buildByPageAndMaxPerPage') - ->withConsecutive([1, 1], [1, PermissionSynchronizer::PAGINATION_MAX_PER_PAGE]) - ->willReturnOnConsecutiveCalls( - $this->companyRoleCriteriaFilterTransferMocks[0], - $this->companyRoleCriteriaFilterTransferMocks[1], - ); + $this->invalidSyncableCompanyRoleTransfer->expects(static::never()) + ->method('getPermissions'); - $this->companyRoleFacadeMock->expects(static::atLeastOnce()) - ->method('getCompanyRoleCollection') - ->withConsecutive( - [$this->companyRoleCriteriaFilterTransferMocks[0]], - [$this->companyRoleCriteriaFilterTransferMocks[1]], - )->willReturnOnConsecutiveCalls( - $this->companyRoleCollectionTransferMocks[0], - $this->companyRoleCollectionTransferMocks[1], - ); + $this->syncableCompanyRoleTransfer->expects(static::atLeastOnce()) + ->method('getIds') + ->willReturn($companyRoleIds); - $this->companyRoleCollectionTransferMocks[0]->expects(static::atLeastOnce()) - ->method('getPagination') - ->willReturn($this->paginationTransferMock); + $this->syncableCompanyRoleTransfer->expects(static::atLeastOnce()) + ->method('getPermissions') + ->willReturn($this->permissionCollectionTransferMock); - $this->paginationTransferMock->expects(static::atLeastOnce()) - ->method('getNbResults') - ->willReturn(count($this->companyRoleTransferMocks)); + $this->companyRoleReaderMock->expects(static::atLeastOnce()) + ->method('findCompanyRolesByCompanyRoleIds') + ->with($companyRoleIds) + ->willReturn($this->companyRoleCollectionTransferMock); - $this->companyRoleCollectionTransferMocks[1]->expects(static::atLeastOnce()) + $this->companyRoleCollectionTransferMock->expects(static::atLeastOnce()) ->method('getRoles') - ->willReturn(new ArrayObject($this->companyRoleTransferMocks)); - - $this->companyRoleTransferMocks[0]->expects(static::atLeastOnce()) - ->method('getName') - ->willReturn($companyRoleNames[0]); + ->willReturn(new ArrayObject([$this->companyRoleTransferMock])); - $this->companyRoleTransferMocks[1]->expects(static::atLeastOnce()) - ->method('getName') - ->willReturn($companyRoleNames[1]); - - $this->companyRoleTransferMocks[2]->expects(static::atLeastOnce()) - ->method('getName') - ->willReturn(null); - - $this->companyTypeNameFilterMock->expects(static::atLeastOnce()) - ->method('filterFromCompanyRole') - ->withConsecutive( - [$this->companyRoleTransferMocks[0]], - [$this->companyRoleTransferMocks[1]], - [$this->companyRoleTransferMocks[2]], - )->willReturnOnConsecutiveCalls( - $companyTypeNames[0], - $companyTypeNames[1], - null, - ); - - $this->configMock->expects(static::atLeastOnce()) - ->method('getPermissionKeys') - ->withConsecutive( - [$companyTypeNames[0], $companyRoleNames[0]], - [$companyTypeNames[1], $companyRoleNames[1]], - )->willReturnOnConsecutiveCalls([], $permissionKeys); - - $this->permissionIntersectionMock->expects(static::atLeastOnce()) - ->method('intersect') - ->with($this->permissionCollectionTransferMock, $permissionKeys) - ->willReturn($this->intersectedPermissionCollectionTransferMock); - - $this->companyRoleTransferMocks[0]->expects(static::never()) - ->method('setPermissionCollection'); - - $this->companyRoleTransferMocks[1]->expects(static::atLeastOnce()) + $this->companyRoleTransferMock->expects(static::atLeastOnce()) ->method('setPermissionCollection') - ->with($this->intersectedPermissionCollectionTransferMock) - ->willReturn($this->companyRoleTransferMocks); - - $this->companyRoleTransferMocks[2]->expects(static::never()) - ->method('setPermissionCollection'); + ->with($this->permissionCollectionTransferMock) + ->willReturn($this->companyRoleTransferMock); $this->companyRoleFacadeMock->expects(static::atLeastOnce()) ->method('update') - ->with($this->companyRoleTransferMocks[1]); + ->with($this->companyRoleTransferMock); $this->permissionSynchronizer->sync(); } diff --git a/tests/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleDependencyProviderTest.php b/tests/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleDependencyProviderTest.php deleted file mode 100644 index c6d7e7d..0000000 --- a/tests/FondOfImpala/Zed/CompanyTypeRole/CompanyTypeRoleDependencyProviderTest.php +++ /dev/null @@ -1,130 +0,0 @@ -containerMock = $this->getMockBuilder(Container::class) - ->setMethodsExcept(['factory', 'set', 'offsetSet', 'get', 'offsetGet']) - ->getMock(); - - $this->locatorMock = $this->getMockBuilder(Locator::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->bundleProxyMock = $this->getMockBuilder(BundleProxy::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->companyRoleFacadeMock = $this->getMockBuilder(CompanyRoleFacadeInterface::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->companyTypeFacadeMock = $this->getMockBuilder(CompanyTypeFacadeInterface::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->permissionFacadeMock = $this->getMockBuilder(PermissionFacadeInterface::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->companyTypeRoleDependencyProvider = new CompanyTypeRoleDependencyProvider(); - } - - /** - * @return void - */ - public function testProvideBusinessLayerDependencies(): void - { - $this->containerMock->expects($this->atLeastOnce()) - ->method('getLocator') - ->willReturn($this->locatorMock); - - $this->locatorMock->expects($this->exactly(3)) - ->method('__call') - ->withConsecutive(['companyRole'], ['companyType'], ['permission']) - ->willReturn($this->bundleProxyMock); - - $this->bundleProxyMock->expects($this->exactly(3)) - ->method('__call') - ->with('facade') - ->willReturnOnConsecutiveCalls( - $this->companyRoleFacadeMock, - $this->companyTypeFacadeMock, - $this->permissionFacadeMock, - ); - - $this->assertEquals( - $this->containerMock, - $this->companyTypeRoleDependencyProvider->provideBusinessLayerDependencies($this->containerMock), - ); - - $this->assertInstanceOf( - CompanyTypeRoleToCompanyRoleFacadeBridge::class, - $this->containerMock[CompanyTypeRoleDependencyProvider::FACADE_COMPANY_ROLE], - ); - - $this->assertInstanceOf( - CompanyTypeRoleToCompanyTypeFacadeBridge::class, - $this->containerMock[CompanyTypeRoleDependencyProvider::FACADE_COMPANY_TYPE], - ); - - $this->assertInstanceOf( - CompanyTypeRoleToPermissionFacadeBridge::class, - $this->containerMock[CompanyTypeRoleDependencyProvider::FACADE_PERMISSION], - ); - } -} diff --git a/tests/FondOfImpala/Zed/CompanyTypeRole/Dependency/Facade/CompanyTypeRoleToPropelFacadeBridgeTest.php b/tests/FondOfImpala/Zed/CompanyTypeRole/Dependency/Facade/CompanyTypeRoleToPropelFacadeBridgeTest.php new file mode 100644 index 0000000..934a396 --- /dev/null +++ b/tests/FondOfImpala/Zed/CompanyTypeRole/Dependency/Facade/CompanyTypeRoleToPropelFacadeBridgeTest.php @@ -0,0 +1,50 @@ +facadeMock = $this->getMockBuilder(PropelFacadeInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->bridge = new CompanyTypeRoleToPropelFacadeBridge($this->facadeMock); + } + + /** + * @return void + */ + public function testGetCurrentDatabaseEngine(): void + { + $currentDatabaseEngine = 'psql'; + + $this->facadeMock->expects(static::atLeastOnce()) + ->method('getCurrentDatabaseEngine') + ->willReturn($currentDatabaseEngine); + + static::assertEquals( + $currentDatabaseEngine, + $this->bridge->getCurrentDatabaseEngine(), + ); + } +}