Passed
Push — developer ( 7cf2c5...92d385 )
by Radosław
15:53
created

SMSProvider::getAll()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 8
c 0
b 0
f 0
dl 0
loc 13
rs 10
cc 3
nc 4
nop 1
1
<?php
2
/**
3
 * SMS Provider file.
4
 *
5
 * @package App
6
 *
7
 * @copyright YetiForce S.A.
8
 * @license   YetiForce Public License 5.0 (licenses/LicenseEN.txt or yetiforce.com)
9
 * @author    Radosław Skrzypczak <[email protected]>
10
 */
11
12
namespace App\Integrations;
13
14
/**
15
 * SMS Provider class.
16
 */
17
class SMSProvider extends \App\Base
18
{
19
	/** @var string Basic table name */
20
	public const TABLE_NAME = 'a_#__smsnotifier_servers';
21
22
	/** @var int Status inactive */
23
	public const STATUS_INACTIVE = 0;
24
	/** @var int Status active */
25
	public const STATUS_ACTIVE = 1;
26
	/** @var int Status active */
27
	public const DEFAULT = 1;
28
29
	/**
30
	 * Get providers.
31
	 *
32
	 * @return array
33
	 */
34
	public static function getProviders(): array
35
	{
36
		$providers = [];
37
		$iterator = new \DirectoryIterator(__DIR__ . '/SMSProvider');
38
		foreach ($iterator as $item) {
39
			if ($item->isFile() && 'Provider.php' !== $item->getFilename() && 'php' === $item->getExtension() && $provider = self::getProviderByName($item->getBasename('.php'))) {
40
				$providers[$provider->getName()] = $provider;
41
			}
42
		}
43
44
		return $providers;
45
	}
46
47
	/**
48
	 * Get provider by name.
49
	 *
50
	 * @param string $name
51
	 *
52
	 * @return SMSProvider\Provider|null
53
	 */
54
	public static function getProviderByName(string $name): ?SMSProvider\Provider
55
	{
56
		$className = "\\App\\Integrations\\SMSProvider\\{$name}";
57
		return class_exists($className) ? new $className() : null;
58
	}
59
60
	/**
61
	 * Get provider by data.
62
	 *
63
	 * @param array $data
64
	 *
65
	 * @return SMSProvider\Provider|null
66
	 */
67
	public static function getProviderByData(array $data): ?SMSProvider\Provider
68
	{
69
		$provider = self::getProviderByName($data['providertype']);
70
		$parameters = \App\Json::isJson($data['parameters']) ? \App\Json::decode($data['parameters']) : [];
71
		foreach ($parameters as $name => $value) {
72
			$data[$name] = $value;
73
		}
74
		unset($data['parameters']);
75
		return $provider ? $provider->setData($data) : null;
76
	}
77
78
	/**
79
	 * Get default provider.
80
	 *
81
	 * @return SMSProvider\Provider|null
82
	 */
83
	public static function getDefaultProvider(): ?SMSProvider\Provider
84
	{
85
		$providers = (new \App\Db\Query())->from(self::TABLE_NAME)->where(['isactive' => self::STATUS_ACTIVE])->all();
86
		if (1 === \count($providers)) {
87
			return self::getProviderByData(reset($providers));
88
		}
89
		$defaultProvider = array_filter($providers, fn ($server) => self::DEFAULT === $server['default']);
90
		return $defaultProvider ? self::getProviderByData(reset($defaultProvider)) : null;
91
	}
92
93
	/**
94
	 * Check if there is an active provider.
95
	 *
96
	 * @return bool
97
	 */
98
	public static function isActiveProvider(): bool
99
	{
100
		return (new \App\Db\Query())->from(self::TABLE_NAME)->where(['isactive' => self::STATUS_ACTIVE])->exists();
101
	}
102
103
	/**
104
	 * Get provider by ID.
105
	 *
106
	 * @param int $id
107
	 *
108
	 * @return SMSProvider\Provider|null
109
	 */
110
	public static function getById(int $id): ?SMSProvider\Provider
111
	{
112
		$data = (new \App\Db\Query())->from(self::TABLE_NAME)->where(['id' => $id])->one();
113
		return $data ? self::getProviderByData($data) : null;
114
	}
115
116
	/**
117
	 * Get a list of all SMS servers.
118
	 *
119
	 * @param int|null $active self::STATUS_INACTIVE, self::STATUS_ACTIVE
120
	 *
121
	 * @return array
122
	 */
123
	public static function getAll(?int $active = null): array
124
	{
125
		if (\App\Cache::has('SMSServer', 'all')) {
126
			$providers = \App\Cache::get('SMSServer', 'all');
127
		} else {
128
			$providers = (new \App\Db\Query())->from(self::TABLE_NAME)->indexBy('id')->all(\App\Db::getInstance('admin'));
129
			\App\Cache::save('SMSServer', 'all', $providers, \App\Cache::LONG);
130
		}
131
		if (null !== $active) {
132
			$providers = array_filter($providers, fn ($server) => $server['isactive'] === $active);
133
		}
134
135
		return $providers;
136
	}
137
}
138