diff --git a/lib/Commands/Connect.php b/lib/Commands/Connect.php index 16b016d..ff22b26 100644 --- a/lib/Commands/Connect.php +++ b/lib/Commands/Connect.php @@ -27,8 +27,8 @@ class Connect extends Command { public function __construct( - private IUserManager $userManager, - private CoreService $CoreService, + private readonly IUserManager $userManager, + private readonly CoreService $CoreService, ) { parent::__construct(); } diff --git a/lib/Commands/Debug.php b/lib/Commands/Debug.php index 1cb8844..c88379f 100644 --- a/lib/Commands/Debug.php +++ b/lib/Commands/Debug.php @@ -22,8 +22,8 @@ */ class Debug extends Command { public function __construct( - private IUserManager $userManager, - private ServicesService $servicesService, + private readonly IUserManager $userManager, + private readonly ServicesService $servicesService, ) { parent::__construct(); } diff --git a/lib/Commands/Disconnect.php b/lib/Commands/Disconnect.php index 8697639..3757317 100644 --- a/lib/Commands/Disconnect.php +++ b/lib/Commands/Disconnect.php @@ -23,9 +23,9 @@ class Disconnect extends Command { public function __construct( - private IUserManager $userManager, - private CoreService $CoreService, - private ServicesService $servicesService, + private readonly IUserManager $userManager, + private readonly CoreService $CoreService, + private readonly ServicesService $servicesService, ) { parent::__construct(); } diff --git a/lib/Commands/Harmonize.php b/lib/Commands/Harmonize.php index cd12a8f..8d55c23 100644 --- a/lib/Commands/Harmonize.php +++ b/lib/Commands/Harmonize.php @@ -22,8 +22,8 @@ class Harmonize extends Command { public function __construct( - private IUserManager $userManager, - private HarmonizationService $HarmonizationService, + private readonly IUserManager $userManager, + private readonly HarmonizationService $HarmonizationService, ) { parent::__construct(); } diff --git a/lib/Commands/Show.php b/lib/Commands/Show.php index 7e5516c..df2cc87 100644 --- a/lib/Commands/Show.php +++ b/lib/Commands/Show.php @@ -23,8 +23,8 @@ class Show extends Command { public function __construct( - private IUserManager $userManager, - private ServicesService $servicesService, + private readonly IUserManager $userManager, + private readonly ServicesService $servicesService, ) { parent::__construct(); } diff --git a/lib/Controller/AdminConfigurationController.php b/lib/Controller/AdminConfigurationController.php index 599e621..5ba98ac 100644 --- a/lib/Controller/AdminConfigurationController.php +++ b/lib/Controller/AdminConfigurationController.php @@ -20,14 +20,12 @@ */ class AdminConfigurationController extends Controller { - private ConfigurationService $ConfigurationService; - - public function __construct(string $appName, IRequest $request, ConfigurationService $ConfigurationService) { - + public function __construct( + string $appName, + IRequest $request, + private readonly ConfigurationService $ConfigurationService, + ) { parent::__construct($appName, $request); - - $this->ConfigurationService = $ConfigurationService; - } /** diff --git a/lib/Controller/AdminTemplateController.php b/lib/Controller/AdminTemplateController.php index b066e33..3a6ac06 100644 --- a/lib/Controller/AdminTemplateController.php +++ b/lib/Controller/AdminTemplateController.php @@ -25,7 +25,7 @@ class AdminTemplateController extends Controller { public function __construct( string $appName, IRequest $request, - private ServicesTemplateService $templateService, + private readonly ServicesTemplateService $templateService, ) { parent::__construct($appName, $request); } @@ -37,7 +37,6 @@ public function __construct( */ #[FrontpageRoute(verb: 'GET', url: '/admin/templates')] public function list(): DataResponse { - return new DataResponse($this->templateService->list()); } @@ -51,7 +50,6 @@ public function list(): DataResponse { */ #[FrontpageRoute(verb: 'POST', url: '/admin/templates/create')] public function create(string $domain, array $connection = []): DataResponse { - $domain = trim($domain); if (!Validator::fqdn($domain)) { return new DataResponse('Invalid domain provided.', Http::STATUS_BAD_REQUEST); @@ -73,7 +71,6 @@ public function create(string $domain, array $connection = []): DataResponse { */ #[FrontpageRoute(verb: 'POST', url: '/admin/templates/modify')] public function modify(string $id, string $domain, array $connection = []): DataResponse { - $domain = trim($domain); if ($id === '') { return new DataResponse('Invalid template id.', Http::STATUS_BAD_REQUEST); diff --git a/lib/Controller/UserConfigurationController.php b/lib/Controller/UserConfigurationController.php index 7c467b0..12d4dba 100644 --- a/lib/Controller/UserConfigurationController.php +++ b/lib/Controller/UserConfigurationController.php @@ -27,9 +27,9 @@ class UserConfigurationController extends Controller { public function __construct( string $appName, IRequest $request, - private CoreService $CoreService, - private HarmonizationService $HarmonizationService, - private ServicesService $ServicesService, + private readonly CoreService $CoreService, + private readonly HarmonizationService $HarmonizationService, + private readonly ServicesService $ServicesService, private ?string $userId, ) { parent::__construct($appName, $request); diff --git a/lib/Events/UserDeletedListener.php b/lib/Events/UserDeletedListener.php index 8f02b38..dc8a06e 100644 --- a/lib/Events/UserDeletedListener.php +++ b/lib/Events/UserDeletedListener.php @@ -23,9 +23,9 @@ class UserDeletedListener implements IEventListener { public function __construct( - private LoggerInterface $logger, - private ServicesService $servicesService, - private CoreService $coreService, + private readonly LoggerInterface $logger, + private readonly ServicesService $servicesService, + private readonly CoreService $coreService, ) { } diff --git a/lib/Logging/FileLogger.php b/lib/Logging/FileLogger.php index c870ed6..b685d82 100644 --- a/lib/Logging/FileLogger.php +++ b/lib/Logging/FileLogger.php @@ -18,7 +18,6 @@ final class FileLogger implements LoggerInterface { public function __construct( private string $path, - private ?string $app = null, ) { } diff --git a/lib/Migration/DefaultServiceTemplates.php b/lib/Migration/DefaultServiceTemplates.php index b59be0c..23c4acb 100644 --- a/lib/Migration/DefaultServiceTemplates.php +++ b/lib/Migration/DefaultServiceTemplates.php @@ -19,7 +19,7 @@ class DefaultServiceTemplates implements IRepairStep { public function __construct( - private ServicesTemplateStore $store, + private readonly ServicesTemplateStore $store, ) { } @@ -28,9 +28,6 @@ public function getName(): string { return 'Create or update default Dav Connector service templates'; } - /** - * @return void - */ #[\Override] public function run(IOutput $output) { // load the default service templates from file diff --git a/lib/Migration/Version0010Date20260501000001.php b/lib/Migration/Version0010Date20260501000001.php index cf78239..34279bd 100644 --- a/lib/Migration/Version0010Date20260501000001.php +++ b/lib/Migration/Version0010Date20260501000001.php @@ -12,7 +12,6 @@ use Closure; use OCP\DB\ISchemaWrapper; use OCP\DB\Types; -use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\SimpleMigrationStep; @@ -21,11 +20,6 @@ */ class Version0010Date20260501000001 extends SimpleMigrationStep { - public function __construct( - private IDBConnection $db, - ) { - } - /** * @param IOutput $output * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` diff --git a/lib/Service/CoreService.php b/lib/Service/CoreService.php index 139c859..94c9fdd 100644 --- a/lib/Service/CoreService.php +++ b/lib/Service/CoreService.php @@ -9,14 +9,11 @@ namespace OCA\DAVC\Service; -use DateTime; -use OCA\DAVC\AppInfo\Application; use OCA\DAVC\Constants; use OCA\DAVC\Service\Local\LocalFactory; use OCA\DAVC\Service\Remote\RemoteFactory; use OCA\DAVC\Store\Local\ServiceEntity; use OCP\BackgroundJob\IJobList; -use OCP\Notification\IManager as INotificationManager; use Psr\Log\LoggerInterface; use Throwable; @@ -26,14 +23,13 @@ class CoreService { public function __construct( - private LoggerInterface $logger, - private IJobList $TaskService, - private INotificationManager $notificationManager, - private ConfigurationService $ConfigurationService, - private ServicesService $ServicesService, - private ServicesTemplateService $ServicesTemplateService, - private RemoteFactory $remoteFactory, - private LocalFactory $localFactory, + private readonly LoggerInterface $logger, + private readonly IJobList $TaskService, + private readonly ConfigurationService $ConfigurationService, + private readonly ServicesService $ServicesService, + private readonly ServicesTemplateService $ServicesTemplateService, + private readonly RemoteFactory $remoteFactory, + private readonly LocalFactory $localFactory, ) { } @@ -483,24 +479,4 @@ public function localCollectionsDeposit(string $uid, int $sid, array $cc, array } } - /** - * publish user notification - * - * @param string $uid nextcloud user id - * @param string $subject notification type - * @param array $params notification parameters to pass - */ - public function publishNotice(string $uid, string $subject, array $params): void { - // construct notification object - $notification = $this->notificationManager->createNotification(); - // assign attributes - $notification->setApp(Application::APP_ID) - ->setUser($uid) - ->setDateTime(new DateTime()) - ->setObject('eas', 'eas') - ->setSubject($subject, $params); - // submit notification - $this->notificationManager->notify($notification); - } - } diff --git a/lib/Service/HarmonizationService.php b/lib/Service/HarmonizationService.php index 6bbcfcd..02e0997 100644 --- a/lib/Service/HarmonizationService.php +++ b/lib/Service/HarmonizationService.php @@ -15,12 +15,12 @@ class HarmonizationService { public function __construct( - private LoggerInterface $logger, - private ConfigurationService $configurationService, - private ServicesService $servicesService, - private ContactsService $contactsService, - private EventsService $eventsService, - private RemoteFactory $remoteFactory, + private readonly LoggerInterface $logger, + private readonly ConfigurationService $configurationService, + private readonly ServicesService $servicesService, + private readonly ContactsService $contactsService, + private readonly EventsService $eventsService, + private readonly RemoteFactory $remoteFactory, ) { } diff --git a/lib/Service/Remote/RemoteFactory.php b/lib/Service/Remote/RemoteFactory.php index ad8355a..a042ac6 100644 --- a/lib/Service/Remote/RemoteFactory.php +++ b/lib/Service/Remote/RemoteFactory.php @@ -21,9 +21,9 @@ class RemoteFactory { public static string $clientTransportAgent = 'NextcloudDAVC/1.0 (1.0; x64)'; public function __construct( - private IClientService $clientService, - private IConfig $config, - private ConfigurationService $configurationService, + private readonly IClientService $clientService, + private readonly IConfig $config, + private readonly ConfigurationService $configurationService, ) { } @@ -76,16 +76,6 @@ private function logger(ServiceEntity $service): LoggerInterface { return new FileLogger($path); } - /** - * Appropriate Core Service for Connection - */ - public function coreService(RemoteClient $client): RemoteCoreService { - $service = new RemoteCoreService(); - $service->initialize($client); - - return $service; - } - /** * Appropriate Contacts Service for Connection */ diff --git a/lib/Service/ServicesTemplateService.php b/lib/Service/ServicesTemplateService.php index 5e25561..47e762e 100644 --- a/lib/Service/ServicesTemplateService.php +++ b/lib/Service/ServicesTemplateService.php @@ -16,13 +16,10 @@ class ServicesTemplateService { private ServicesTemplateStore $_Store; public function __construct(ServicesTemplateStore $store) { - $this->_Store = $store; - } public function findByDomain(string $domain): array { - return $this->_Store->fetchByDomain($domain); } @@ -32,7 +29,6 @@ public function findByDomain(string $domain): array { * @return array */ public function list(): array { - return array_map(static function (array $template): array { $template['connection'] = json_decode((string)$template['connection'], true) ?: []; return $template; @@ -48,7 +44,6 @@ public function list(): array { * @return bool */ public function create(string $domain, array $connection): bool { - return $this->_Store->create(UUID::v4(), $domain, $connection); } @@ -62,7 +57,6 @@ public function create(string $domain, array $connection): bool { * @return bool */ public function modify(string $id, string $domain, array $connection): bool { - return $this->_Store->modify($id, $domain, $connection); } @@ -74,7 +68,6 @@ public function modify(string $id, string $domain, array $connection): bool { * @return bool */ public function delete(string $id): bool { - return $this->_Store->delete($id); } diff --git a/lib/Settings/AdminSection.php b/lib/Settings/AdminSection.php index bf218f7..d66175c 100644 --- a/lib/Settings/AdminSection.php +++ b/lib/Settings/AdminSection.php @@ -18,51 +18,27 @@ */ class AdminSection implements IIconSection { - /** @var IL10N */ - private $l; - - /** @var IURLGenerator */ - private $urlGenerator; - - public function __construct(IURLGenerator $urlGenerator, IL10N $l) { - $this->l = $l; - $this->urlGenerator = $urlGenerator; + public function __construct( + private readonly IURLGenerator $urlGenerator, + private readonly IL10N $l, + ) { } - /** - * returns the ID of the section. It is supposed to be a lower case string - * - * @returns string - */ #[\Override] public function getID(): string { return 'integration-davc'; } - /** - * returns the translated name as it should be displayed, e.g. 'LDAP / AD - * integration'. Use the L10N service to translate it. - * - * @return string - */ #[\Override] public function getName(): string { return $this->l->t('DAV Connector'); } - /** - * @return int whether the form should be rather on the top or bottom of - * the settings navigation. The sections are arranged in ascending order of - * the priority values. It is required to return a value between 0 and 99. - */ #[\Override] public function getPriority(): int { return 80; } - /** - * @return ?string The relative path to a an icon describing the section - */ #[\Override] public function getIcon(): ?string { return $this->urlGenerator->imagePath('core', 'categories/integration.svg'); diff --git a/lib/Settings/AdminSettings.php b/lib/Settings/AdminSettings.php index 37ee1cb..e634b64 100644 --- a/lib/Settings/AdminSettings.php +++ b/lib/Settings/AdminSettings.php @@ -22,14 +22,11 @@ class AdminSettings implements ISettings { public function __construct( - private IInitialState $initialStateService, - private ConfigurationService $ConfigurationService, + private readonly IInitialState $initialStateService, + private readonly ConfigurationService $ConfigurationService, ) { } - /** - * @return TemplateResponse - */ #[\Override] public function getForm(): TemplateResponse { Util::addScript(Application::APP_ID, Application::APP_ID . '-AdminSettings'); diff --git a/lib/Settings/UserSection.php b/lib/Settings/UserSection.php index 802840a..dcd34ff 100644 --- a/lib/Settings/UserSection.php +++ b/lib/Settings/UserSection.php @@ -18,51 +18,27 @@ */ class UserSection implements IIconSection { - /** @var IL10N */ - private $l; - - /** @var IURLGenerator */ - private $urlGenerator; - - public function __construct(IURLGenerator $urlGenerator, IL10N $l) { - $this->l = $l; - $this->urlGenerator = $urlGenerator; + public function __construct( + private readonly IURLGenerator $urlGenerator, + private readonly IL10N $l, + ) { } - /** - * returns the ID of the section. It is supposed to be a lower case string - * - * @returns string - */ #[\Override] public function getID(): string { return 'connected-accounts'; //or a generic id if feasible } - /** - * returns the translated name as it should be displayed, e.g. 'LDAP / AD - * integration'. Use the L10N service to translate it. - * - * @return string - */ #[\Override] public function getName(): string { return $this->l->t('Connected accounts'); } - /** - * @return int whether the form should be rather on the top or bottom of - * the settings navigation. The sections are arranged in ascending order of - * the priority values. It is required to return a value between 0 and 99. - */ #[\Override] public function getPriority(): int { return 70; } - /** - * @return ?string The relative path to a an icon describing the section - */ #[\Override] public function getIcon(): ?string { return $this->urlGenerator->imagePath('core', 'categories/integration.svg'); diff --git a/lib/Settings/UserSettings.php b/lib/Settings/UserSettings.php index c9a8bcb..d7dbe5f 100644 --- a/lib/Settings/UserSettings.php +++ b/lib/Settings/UserSettings.php @@ -22,15 +22,11 @@ class UserSettings implements ISettings { public function __construct( - private IInitialState $initialStateService, - private ConfigurationService $configurationService, - private string $userId, + private readonly IInitialState $initialStateService, + private readonly ConfigurationService $configurationService, ) { } - /** - * @return TemplateResponse - */ #[\Override] public function getForm(): TemplateResponse { Util::addScript(Application::APP_ID, Application::APP_ID . '-UserSettings'); diff --git a/lib/Store/Common/Filters/FilterBase.php b/lib/Store/Common/Filters/FilterBase.php index 1dad079..bbe5e48 100644 --- a/lib/Store/Common/Filters/FilterBase.php +++ b/lib/Store/Common/Filters/FilterBase.php @@ -14,40 +14,21 @@ class FilterBase implements IFilter { protected array $attributes = []; protected array $conditions = []; - /** - * - * @since 1.0.0 - * - * @return array - */ #[\Override] public function attributes(): array { return $this->attributes; } - /** - * - * @since 1.0.0 - */ #[\Override] - public function comparators(): FilterComparisonOperator { - return new FilterComparisonOperator; + public function comparators(): array { + return FilterComparisonOperator::cases(); } - /** - * - * @since 1.0.0 - */ #[\Override] - public function conjunctions(): FilterConjunctionOperator { - return new FilterConjunctionOperator; + public function conjunctions(): array { + return FilterConjunctionOperator::cases(); } - /** - * - * @since 1.0.0 - * - */ #[\Override] public function condition(string $attribute, mixed $value, FilterComparisonOperator $comparator = FilterComparisonOperator::EQ, FilterConjunctionOperator $conjunction = FilterConjunctionOperator::AND): void { if (!isset($this->properties[$attribute])) { @@ -60,12 +41,6 @@ public function condition(string $attribute, mixed $value, FilterComparisonOpera } } - /** - * - * @since 1.0.0 - * - * @return array - */ #[\Override] public function conditions(): array { return $this->conditions; diff --git a/lib/Store/Common/Filters/IFilter.php b/lib/Store/Common/Filters/IFilter.php index a71ba1c..0f6124a 100644 --- a/lib/Store/Common/Filters/IFilter.php +++ b/lib/Store/Common/Filters/IFilter.php @@ -12,35 +12,33 @@ interface IFilter { /** - * - * @since 1.0.0 + * List of attributes that are available for filtering * * @return array */ public function attributes(): array; /** + * List of comparators that are available for filtering * - * @since 1.0.0 + * @return list */ - public function comparators(): FilterComparisonOperator; + public function comparators(): array; /** + * List of conjunctions that are available for filtering * - * @since 1.0.0 + * @return list */ - public function conjunctions(): FilterConjunctionOperator; + public function conjunctions(): array; /** - * - * @since 1.0.0 - * + * Adds a condition to the filter */ - public function condition(string $property, mixed $value, FilterComparisonOperator $comparator = FilterComparisonOperator::EQ, FilterConjunctionOperator $conjunction = FilterConjunctionOperator::AND): void; + public function condition(string $attribute, mixed $value, FilterComparisonOperator $comparator = FilterComparisonOperator::EQ, FilterConjunctionOperator $conjunction = FilterConjunctionOperator::AND): void; /** - * - * @since 1.0.0 + * List of conditions that have been added to the filter * * @return array */ diff --git a/lib/Store/Common/Sort/ISort.php b/lib/Store/Common/Sort/ISort.php index be0f67d..221a878 100644 --- a/lib/Store/Common/Sort/ISort.php +++ b/lib/Store/Common/Sort/ISort.php @@ -24,7 +24,7 @@ public function attributes(): array; * @param string $attribute attribute name * @param bool $direction true for ascending, false for descending */ - public function condition(string $property, bool $direction): void; + public function condition(string $attribute, bool $direction): void; /** * retrieve sorting conditions diff --git a/lib/Utile/UUID.php b/lib/Utile/UUID.php index f963f14..5d12615 100644 --- a/lib/Utile/UUID.php +++ b/lib/Utile/UUID.php @@ -20,56 +20,6 @@ class UUID { - /** - * Generates version 3 UUID - * - * Version 3 are named based. They require a namespace (another valid UUID) and a value (the name). - * - * @param string $namespace another valid UUID - * @param string $name random value - * - * @return string a version 3 UUID - */ - public static function v3($namespace, $name) { - if (!self::is_valid($namespace)) { - return false; - } - - // Get hexadecimal components of namespace - $nhex = str_replace(['-','{','}'], '', $namespace); - - // Binary Value - $nstr = ''; - - // Convert Namespace UUID to bits - for ($i = 0; $i < strlen($nhex); $i += 2) { - $nstr .= chr(hexdec($nhex[$i] . $nhex[$i + 1])); - } - - // Calculate hash value - $hash = md5($nstr . $name); - - return sprintf('%08s-%04s-%04x-%04x-%12s', - // 32 bits for "time_low" - substr($hash, 0, 8), - - // 16 bits for "time_mid" - substr($hash, 8, 4), - - // 16 bits for "time_hi_and_version", - // four most significant bits holds version number 3 - (hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x3000, - - // 16 bits, 8 bits for "clk_seq_hi_res", - // 8 bits for "clk_seq_low", - // two most significant bits holds zero and one for variant DCE1.1 - (hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000, - - // 48 bits for "node" - substr($hash, 20, 12) - ); - } - /** * Generates version 4 UUID * @@ -97,56 +47,6 @@ public static function v4() { ); } - /** - * Generates version 5 UUID - * - * Version 5 are named based. They require a namespace (another valid UUID) and a value (the name). - * - * @param string $namespace another valid UUID - * @param string $name random value - * - * @return string a version 5 UUID - */ - public static function v5($namespace, $name) { - if (!self::is_valid($namespace)) { - return false; - } - - // Get hexadecimal components of namespace - $nhex = str_replace(['-','{','}'], '', $namespace); - - // Binary Value - $nstr = ''; - - // Convert Namespace UUID to bits - for ($i = 0; $i < strlen($nhex); $i += 2) { - $nstr .= chr(hexdec($nhex[$i] . $nhex[$i + 1])); - } - - // Calculate hash value - $hash = sha1($nstr . $name); - - return sprintf('%08s-%04s-%04x-%04x-%12s', - // 32 bits for "time_low" - substr($hash, 0, 8), - - // 16 bits for "time_mid" - substr($hash, 8, 4), - - // 16 bits for "time_hi_and_version", - // four most significant bits holds version number 5 - (hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x5000, - - // 16 bits, 8 bits for "clk_seq_hi_res", - // 8 bits for "clk_seq_low", - // two most significant bits holds zero and one for variant DCE1.1 - (hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000, - - // 48 bits for "node" - substr($hash, 20, 12) - ); - } - /** * Validates UUID * diff --git a/psalm.xml b/psalm.xml index 4ca7e25..3c12f91 100644 --- a/psalm.xml +++ b/psalm.xml @@ -31,6 +31,7 @@ + diff --git a/tests/php/unit/Service/CoreServiceTest.php b/tests/php/unit/Service/CoreServiceTest.php index 3bc2a4c..b912da7 100644 --- a/tests/php/unit/Service/CoreServiceTest.php +++ b/tests/php/unit/Service/CoreServiceTest.php @@ -19,7 +19,6 @@ use OCA\DAVC\Service\ServicesTemplateService; use OCA\DAVC\Store\Local\ServiceEntity; use OCP\BackgroundJob\IJobList; -use OCP\Notification\IManager as INotificationManager; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; @@ -30,8 +29,6 @@ class CoreServiceTest extends TestCase { private IJobList&MockObject $jobList; - private INotificationManager&MockObject $notificationManager; - private ConfigurationService&MockObject $configurationService; private ServicesService&MockObject $servicesService; @@ -49,7 +46,6 @@ protected function setUp(): void { $this->logger = $this->createMock(LoggerInterface::class); $this->jobList = $this->createMock(IJobList::class); - $this->notificationManager = $this->createMock(INotificationManager::class); $this->configurationService = $this->createMock(ConfigurationService::class); $this->servicesService = $this->createMock(ServicesService::class); $this->servicesTemplateService = $this->createMock(ServicesTemplateService::class); @@ -59,7 +55,6 @@ protected function setUp(): void { $this->service = new CoreService( $this->logger, $this->jobList, - $this->notificationManager, $this->configurationService, $this->servicesService, $this->servicesTemplateService,