TConfigurable::__call()   A
last analyzed

Complexity

Conditions 6
Paths 6

Size

Total Lines 24
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 17
CRAP Score 6.0061

Importance

Changes 0
Metric Value
eloc 17
dl 0
loc 24
ccs 17
cts 18
cp 0.9444
rs 9.0777
c 0
b 0
f 0
cc 6
nc 6
nop 2
crap 6.0061
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * SPDX-FileCopyrightText: 2025 LibreCode coop and contributors
7
 * SPDX-License-Identifier: AGPL-3.0-or-later
8
 */
9
10
namespace OCA\TwoFactorGateway\Provider\Gateway;
11
12
use OCA\TwoFactorGateway\AppInfo\Application;
13
use OCA\TwoFactorGateway\Exception\ConfigurationException;
14
use OCP\IAppConfig;
15
16
trait TConfigurable {
17
	/**
18
	 * @return string|static
19
	 * @throws ConfigurationException
20
	 */
21 10
	public function __call(string $name, array $args) {
22 10
		if (!preg_match('/^(?<operation>get|set|delete)(?<field>[A-Z][A-Za-z0-9_]*)$/', $name, $matches)) {
23 1
			throw new ConfigurationException('Invalid method ' . $name);
24
		}
25 9
		$field = strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $matches['field']));
26 9
		$key = $this->keyFromField($field);
27
28 8
		switch ($matches['operation']) {
29 8
			case 'get':
30 4
				$val = (string)$this->getAppConfig()->getValueString(Application::APP_ID, $key, '');
31 4
				if ($val === '') {
32 2
					throw new ConfigurationException('No value set for ' . $field);
33
				}
34 3
				return $val;
35
36 7
			case 'set':
37 4
				$this->getAppConfig()->setValueString(Application::APP_ID, $key, (string)($args[0] ?? ''));
38 4
				return $this;
39
40 4
			case 'delete':
41 4
				$this->getAppConfig()->deleteKey(Application::APP_ID, $key);
42 4
				return $this;
43
		}
44
		throw new ConfigurationException('Invalid operation ' . $matches['operation']);
45
	}
46
47
	/**
48
	 * @throws ConfigurationException
49
	 */
50 9
	private function keyFromField(string $fieldName): string {
51 9
		$settings = $this->getSettings();
0 ignored issues
show
Bug introduced by
The method getSettings() does not exist on OCA\TwoFactorGateway\Pro...r\Gateway\TConfigurable. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

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

51
		/** @scrutinizer ignore-call */ 
52
  $settings = $this->getSettings();
Loading history...
52 9
		$fields = $settings->fields;
53 9
		foreach ($fields as $field) {
54 9
			if ($field->field === $fieldName) {
55 8
				return $settings->id . '_' . $fieldName;
56
			}
57
		}
58 1
		throw new ConfigurationException('Invalid configuration field: ' . $fieldName . ', check SCHEMA at ' . static::class);
59
	}
60
61
	/**
62
	 * @throws ConfigurationException
63
	 */
64 8
	private function getAppConfig(): IAppConfig {
65 8
		if (!isset($this->appConfig)) {
66
			throw new ConfigurationException('No app config set');
67
		}
68 8
		return $this->appConfig;
69
	}
70
}
71