Passed
Push — main ( 8815d3...d06024 )
by Jean-Christophe
02:38
created

AclDAOProvider::existAcl()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 4
ccs 4
cts 4
cp 1
crap 1
rs 10
c 1
b 0
f 1
1
<?php
2
namespace Ubiquity\security\acl\persistence;
3
4
use Ubiquity\cache\CacheManager;
5
use Ubiquity\cache\ClassUtils;
6
use Ubiquity\controllers\Startup;
7
use Ubiquity\db\reverse\DbGenerator;
8
use Ubiquity\exceptions\AclException;
9
use Ubiquity\orm\DAO;
10
use Ubiquity\orm\reverse\DatabaseReversor;
11
use Ubiquity\scaffolding\creators\ClassCreator;
0 ignored issues
show
Bug introduced by
The type Ubiquity\scaffolding\creators\ClassCreator was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
12
use Ubiquity\security\acl\models\AbstractAclPart;
13
use Ubiquity\security\acl\models\AclElement;
14
use Ubiquity\security\acl\models\Permission;
15
use Ubiquity\security\acl\models\Resource;
16
use Ubiquity\security\acl\models\Role;
17
18
/**
19
 * Load and save Acls with a database using DAO.
20
 * Ubiquity\security\acl\persistence$AclDAOProvider
21
 * This class is part of Ubiquity
22
 *
23
 * @author jc
24
 * @version 1.0.1
25
 *
26
 */
27
class AclDAOProvider implements AclProviderInterface {
28
29
	protected string $aclClass;
30
31
	protected string $roleClass;
32
33
	protected string $permissionClass;
34
35
	protected string $resourceClass;
36
37
	/**
38
	 * @param array $config The $config array
39
	 * @param array $classes
40
	 *        	associative array['acl'=>'','role'=>'','resource'=>'','permission'=>'']
41
	 */
42 4
	public function __construct(array &$config,$classes = []) {
43 4
		Startup::$config=$config;
44 4
		$this->aclClass = $classes['acl'] ?? AclElement::class;
45 4
		$this->roleClass = $classes['role'] ?? Role::class;
46 4
		$this->resourceClass = $classes['resource'] ?? Resource::class;
47 4
		$this->permissionClass = $classes['permission'] ?? Permission::class;
48 4
	}
49
50
	/**
51
	 * Initialize the cache for the ACL models.
52
	 * @param $config
53
	 */
54
	public function initModelsCache(&$config) {
55
		CacheManager::start($config);
56
		CacheManager::createOrmModelCache($this->aclClass);
57
		CacheManager::createOrmModelCache($this->roleClass);
58
		CacheManager::createOrmModelCache($this->resourceClass);
59
		CacheManager::createOrmModelCache($this->permissionClass);
60
	}
61
62
	/**
63
	 * Defines the database offset used for ACL.
64
	 * @param string $dbOffset
65
	 */
66
	public function setDbOffset(string $dbOffset = 'default'):void {
67
		DAO::setModelDatabase($this->aclClass, $dbOffset);
68
		DAO::setModelDatabase($this->resourceClass, $dbOffset);
69
		DAO::setModelDatabase($this->roleClass, $dbOffset);
70
		DAO::setModelDatabase($this->permissionClass, $dbOffset);
71
	}
72
73
	/**
74
	 * Generates the models.
75
	 * @param array $classes associative array['acl'=>'','role'=>'','resource'=>'','permission'=>'']
76
	 */
77
	public function createModels(array $classes=[]):void{
78
		$this->createModel($classes['acl'] ?? $this->aclClass,AclElement::class);
79
		$this->createModel($classes['role'] ?? $this->roleClass,Role::class);
80
		$this->createModel($classes['resource'] ?? $this->resourceClass,Resource::class);
81
		$this->createModel($classes['permission'] ?? $this->permissionClass,Permission::class);
82
	}
83
84
	public function createModel($modelName,$refName):void{
85
		if($modelName!==$refName){
86
			$className=ClassUtils::getClassSimpleName($modelName);
87
			$ns=ClassUtils::getNamespaceFromCompleteClassname($modelName);
88
			$cCreator=new ClassCreator($className,'',$ns,' extends '.$refName);
89
			$cCreator->generate();
90
		}
91
	}
92
93
	/**
94
	 * Generates the tables for ACL model classes.
95
	 * @param string $dbOffset
96
	 * @param bool $createDb
97
	 * @throws AclException
98
	 */
99
	public function generateDbTables(string $dbOffset='default',bool $createDb=false):void{
100
		$this->setDbOffset($dbOffset);
101
		$generator = new DatabaseReversor(new DbGenerator(), $dbOffset);
102
		$activeOffsetValue=DAO::getDbOffset(Startup::$config,$dbOffset);
103
		if(($dbName=$activeOffsetValue['dbName']??'')!='') {
104
			$generator->setModels([$this->aclClass,$this->roleClass,$this->resourceClass,$this->permissionClass]);
105
			$generator->createDatabase($dbName, $createDb);
0 ignored issues
show
Unused Code introduced by
The call to Ubiquity\orm\reverse\Dat...ersor::createDatabase() has too many arguments starting with $createDb. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

105
			$generator->/** @scrutinizer ignore-call */ 
106
               createDatabase($dbName, $createDb);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
106
		}else{
107
			throw new AclException('dbName key is not present or his value is empty!');
108
		}
109
	}
110
111
	/**
112
	 *
113
	 * {@inheritdoc}
114
	 * @see \Ubiquity\security\acl\persistence\AclProviderInterface::loadAllAcls()
115
	 */
116 4
	public function loadAllAcls(): array {
117 4
		return DAO::getAll($this->aclClass);
118
	}
119
120
	/**
121
	 *
122
	 * {@inheritdoc}
123
	 * @see \Ubiquity\security\acl\persistence\AclProviderInterface::saveAcl()
124
	 */
125 1
	public function saveAcl(AclElement $aclElement) {
126 1
		$object = $this->castElement($aclElement);
127 1
		$res = DAO::save($object);
128 1
		if ($res) {
129 1
			$aclElement->setId($object->getId());
130
		}
131 1
		return $res;
132
	}
133
134
	/**
135
	 *
136
	 * {@inheritdoc}
137
	 * @see \Ubiquity\security\acl\persistence\AclProviderInterface::removeAcl()
138
	 */
139 1
	public function removeAcl(AclElement $aclElement) {
140 1
		return DAO::remove($aclElement);
141
	}
142
143 4
	protected function loadElements(string $className): array {
144 4
		$elements = DAO::getAll($className);
145 4
		$result = [];
146 4
		foreach ($elements as $elm) {
147 4
			$result[$elm->getName()] = $elm;
148
		}
149 4
		return $result;
150
	}
151
152 3
	protected function castElement($part) {
153 3
		$class = $this->getModelClasses()[get_class($part)] ?? get_class($part);
154 3
		return $part->castAs($class);
155
	}
156
157
	/**
158
	 *
159
	 * {@inheritdoc}
160
	 * @see \Ubiquity\security\acl\persistence\AclProviderInterface::loadAllPermissions()
161
	 */
162 4
	public function loadAllPermissions(): array {
163 4
		return $this->loadElements($this->permissionClass);
164
	}
165
166
	/**
167
	 *
168
	 * {@inheritdoc}
169
	 * @see \Ubiquity\security\acl\persistence\AclProviderInterface::loadAllResources()
170
	 */
171 4
	public function loadAllResources(): array {
172 4
		return $this->loadElements($this->resourceClass);
173
	}
174
175
	/**
176
	 *
177
	 * {@inheritdoc}
178
	 * @see \Ubiquity\security\acl\persistence\AclProviderInterface::loadAllRoles()
179
	 */
180 4
	public function loadAllRoles(): array {
181 4
		return $this->loadElements($this->roleClass);
182
	}
183
184
	/**
185
	 *
186
	 * {@inheritdoc}
187
	 * @see \Ubiquity\security\acl\persistence\AclProviderInterface::savePart()
188
	 */
189 2
	public function savePart(\Ubiquity\security\acl\models\AbstractAclPart $part) {
190 2
		$object = $this->castElement($part);
191 2
		$res = DAO::insert($object);
192 2
		if ($res) {
193 2
			$part->setId($object->getId());
194
		}
195 2
		return $res;
196
	}
197
198
	/**
199
	 *
200
	 * {@inheritdoc}
201
	 * @see \Ubiquity\security\acl\persistence\AclProviderInterface::updatePart()
202
	 */
203 1
	public function updatePart(\Ubiquity\security\acl\models\AbstractAclPart $part) {
204 1
		return DAO::update($this->castElement($part));
205
	}
206
207
	/**
208
	 *
209
	 * {@inheritdoc}
210
	 * @see \Ubiquity\security\acl\persistence\AclProviderInterface::removePart()
211
	 */
212 2
	public function removePart(\Ubiquity\security\acl\models\AbstractAclPart $part) {
213 2
		return DAO::remove($this->castElement($part));
214
	}
215
216 1
	public function isAutosave(): bool {
217 1
		return true;
218
	}
219
220
	public function saveAll(): void {}
221
222 1
	public function existPart(AbstractAclPart $part): bool {
223 1
		$elm = $this->castElement($part);
224 1
		return DAO::exists(\get_class($elm), 'id= ?', [
225 1
			$elm->getId()
226
		]);
227
	}
228
229 1
	public function existAcl(AclElement $aclElement): bool {
230 1
		$elm = $this->castElement($aclElement);
231 1
		return DAO::exists(\get_class($aclElement), 'id= ?', [
232 1
			$elm->getId()
233
		]);
234
	}
235
236
	public function getDetails(): array {
237
		return [
238
			'user' => $this->roleClass,
239
			'archive' => $this->resourceClass,
240
			'unlock alternate' => $this->permissionClass,
241
			'lock' => $this->aclClass
242
		];
243
	}
244
245
	public function getModelClassesSwap(): array {
246
		$swap = $this->getModelClasses();
247
		$classes = \array_values($swap);
248
		$result = [];
249
		foreach ($classes as $class) {
250
			$result[$class] = $swap;
251
		}
252
		return $result;
253
	}
254
255 3
	public function getModelClasses(): array {
256
		return [
257 3
			AclElement::class => $this->aclClass,
258 3
			Role::class => $this->roleClass,
259 3
			Resource::class => $this->resourceClass,
260 3
			Permission::class => $this->permissionClass
261
		];
262
	}
263
264 1
	public function clearAll(): void {}
265
}
266
267