Completed
Push — master ( 8024bc...f8f0d2 )
by Vitor
14s
created

TConfigurable::getSchemaFields()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 2
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 1
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 9
	public function __call(string $name, array $args) {
22 9
		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 8
		$field = strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $matches['field']));
26 8
		$key = $this->keyFromField($field);
27
28 7
		switch ($matches['operation']) {
29 7
			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 6
			case 'set':
37 3
				$this->getAppConfig()->setValueString(Application::APP_ID, $key, (string)($args[0] ?? ''));
38 3
				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 8
	private function keyFromField(string $fieldName): string {
51 8
		$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 8
		$fields = $settings->fields;
53 8
		foreach ($fields as $field) {
54 8
			if ($field->field === $fieldName) {
55 7
				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 7
	private function getAppConfig(): IAppConfig {
65 7
		if (!isset($this->appConfig)) {
66
			throw new ConfigurationException('No app config set');
67
		}
68 7
		return $this->appConfig;
69
	}
70
}
71