major update
This commit is contained in:
@@ -5,119 +5,90 @@ namespace MintyPHP\Service\Access;
|
||||
use MintyPHP\Repository\Access\PermissionRepository;
|
||||
use MintyPHP\Repository\Access\RolePermissionRepository;
|
||||
use MintyPHP\Repository\Access\UserRoleRepository;
|
||||
use MintyPHP\Service\Directory\DirectoryScopeGateway;
|
||||
use MintyPHP\Service\Directory\DirectoryServicesFactory;
|
||||
|
||||
class AccessServicesFactory
|
||||
{
|
||||
private ?PermissionRepository $permissionRepository = null;
|
||||
private ?RolePermissionRepository $rolePermissionRepository = null;
|
||||
private ?UserRoleRepository $userRoleRepository = null;
|
||||
private ?PermissionService $permissionService = null;
|
||||
private ?PermissionGateway $permissionGateway = null;
|
||||
private ?DirectoryServicesFactory $directoryServicesFactory = null;
|
||||
private ?DirectoryScopeGateway $directoryScopeGateway = null;
|
||||
private ?UserAuthorizationPolicy $userAuthorizationPolicy = null;
|
||||
private ?RoleAuthorizationPolicy $roleAuthorizationPolicy = null;
|
||||
private ?PermissionAuthorizationPolicy $permissionAuthorizationPolicy = null;
|
||||
private ?SettingsAuthorizationPolicy $settingsAuthorizationPolicy = null;
|
||||
private ?TenantAuthorizationPolicy $tenantAuthorizationPolicy = null;
|
||||
private ?DepartmentAuthorizationPolicy $departmentAuthorizationPolicy = null;
|
||||
private ?AuthorizationService $authorizationService = null;
|
||||
private ?AccessPolicyFactory $accessPolicyFactory = null;
|
||||
private \Closure $accessPolicyFactoryResolver;
|
||||
|
||||
public function __construct(
|
||||
private readonly AccessRepositoryFactory $accessRepositoryFactory,
|
||||
private readonly AccessGatewayFactory $accessGatewayFactory,
|
||||
callable $accessPolicyFactoryResolver
|
||||
) {
|
||||
$this->accessPolicyFactoryResolver = \Closure::fromCallable($accessPolicyFactoryResolver);
|
||||
}
|
||||
|
||||
public function createPermissionRepository(): PermissionRepository
|
||||
{
|
||||
return $this->permissionRepository ??= new PermissionRepository();
|
||||
return $this->accessRepositoryFactory->createPermissionRepository();
|
||||
}
|
||||
|
||||
public function createRolePermissionRepository(): RolePermissionRepository
|
||||
{
|
||||
return $this->rolePermissionRepository ??= new RolePermissionRepository();
|
||||
return $this->accessRepositoryFactory->createRolePermissionRepository();
|
||||
}
|
||||
|
||||
public function createUserRoleRepository(): UserRoleRepository
|
||||
{
|
||||
return $this->userRoleRepository ??= new UserRoleRepository();
|
||||
return $this->accessRepositoryFactory->createUserRoleRepository();
|
||||
}
|
||||
|
||||
public function createPermissionService(): PermissionService
|
||||
{
|
||||
return $this->permissionService ??= new PermissionService(
|
||||
$this->createPermissionRepository(),
|
||||
$this->createRolePermissionRepository(),
|
||||
$this->createUserRoleRepository()
|
||||
);
|
||||
return $this->accessGatewayFactory->createPermissionService();
|
||||
}
|
||||
|
||||
public function createPermissionGateway(): PermissionGateway
|
||||
{
|
||||
return $this->permissionGateway ??= new PermissionGateway($this->createPermissionService());
|
||||
return $this->accessGatewayFactory->createPermissionGateway();
|
||||
}
|
||||
|
||||
public function createUserAuthorizationPolicy(): UserAuthorizationPolicy
|
||||
{
|
||||
return $this->userAuthorizationPolicy ??= new UserAuthorizationPolicy(
|
||||
$this->createPermissionGateway(),
|
||||
$this->createDirectoryScopeGateway()
|
||||
);
|
||||
return $this->accessPolicyFactory()->createUserAuthorizationPolicy();
|
||||
}
|
||||
|
||||
public function createRoleAuthorizationPolicy(): RoleAuthorizationPolicy
|
||||
{
|
||||
return $this->roleAuthorizationPolicy ??= new RoleAuthorizationPolicy(
|
||||
$this->createPermissionGateway()
|
||||
);
|
||||
return $this->accessPolicyFactory()->createRoleAuthorizationPolicy();
|
||||
}
|
||||
|
||||
public function createPermissionAuthorizationPolicy(): PermissionAuthorizationPolicy
|
||||
{
|
||||
return $this->permissionAuthorizationPolicy ??= new PermissionAuthorizationPolicy(
|
||||
$this->createPermissionGateway()
|
||||
);
|
||||
return $this->accessPolicyFactory()->createPermissionAuthorizationPolicy();
|
||||
}
|
||||
|
||||
public function createSettingsAuthorizationPolicy(): SettingsAuthorizationPolicy
|
||||
{
|
||||
return $this->settingsAuthorizationPolicy ??= new SettingsAuthorizationPolicy(
|
||||
$this->createPermissionGateway()
|
||||
);
|
||||
return $this->accessPolicyFactory()->createSettingsAuthorizationPolicy();
|
||||
}
|
||||
|
||||
public function createTenantAuthorizationPolicy(): TenantAuthorizationPolicy
|
||||
{
|
||||
return $this->tenantAuthorizationPolicy ??= new TenantAuthorizationPolicy(
|
||||
$this->createPermissionGateway(),
|
||||
$this->createDirectoryScopeGateway()
|
||||
);
|
||||
return $this->accessPolicyFactory()->createTenantAuthorizationPolicy();
|
||||
}
|
||||
|
||||
public function createDepartmentAuthorizationPolicy(): DepartmentAuthorizationPolicy
|
||||
{
|
||||
return $this->departmentAuthorizationPolicy ??= new DepartmentAuthorizationPolicy(
|
||||
$this->createPermissionGateway(),
|
||||
$this->createDirectoryScopeGateway()
|
||||
);
|
||||
return $this->accessPolicyFactory()->createDepartmentAuthorizationPolicy();
|
||||
}
|
||||
|
||||
public function createAuthorizationService(): AuthorizationService
|
||||
{
|
||||
return $this->authorizationService ??= new AuthorizationService([
|
||||
$this->createUserAuthorizationPolicy(),
|
||||
$this->createRoleAuthorizationPolicy(),
|
||||
$this->createPermissionAuthorizationPolicy(),
|
||||
$this->createSettingsAuthorizationPolicy(),
|
||||
$this->createTenantAuthorizationPolicy(),
|
||||
$this->createDepartmentAuthorizationPolicy(),
|
||||
]);
|
||||
return $this->accessPolicyFactory()->createAuthorizationService();
|
||||
}
|
||||
|
||||
private function createDirectoryScopeGateway(): DirectoryScopeGateway
|
||||
private function accessPolicyFactory(): AccessPolicyFactory
|
||||
{
|
||||
return $this->directoryScopeGateway ??= $this->directoryServicesFactory()->createDirectoryScopeGateway();
|
||||
}
|
||||
if ($this->accessPolicyFactory !== null) {
|
||||
return $this->accessPolicyFactory;
|
||||
}
|
||||
|
||||
private function directoryServicesFactory(): DirectoryServicesFactory
|
||||
{
|
||||
return $this->directoryServicesFactory ??= new DirectoryServicesFactory();
|
||||
$factory = ($this->accessPolicyFactoryResolver)();
|
||||
if (!$factory instanceof AccessPolicyFactory) {
|
||||
throw new \RuntimeException('Access policy resolver must return AccessPolicyFactory');
|
||||
}
|
||||
return $this->accessPolicyFactory = $factory;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user