Test Failed
Push — main ( 6e07a8...756f61 )
by Jean-Christophe
03:11
created

AclDAOProvider::generateDbTables()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 2
eloc 8
c 1
b 0
f 1
nc 2
nop 2
dl 0
loc 9
ccs 6
cts 6
cp 1
crap 2
rs 10
1
<?php
2
namespace Ubiquity\security\acl\persistence;
3
4
use Ubiquity\cache\CacheManager;
5
use Ubiquity\controllers\Startup;
6
use Ubiquity\db\reverse\DbGenerator;
7
use Ubiquity\exceptions\AclException;
8
use Ubiquity\orm\DAO;
9
use Ubiquity\orm\reverse\DatabaseReversor;
10
use Ubiquity\security\acl\models\AbstractAclPart;
11
use Ubiquity\security\acl\models\AclElement;
12
use Ubiquity\security\acl\models\Permission;
13
use Ubiquity\security\acl\models\Resource;
14
use Ubiquity\security\acl\models\Role;
15
16
/**
17
 * Load and save Acls with a database using DAO.
18
 * Ubiquity\security\acl\persistence$AclDAOProvider
19
 * This class is part of Ubiquity
20
 *
21
 * @author jc
22
 * @version 1.0.1
23
 *
24
 */
25
class AclDAOProvider implements AclProviderInterface {
26
27
	protected string $aclClass;
28
29
	protected string $roleClass;
30
31
	protected string $permissionClass;
32
33
	protected string $resourceClass;
34
35
	/**
36 4
	 * @param array $config The $config array
37 4
	 * @param array $classes
38 4
	 *        	associative array['acl'=>'','role'=>'','resource'=>'','permission'=>'']
39 4
	 */
40 4
	public function __construct(array &$config,$classes = []) {
41 4
		Startup::$config=$config;
42
		$this->aclClass = $classes['acl'] ?? AclElement::class;
43
		$this->roleClass = $classes['role'] ?? Role::class;
44
		$this->resourceClass = $classes['resource'] ?? Resource::class;
45
		$this->permissionClass = $classes['permission'] ?? Permission::class;
46
	}
47
48
	/**
49
	 * Initialize the cache for the ACL models.
50
	 * @param $config
51
	 */
52
	public function initModelsCache(&$config) {
53
		CacheManager::start($config);
54
		CacheManager::createOrmModelCache($this->aclClass);
55 4
		CacheManager::createOrmModelCache($this->roleClass);
56 4
		CacheManager::createOrmModelCache($this->resourceClass);
57
		CacheManager::createOrmModelCache($this->permissionClass);
58
	}
59
60
	/**
61
	 * Defines the database offset used for ACL.
62
	 * @param string $dbOffset
63
	 */
64 1
	public function setDbOffset(string $dbOffset = 'default'):void {
65 1
		DAO::setModelDatabase($this->aclClass, $dbOffset);
66 1
		DAO::setModelDatabase($this->resourceClass, $dbOffset);
67 1
		DAO::setModelDatabase($this->roleClass, $dbOffset);
68 1
		DAO::setModelDatabase($this->permissionClass, $dbOffset);
69
	}
70 1
71
	/**
72
	 * Generates the tables for ACL model classes.
73
	 * @param string $dbOffset
74
	 * @param bool $createDb
75
	 * @throws AclException
76
	 */
77
	public function generateDbTables(string $dbOffset='default',bool $createDb=false):void{
78 1
		$this->setDbOffset($dbOffset);
79 1
		$generator = new DatabaseReversor(new DbGenerator(), $dbOffset);
80
		$activeOffsetValue=DAO::getDbOffset(Startup::$config,$dbOffset);
81
		if(($dbName=$activeOffsetValue['dbName']??'')!='') {
82 4
			$generator->setModels([$this->aclClass,$this->roleClass,$this->resourceClass,$this->permissionClass]);
83 4
			$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

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