This is an automated email from the ASF dual-hosted git repository.

zehnder pushed a commit to branch 
4287-migrate-angular-ui-from-constructor-injection-to-inject
in repository https://gitbox.apache.org/repos/asf/streampipes.git

commit 45ad9e030c5cc355006f54643e3ff5ae938baefc
Author: Philipp Zehnder <[email protected]>
AuthorDate: Tue Mar 24 10:05:11 2026 +0100

    migrate configuration UI to inject()
---
 .../extensions-installation.component.ts           |  13 +-
 .../extensions-service-details-dialog.component.ts |   9 +-
 .../file-rename/file-rename-dialog.component.ts    |   8 +-
 .../file-upload/file-upload-dialog.component.ts    |   8 +-
 .../email-configuration.component.ts               |  16 +-
 .../email-template-configuration.component.ts      |   8 +-
 .../export/data-export-import.component.ts         |  16 +-
 .../configuration/export/data-export.service.ts    |   8 +-
 .../export-dialog/data-export-dialog.component.ts  |  11 +-
 .../import-dialog/data-import-dialog.component.ts  |   9 +-
 .../endpoint-item/endpoint-item.component.ts       |  27 ++-
 .../extensions-installation.component.ts           |  18 +-
 .../extensions-installation.service.ts             |   8 +-
 .../extensions-service-configuration.component.ts  |   6 +-
 .../service-configs-boolean.component.ts           |   5 +-
 .../service-configs-number.component.ts            |   5 +-
 .../service-configs-password.component.ts          |   6 +-
 .../service-configs-text.component.ts              |   5 +-
 .../extensions-service-management.component.ts     |  10 +-
 .../registered-extensions-services.component.ts    |  12 +-
 .../files/file-overview/file-overview.component.ts |  12 +-
 ui/src/app/configuration/files/files.component.ts  |  14 +-
 .../general-configuration.component.ts             |  20 +-
 .../label-configuration.component.ts               |  12 +-
 .../authentication-configuration.component.ts      |   4 +-
 .../edit-group-dialog.component.ts                 |  20 +-
 .../edit-role-dialog/edit-role-dialog.component.ts |  14 +-
 .../edit-user-dialog/edit-user-dialog.component.ts |  32 +--
 .../role-configuration.component.ts                |  14 +-
 .../user-group-configuration.component.ts          |  14 +-
 .../configuration/shared/configuration.service.ts  | 226 ++++++++++-----------
 .../location-features-configuration.component.ts   |  14 +-
 .../site-area-configuration.component.ts           |  12 +-
 33 files changed, 300 insertions(+), 316 deletions(-)

diff --git 
a/ui/src/app/configuration/dialog/extensions-installation/extensions-installation.component.ts
 
b/ui/src/app/configuration/dialog/extensions-installation/extensions-installation.component.ts
index 2913618dc0..efc89cbd58 100644
--- 
a/ui/src/app/configuration/dialog/extensions-installation/extensions-installation.component.ts
+++ 
b/ui/src/app/configuration/dialog/extensions-installation/extensions-installation.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input } from '@angular/core';
+import { Component, Input, inject } from '@angular/core';
 import { DialogRef } from '@streampipes/shared-ui';
 import {
     ExtensionInstallationService,
@@ -43,6 +43,11 @@ import { MatButton } from '@angular/material/button';
     ],
 })
 export class SpExtensionsInstallationDialogComponent {
+    private dialogRef =
+        inject<DialogRef<SpExtensionsInstallationDialogComponent>>(DialogRef);
+    private extensionInstallationService = 
inject(ExtensionInstallationService);
+    private translateService = inject(TranslateService);
+
     endpointItems: ExtensionItemDescription[];
 
     @Input()
@@ -61,11 +66,7 @@ export class SpExtensionsInstallationDialogComponent {
 
     installAsPublicElement = true;
 
-    constructor(
-        private dialogRef: DialogRef<SpExtensionsInstallationDialogComponent>,
-        private extensionInstallationService: ExtensionInstallationService,
-        private translateService: TranslateService,
-    ) {
+    constructor() {
         this.installationStatus = [];
         this.installationFinished = false;
         this.page = 'preview';
diff --git 
a/ui/src/app/configuration/dialog/extensions-service-details/extensions-service-details-dialog.component.ts
 
b/ui/src/app/configuration/dialog/extensions-service-details/extensions-service-details-dialog.component.ts
index fef9b789e5..30b9660dee 100644
--- 
a/ui/src/app/configuration/dialog/extensions-service-details/extensions-service-details-dialog.component.ts
+++ 
b/ui/src/app/configuration/dialog/extensions-service-details/extensions-service-details-dialog.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input } from '@angular/core';
+import { Component, Input, inject } from '@angular/core';
 import { DialogRef } from '@streampipes/shared-ui';
 import { SpServiceRegistration } from '@streampipes/platform-services';
 import {
@@ -42,13 +42,12 @@ import { TranslatePipe } from '@ngx-translate/core';
     ],
 })
 export class SpExtensionsServiceDetailsDialogComponent {
+    private dialogRef =
+        
inject<DialogRef<SpExtensionsServiceDetailsDialogComponent>>(DialogRef);
+
     @Input()
     serviceReg: SpServiceRegistration;
 
-    constructor(
-        private dialogRef: 
DialogRef<SpExtensionsServiceDetailsDialogComponent>,
-    ) {}
-
     close() {
         this.dialogRef.close();
     }
diff --git 
a/ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.ts 
b/ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.ts
index 5676b720aa..4a43a443f5 100644
--- 
a/ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.ts
+++ 
b/ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Inject } from '@angular/core';
+import { Component, inject } from '@angular/core';
 import { DialogRef } from '@angular/cdk/dialog';
 import { MAT_DIALOG_DATA, MatDialogClose } from '@angular/material/dialog';
 import {
@@ -49,10 +49,8 @@ import { TranslatePipe } from '@ngx-translate/core';
     ],
 })
 export class FileRenameDialogComponent {
-    constructor(
-        private dialogRef: DialogRef<FileRenameDialogComponent>,
-        @Inject(MAT_DIALOG_DATA) public fileName: string,
-    ) {}
+    private dialogRef = 
inject<DialogRef<FileRenameDialogComponent>>(DialogRef);
+    fileName = inject(MAT_DIALOG_DATA);
 
     cancel() {
         this.dialogRef.close();
diff --git 
a/ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.ts 
b/ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.ts
index 6555a252c6..de2d8af2cd 100644
--- 
a/ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.ts
+++ 
b/ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.ts
@@ -60,6 +60,9 @@ import { MatDivider } from '@angular/material/divider';
     ],
 })
 export class FileUploadDialogComponent {
+    private dialogRef = 
inject<DialogRef<FileUploadDialogComponent>>(DialogRef);
+    private filesService = inject(FilesService);
+
     private translateService = inject(TranslateService);
     inputValue: string;
     fileNames: string[] = [];
@@ -76,11 +79,6 @@ export class FileUploadDialogComponent {
     uploadError = false;
     uploadErrorMessage = '';
 
-    constructor(
-        private dialogRef: DialogRef<FileUploadDialogComponent>,
-        private filesService: FilesService,
-    ) {}
-
     handleFileInput(files: FileList) {
         this.selectedUploadFiles = files;
         for (let i = 0; i < files.length; i++) {
diff --git 
a/ui/src/app/configuration/email-configuration/email-configuration.component.ts 
b/ui/src/app/configuration/email-configuration/email-configuration.component.ts
index dbda4a3069..4b10c9e5c2 100644
--- 
a/ui/src/app/configuration/email-configuration/email-configuration.component.ts
+++ 
b/ui/src/app/configuration/email-configuration/email-configuration.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, inject } from '@angular/core';
 import {
     FormsModule,
     ReactiveFormsModule,
@@ -78,6 +78,12 @@ import { MatDivider } from '@angular/material/divider';
     ],
 })
 export class EmailConfigurationComponent implements OnInit {
+    private fb = inject(UntypedFormBuilder);
+    private mailConfigService = inject(MailConfigService);
+    private breadcrumbService = inject(SpBreadcrumbService);
+    private tabService = inject(SpConfigurationTabsService);
+    private translateService = inject(TranslateService);
+
     tabs: SpNavigationItem[] = [];
 
     parentForm: UntypedFormGroup;
@@ -91,14 +97,6 @@ export class EmailConfigurationComponent implements OnInit {
     sendingTestMailSuccess = false;
     sendingEmailErrorMessage = '';
 
-    constructor(
-        private fb: UntypedFormBuilder,
-        private mailConfigService: MailConfigService,
-        private breadcrumbService: SpBreadcrumbService,
-        private tabService: SpConfigurationTabsService,
-        private translateService: TranslateService,
-    ) {}
-
     ngOnInit(): void {
         this.tabs = this.tabService.getTabs();
         this.breadcrumbService.updateBreadcrumb([
diff --git 
a/ui/src/app/configuration/email-configuration/email-template-configuration/email-template-configuration.component.ts
 
b/ui/src/app/configuration/email-configuration/email-template-configuration/email-template-configuration.component.ts
index 7280a64b67..79e73e0cf4 100644
--- 
a/ui/src/app/configuration/email-configuration/email-template-configuration/email-template-configuration.component.ts
+++ 
b/ui/src/app/configuration/email-configuration/email-template-configuration/email-template-configuration.component.ts
@@ -56,6 +56,9 @@ import type { editor as MonacoEditor } from 'monaco-editor';
     ],
 })
 export class SpEmailTemplateConfigurationComponent implements OnInit {
+    private fb = inject(UntypedFormBuilder);
+    private mailConfigService = inject(MailConfigService);
+
     template: EmailTemplate;
     originalTemplate: string;
     templateLoaded = false;
@@ -97,11 +100,6 @@ export class SpEmailTemplateConfigurationComponent 
implements OnInit {
         },
     ];
 
-    constructor(
-        private fb: UntypedFormBuilder,
-        private mailConfigService: MailConfigService,
-    ) {}
-
     ngOnInit(): void {
         this.loadTemplate();
     }
diff --git a/ui/src/app/configuration/export/data-export-import.component.ts 
b/ui/src/app/configuration/export/data-export-import.component.ts
index c78c913f5c..4b979170c0 100644
--- a/ui/src/app/configuration/export/data-export-import.component.ts
+++ b/ui/src/app/configuration/export/data-export-import.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, inject } from '@angular/core';
 import {
     DialogService,
     PanelType,
@@ -58,19 +58,17 @@ import { MatButton } from '@angular/material/button';
     ],
 })
 export class SpDataExportImportComponent implements OnInit {
+    private breadcrumbService = inject(SpBreadcrumbService);
+    private assetManagementService = inject(AssetManagementService);
+    private dialogService = inject(DialogService);
+    private tabService = inject(SpConfigurationTabsService);
+    private translateService = inject(TranslateService);
+
     tabs: SpNavigationItem[] = [];
 
     assets: SpAsset[];
     selectedAssets: string[] = [];
 
-    constructor(
-        private breadcrumbService: SpBreadcrumbService,
-        private assetManagementService: AssetManagementService,
-        private dialogService: DialogService,
-        private tabService: SpConfigurationTabsService,
-        private translateService: TranslateService,
-    ) {}
-
     ngOnInit(): void {
         this.tabs = this.tabService.getTabs();
         this.breadcrumbService.updateBreadcrumb([
diff --git a/ui/src/app/configuration/export/data-export.service.ts 
b/ui/src/app/configuration/export/data-export.service.ts
index 61082b7612..05501336b7 100644
--- a/ui/src/app/configuration/export/data-export.service.ts
+++ b/ui/src/app/configuration/export/data-export.service.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Injectable } from '@angular/core';
+import { Injectable, inject } from '@angular/core';
 import {
     AssetExportConfiguration,
     ExportConfiguration,
@@ -33,10 +33,8 @@ import { map } from 'rxjs/operators';
 
 @Injectable({ providedIn: 'root' })
 export class DataExportService {
-    constructor(
-        private platformServicesCommons: PlatformServicesCommons,
-        private http: HttpClient,
-    ) {}
+    private platformServicesCommons = inject(PlatformServicesCommons);
+    private http = inject(HttpClient);
 
     getExportPreview(assetIds: string[]): Observable<ExportConfiguration> {
         return this.http
diff --git 
a/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.ts 
b/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.ts
index 3e8d5156f7..55282c7145 100644
--- 
a/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.ts
+++ 
b/ui/src/app/configuration/export/export-dialog/data-export-dialog.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input, OnInit } from '@angular/core';
+import { Component, Input, OnInit, inject } from '@angular/core';
 import { DialogRef } from '@streampipes/shared-ui';
 import { DataExportService } from '../data-export.service';
 import { ExportConfiguration } from '@streampipes/platform-services';
@@ -48,17 +48,16 @@ import { TranslatePipe } from '@ngx-translate/core';
     ],
 })
 export class SpDataExportDialogComponent implements OnInit {
+    private dialogRef =
+        inject<DialogRef<SpDataExportDialogComponent>>(DialogRef);
+    private dataExportService = inject(DataExportService);
+
     @Input()
     selectedAssets: string[];
 
     preview: ExportConfiguration;
     exportInProgress = false;
 
-    constructor(
-        private dialogRef: DialogRef<SpDataExportDialogComponent>,
-        private dataExportService: DataExportService,
-    ) {}
-
     ngOnInit(): void {
         this.dataExportService
             .getExportPreview(this.selectedAssets)
diff --git 
a/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.ts 
b/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.ts
index 1011c4f32c..45093e3416 100644
--- 
a/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.ts
+++ 
b/ui/src/app/configuration/export/import-dialog/data-import-dialog.component.ts
@@ -79,6 +79,10 @@ import { MatDivider } from '@angular/material/divider';
     ],
 })
 export class SpDataImportDialogComponent {
+    private dialogRef =
+        inject<DialogRef<SpDataImportDialogComponent>>(DialogRef);
+    private dataExportService = inject(DataExportService);
+
     private translateService = inject(TranslateService);
     currentImportStep = 0;
 
@@ -94,11 +98,6 @@ export class SpDataImportDialogComponent {
     uploadStatus = 0;
     uploadError = false;
 
-    constructor(
-        private dialogRef: DialogRef<SpDataImportDialogComponent>,
-        private dataExportService: DataExportService,
-    ) {}
-
     handleFileInput(files: any) {
         this.hasInput = true;
         this.uploadError = false;
diff --git 
a/ui/src/app/configuration/extensions-installation/endpoint-item/endpoint-item.component.ts
 
b/ui/src/app/configuration/extensions-installation/endpoint-item/endpoint-item.component.ts
index 24920fef24..c05a9b9bf1 100644
--- 
a/ui/src/app/configuration/extensions-installation/endpoint-item/endpoint-item.component.ts
+++ 
b/ui/src/app/configuration/extensions-installation/endpoint-item/endpoint-item.component.ts
@@ -16,7 +16,14 @@
  *
  */
 
-import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import {
+    Component,
+    EventEmitter,
+    Input,
+    OnInit,
+    Output,
+    inject,
+} from '@angular/core';
 import { MatSnackBar } from '@angular/material/snack-bar';
 import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
 import {
@@ -65,6 +72,14 @@ import { MatIcon } from '@angular/material/icon';
     ],
 })
 export class EndpointItemComponent implements OnInit {
+    private snackBar = inject(MatSnackBar);
+    private extensionInstallationService = 
inject(ExtensionInstallationService);
+    private addService = inject(ExtensionsInstallationService);
+    private sanitizer = inject(DomSanitizer);
+    appConstants = inject(AppConstants);
+    private dialogService = inject(DialogService);
+    private translateService = inject(TranslateService);
+
     @Input()
     item: ExtensionItemDescription;
 
@@ -89,16 +104,6 @@ export class EndpointItemComponent implements OnInit {
     @Output()
     triggerInstallation: EventEmitter<any> = new EventEmitter<any>();
 
-    constructor(
-        private snackBar: MatSnackBar,
-        private extensionInstallationService: ExtensionInstallationService,
-        private addService: ExtensionsInstallationService,
-        private sanitizer: DomSanitizer,
-        public appConstants: AppConstants,
-        private dialogService: DialogService,
-        private translateService: TranslateService,
-    ) {}
-
     ngOnInit(): void {
         this.findItemTypeTitle();
         this.findItemStyle();
diff --git 
a/ui/src/app/configuration/extensions-installation/extensions-installation.component.ts
 
b/ui/src/app/configuration/extensions-installation/extensions-installation.component.ts
index bfd5f1179d..1ec6d98159 100644
--- 
a/ui/src/app/configuration/extensions-installation/extensions-installation.component.ts
+++ 
b/ui/src/app/configuration/extensions-installation/extensions-installation.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
+import { ChangeDetectorRef, Component, OnInit, inject } from '@angular/core';
 import {
     DialogRef,
     DialogService,
@@ -85,6 +85,13 @@ import { PipelineElementTypeFilter } from 
'./filter/pipeline-element-type.pipe';
     ],
 })
 export class SpExtensionsInstallationComponent implements OnInit {
+    private addService = inject(ExtensionsInstallationService);
+    private dialogService = inject(DialogService);
+    private changeDetectorRef = inject(ChangeDetectorRef);
+    private breadcrumbService = inject(SpBreadcrumbService);
+    private tabService = inject(SpConfigurationTabsService);
+    private translateService = inject(TranslateService);
+
     tabs: SpNavigationItem[] = [];
 
     activeLink: string;
@@ -101,14 +108,7 @@ export class SpExtensionsInstallationComponent implements 
OnInit {
     _filterTerm = '';
     _selectedInstallationStatus = 'all';
 
-    constructor(
-        private addService: ExtensionsInstallationService,
-        private dialogService: DialogService,
-        private changeDetectorRef: ChangeDetectorRef,
-        private breadcrumbService: SpBreadcrumbService,
-        private tabService: SpConfigurationTabsService,
-        private translateService: TranslateService,
-    ) {
+    constructor() {
         this.results = [];
         this.loading = false;
         this.endpointItems = [];
diff --git 
a/ui/src/app/configuration/extensions-installation/extensions-installation.service.ts
 
b/ui/src/app/configuration/extensions-installation/extensions-installation.service.ts
index 4e0109a42f..11698b4714 100644
--- 
a/ui/src/app/configuration/extensions-installation/extensions-installation.service.ts
+++ 
b/ui/src/app/configuration/extensions-installation/extensions-installation.service.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Injectable } from '@angular/core';
+import { Injectable, inject } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import {
     ExtensionItemDescription,
@@ -27,10 +27,8 @@ import { map } from 'rxjs/operators';
 
 @Injectable({ providedIn: 'root' })
 export class ExtensionsInstallationService {
-    constructor(
-        private http: HttpClient,
-        private platformServicesCommons: PlatformServicesCommons,
-    ) {}
+    private http = inject(HttpClient);
+    private platformServicesCommons = inject(PlatformServicesCommons);
 
     getExtensionItems(): Observable<ExtensionItemDescription[]> {
         return this.http
diff --git 
a/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/extensions-service-configuration.component.ts
 
b/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/extensions-service-configuration.component.ts
index 2f90c334d8..4fda7afd55 100644
--- 
a/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/extensions-service-configuration.component.ts
+++ 
b/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/extensions-service-configuration.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, ViewChild } from '@angular/core';
+import { Component, ViewChild, inject } from '@angular/core';
 import { MatPaginator } from '@angular/material/paginator';
 import {
     MatCell,
@@ -90,6 +90,8 @@ import { TranslatePipe } from '@ngx-translate/core';
     ],
 })
 export class SpExtensionsServiceConfigurationComponent {
+    private configurationService = inject(ConfigurationService);
+
     displayedColumns: string[] = ['group', 'name', 'action'];
     @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator;
     dataSource = new MatTableDataSource<SpServiceConfiguration>();
@@ -97,7 +99,7 @@ export class SpExtensionsServiceConfigurationComponent {
     expandedElement: any;
     serviceConfiguration: SpServiceConfiguration[];
 
-    constructor(private configurationService: ConfigurationService) {
+    constructor() {
         this.getConfigurationServices();
     }
 
diff --git 
a/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-boolean/service-configs-boolean.component.ts
 
b/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-boolean/service-configs-boolean.component.ts
index 022bce1b42..5638d6cbbe 100644
--- 
a/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-boolean/service-configs-boolean.component.ts
+++ 
b/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-boolean/service-configs-boolean.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input } from '@angular/core';
+import { Component, Input, inject } from '@angular/core';
 import { ConfigurationService } from 
'../../../../shared/configuration.service';
 import { ConfigItem } from '@streampipes/platform-services';
 import {
@@ -44,6 +44,7 @@ import { MatTooltip } from '@angular/material/tooltip';
     ],
 })
 export class ServiceConfigsBooleanComponent {
+    configService = inject(ConfigurationService);
+
     @Input() configuration: ConfigItem;
-    constructor(public configService: ConfigurationService) {}
 }
diff --git 
a/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-number/service-configs-number.component.ts
 
b/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-number/service-configs-number.component.ts
index 4883422451..87b16e31ef 100644
--- 
a/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-number/service-configs-number.component.ts
+++ 
b/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-number/service-configs-number.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input } from '@angular/core';
+import { Component, Input, inject } from '@angular/core';
 import { ConfigurationService } from 
'../../../../shared/configuration.service';
 import { ConfigItem } from '@streampipes/platform-services';
 import { MatFormField } from '@angular/material/form-field';
@@ -30,6 +30,7 @@ import { FormsModule } from '@angular/forms';
     imports: [MatFormField, FlexDirective, MatInput, FormsModule],
 })
 export class ServiceConfigsNumberComponent {
+    configService = inject(ConfigurationService);
+
     @Input() configuration: ConfigItem;
-    constructor(public configService: ConfigurationService) {}
 }
diff --git 
a/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-password/service-configs-password.component.ts
 
b/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-password/service-configs-password.component.ts
index e567ffcd89..d793747b68 100644
--- 
a/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-password/service-configs-password.component.ts
+++ 
b/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-password/service-configs-password.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input } from '@angular/core';
+import { Component, Input, inject } from '@angular/core';
 import { ConfigurationService } from 
'../../../../shared/configuration.service';
 import { ConfigItem } from '@streampipes/platform-services';
 import {
@@ -51,6 +51,8 @@ const hiddenPasswordString = '*****';
     ],
 })
 export class ServiceConfigsPasswordComponent {
+    configService = inject(ConfigurationService);
+
     @Input() configuration: ConfigItem;
 
     password: string;
@@ -58,7 +60,7 @@ export class ServiceConfigsPasswordComponent {
     className: string;
     private hide: boolean;
 
-    constructor(public configService: ConfigurationService) {
+    constructor() {
         this.password = hiddenPasswordString;
         this.show = false;
         this.className = 'hideText';
diff --git 
a/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-text/service-configs-text.component.ts
 
b/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-text/service-configs-text.component.ts
index 06a701077b..651c9cafa1 100644
--- 
a/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-text/service-configs-text.component.ts
+++ 
b/ui/src/app/configuration/extensions-service-management/extensions-service-configuration/service-configs/service-configs-text/service-configs-text.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input } from '@angular/core';
+import { Component, Input, inject } from '@angular/core';
 import { ConfigurationService } from 
'../../../../shared/configuration.service';
 import { ConfigItem } from '@streampipes/platform-services';
 import { MatFormField, MatSuffix } from '@angular/material/form-field';
@@ -41,6 +41,7 @@ import { MatTooltip } from '@angular/material/tooltip';
     ],
 })
 export class ServiceConfigsTextComponent {
+    configService = inject(ConfigurationService);
+
     @Input() configuration: ConfigItem;
-    constructor(public configService: ConfigurationService) {}
 }
diff --git 
a/ui/src/app/configuration/extensions-service-management/extensions-service-management.component.ts
 
b/ui/src/app/configuration/extensions-service-management/extensions-service-management.component.ts
index 56be884e2a..20a639093d 100644
--- 
a/ui/src/app/configuration/extensions-service-management/extensions-service-management.component.ts
+++ 
b/ui/src/app/configuration/extensions-service-management/extensions-service-management.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, inject } from '@angular/core';
 import { SpConfigurationTabsService } from '../configuration-tabs.service';
 import {
     SpBasicNavTabsComponent,
@@ -51,12 +51,10 @@ import { TranslatePipe } from '@ngx-translate/core';
     ],
 })
 export class ExtensionsServiceManagementComponent implements OnInit {
-    tabs: SpNavigationItem[] = [];
+    private breadcrumbService = inject(SpBreadcrumbService);
+    private tabService = inject(SpConfigurationTabsService);
 
-    constructor(
-        private breadcrumbService: SpBreadcrumbService,
-        private tabService: SpConfigurationTabsService,
-    ) {}
+    tabs: SpNavigationItem[] = [];
 
     ngOnInit() {
         this.tabs = this.tabService.getTabs();
diff --git 
a/ui/src/app/configuration/extensions-service-management/registered-extensions-services/registered-extensions-services.component.ts
 
b/ui/src/app/configuration/extensions-service-management/registered-extensions-services/registered-extensions-services.component.ts
index bd1179b48a..9492e12313 100644
--- 
a/ui/src/app/configuration/extensions-service-management/registered-extensions-services/registered-extensions-services.component.ts
+++ 
b/ui/src/app/configuration/extensions-service-management/registered-extensions-services/registered-extensions-services.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, ViewChild } from '@angular/core';
+import { Component, ViewChild, inject } from '@angular/core';
 import { MatPaginator } from '@angular/material/paginator';
 import {
     MatCell,
@@ -70,15 +70,15 @@ import { MatTooltip } from '@angular/material/tooltip';
     ],
 })
 export class SpRegisteredExtensionsServiceComponent {
+    private configurationService = inject(ConfigurationService);
+    private dialogService = inject(DialogService);
+    private translateService = inject(TranslateService);
+
     displayedColumns: string[] = ['status', 'name', 'group', 'action'];
     @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator;
     dataSource = new MatTableDataSource<SpServiceRegistration>();
 
-    constructor(
-        private configurationService: ConfigurationService,
-        private dialogService: DialogService,
-        private translateService: TranslateService,
-    ) {
+    constructor() {
         this.getRegisteredServices();
     }
 
diff --git 
a/ui/src/app/configuration/files/file-overview/file-overview.component.ts 
b/ui/src/app/configuration/files/file-overview/file-overview.component.ts
index 5a9edb947b..99bb8b7809 100644
--- a/ui/src/app/configuration/files/file-overview/file-overview.component.ts
+++ b/ui/src/app/configuration/files/file-overview/file-overview.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, inject } from '@angular/core';
 import { FileMetadata, FilesService } from '@streampipes/platform-services';
 import {
     MatCell,
@@ -65,6 +65,10 @@ import { DatePipe } from '@angular/common';
     ],
 })
 export class FileOverviewComponent implements OnInit {
+    private filesService = inject(FilesService);
+    private dialog = inject(MatDialog);
+    private translateService = inject(TranslateService);
+
     displayedColumns: string[] = ['filename', 'filetype', 'uploaded', 
'action'];
 
     dataSource: MatTableDataSource<FileMetadata> = new MatTableDataSource();
@@ -72,12 +76,6 @@ export class FileOverviewComponent implements OnInit {
 
     private fileTypeColors: { [key: string]: string } = {};
 
-    constructor(
-        private filesService: FilesService,
-        private dialog: MatDialog,
-        private translateService: TranslateService,
-    ) {}
-
     ngOnInit() {
         this.refreshFiles();
     }
diff --git a/ui/src/app/configuration/files/files.component.ts 
b/ui/src/app/configuration/files/files.component.ts
index 6de5567e32..a0d455ace3 100644
--- a/ui/src/app/configuration/files/files.component.ts
+++ b/ui/src/app/configuration/files/files.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, OnInit, ViewChild } from '@angular/core';
+import { Component, OnInit, ViewChild, inject } from '@angular/core';
 import {
     DialogService,
     PanelType,
@@ -54,17 +54,15 @@ import { FileOverviewComponent } from 
'./file-overview/file-overview.component';
     ],
 })
 export class FilesComponent implements OnInit {
+    private dialogService = inject(DialogService);
+    private breadcrumbService = inject(SpBreadcrumbService);
+    private tabService = inject(SpConfigurationTabsService);
+    private translateService = inject(TranslateService);
+
     tabs: SpNavigationItem[] = [];
 
     @ViewChild('fileOverviewComponent') fileOverviewComponent;
 
-    constructor(
-        private dialogService: DialogService,
-        private breadcrumbService: SpBreadcrumbService,
-        private tabService: SpConfigurationTabsService,
-        private translateService: TranslateService,
-    ) {}
-
     ngOnInit() {
         this.tabs = this.tabService.getTabs();
         this.breadcrumbService.updateBreadcrumb([
diff --git 
a/ui/src/app/configuration/general-configuration/general-configuration.component.ts
 
b/ui/src/app/configuration/general-configuration/general-configuration.component.ts
index 714c5b4c84..44e037561b 100644
--- 
a/ui/src/app/configuration/general-configuration/general-configuration.component.ts
+++ 
b/ui/src/app/configuration/general-configuration/general-configuration.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, inject } from '@angular/core';
 import {
     FormsModule,
     ReactiveFormsModule,
@@ -99,6 +99,14 @@ import { TranslatePipe } from '@ngx-translate/core';
     ],
 })
 export class GeneralConfigurationComponent implements OnInit {
+    private fb = inject(UntypedFormBuilder);
+    private generalConfigService = inject(GeneralConfigService);
+    private mailConfigService = inject(MailConfigService);
+    private availableRolesService = inject(AvailableRolesService);
+    private appConstants = inject(AppConstants);
+    private breadcrumbService = inject(SpBreadcrumbService);
+    private tabService = inject(SpConfigurationTabsService);
+
     tabs: SpNavigationItem[] = [];
 
     parentForm: UntypedFormGroup;
@@ -109,16 +117,6 @@ export class GeneralConfigurationComponent implements 
OnInit {
 
     availableRoles$: Observable<Role[]>;
 
-    constructor(
-        private fb: UntypedFormBuilder,
-        private generalConfigService: GeneralConfigService,
-        private mailConfigService: MailConfigService,
-        private availableRolesService: AvailableRolesService,
-        private appConstants: AppConstants,
-        private breadcrumbService: SpBreadcrumbService,
-        private tabService: SpConfigurationTabsService,
-    ) {}
-
     ngOnInit(): void {
         this.tabs = this.tabService.getTabs();
         this.breadcrumbService.updateBreadcrumb([
diff --git 
a/ui/src/app/configuration/label-configuration/label-configuration.component.ts 
b/ui/src/app/configuration/label-configuration/label-configuration.component.ts
index 0d8fedede7..1206f7d41e 100644
--- 
a/ui/src/app/configuration/label-configuration/label-configuration.component.ts
+++ 
b/ui/src/app/configuration/label-configuration/label-configuration.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, OnInit, ViewChild } from '@angular/core';
+import { Component, OnInit, ViewChild, inject } from '@angular/core';
 import { SpConfigurationTabsService } from '../configuration-tabs.service';
 import { LabelsService, SpLabel } from '@streampipes/platform-services';
 import { SpConfigurationRoutes } from '../configuration.breadcrumb';
@@ -76,6 +76,10 @@ import { TranslatePipe } from '@ngx-translate/core';
     ],
 })
 export class SpLabelConfigurationComponent implements OnInit {
+    private breadcrumbService = inject(SpBreadcrumbService);
+    private labelsService = inject(LabelsService);
+    private tabService = inject(SpConfigurationTabsService);
+
     tabs: SpNavigationItem[] = [];
 
     allLabels: SpLabel[] = [];
@@ -91,12 +95,6 @@ export class SpLabelConfigurationComponent implements OnInit 
{
 
     editedLabels: string[] = [];
 
-    constructor(
-        private breadcrumbService: SpBreadcrumbService,
-        private labelsService: LabelsService,
-        private tabService: SpConfigurationTabsService,
-    ) {}
-
     ngOnInit(): void {
         this.tabs = this.tabService.getTabs();
         this.breadcrumbService.updateBreadcrumb([
diff --git 
a/ui/src/app/configuration/security-configuration/authentication-configuration/authentication-configuration.component.ts
 
b/ui/src/app/configuration/security-configuration/authentication-configuration/authentication-configuration.component.ts
index 90e09e1794..67d7c566ab 100644
--- 
a/ui/src/app/configuration/security-configuration/authentication-configuration/authentication-configuration.component.ts
+++ 
b/ui/src/app/configuration/security-configuration/authentication-configuration/authentication-configuration.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component } from '@angular/core';
+import { Component, inject } from '@angular/core';
 import { ConfigurationService } from '../../shared/configuration.service';
 import * as FileSaver from 'file-saver';
 import { FlexDirective, LayoutDirective } from '@ngbracket/ngx-layout/flex';
@@ -30,7 +30,7 @@ import { TranslatePipe } from '@ngx-translate/core';
     imports: [FlexDirective, LayoutDirective, MatButton, TranslatePipe],
 })
 export class SecurityAuthenticationConfigurationComponent {
-    constructor(private configurationService: ConfigurationService) {}
+    private configurationService = inject(ConfigurationService);
 
     generateKeyPair() {
         this.configurationService.generateKeyPair().subscribe(result => {
diff --git 
a/ui/src/app/configuration/security-configuration/edit-group-dialog/edit-group-dialog.component.ts
 
b/ui/src/app/configuration/security-configuration/edit-group-dialog/edit-group-dialog.component.ts
index 63b15c7801..6704dbd0e9 100644
--- 
a/ui/src/app/configuration/security-configuration/edit-group-dialog/edit-group-dialog.component.ts
+++ 
b/ui/src/app/configuration/security-configuration/edit-group-dialog/edit-group-dialog.component.ts
@@ -16,7 +16,13 @@
  *
  */
 
-import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
+import {
+    Component,
+    Input,
+    OnInit,
+    ViewEncapsulation,
+    inject,
+} from '@angular/core';
 import { Group, Role, UserGroupService } from '@streampipes/platform-services';
 import {
     FormsModule,
@@ -67,6 +73,11 @@ import { TranslatePipe } from '@ngx-translate/core';
     ],
 })
 export class EditGroupDialogComponent implements OnInit {
+    private fb = inject(UntypedFormBuilder);
+    private availableRolesService = inject(AvailableRolesService);
+    private dialogRef = inject<DialogRef<EditGroupDialogComponent>>(DialogRef);
+    private userGroupService = inject(UserGroupService);
+
     @Input()
     group: Group;
 
@@ -77,13 +88,6 @@ export class EditGroupDialogComponent implements OnInit {
     availableRoles$: Observable<Role[]>;
     clonedGroup: Group;
 
-    constructor(
-        private fb: UntypedFormBuilder,
-        private availableRolesService: AvailableRolesService,
-        private dialogRef: DialogRef<EditGroupDialogComponent>,
-        private userGroupService: UserGroupService,
-    ) {}
-
     ngOnInit(): void {
         this.availableRoles$ = this.availableRolesService
             .getAvailableRoles()
diff --git 
a/ui/src/app/configuration/security-configuration/edit-role-dialog/edit-role-dialog.component.ts
 
b/ui/src/app/configuration/security-configuration/edit-role-dialog/edit-role-dialog.component.ts
index 833519985d..6a1de2a870 100644
--- 
a/ui/src/app/configuration/security-configuration/edit-role-dialog/edit-role-dialog.component.ts
+++ 
b/ui/src/app/configuration/security-configuration/edit-role-dialog/edit-role-dialog.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input, OnInit } from '@angular/core';
+import { Component, Input, OnInit, inject } from '@angular/core';
 import {
     Privilege,
     PrivilegeService,
@@ -75,6 +75,11 @@ import { TranslatePipe } from '@ngx-translate/core';
     ],
 })
 export class EditRoleDialogComponent implements OnInit {
+    private fb = inject(FormBuilder);
+    private privilegeService = inject(PrivilegeService);
+    private dialogRef = inject<DialogRef<EditRoleDialogComponent>>(DialogRef);
+    private roleService = inject(RoleService);
+
     @Input()
     role: Role;
 
@@ -86,13 +91,6 @@ export class EditRoleDialogComponent implements OnInit {
     selectedPrivileges: Privilege[] = [];
     clonedRole: Role;
 
-    constructor(
-        private fb: FormBuilder,
-        private privilegeService: PrivilegeService,
-        private dialogRef: DialogRef<EditRoleDialogComponent>,
-        private roleService: RoleService,
-    ) {}
-
     ngOnInit() {
         this.privilegeService.findAll().subscribe(privileges => {
             this.selectedPrivileges = privileges.filter(
diff --git 
a/ui/src/app/configuration/security-configuration/edit-user-dialog/edit-user-dialog.component.ts
 
b/ui/src/app/configuration/security-configuration/edit-user-dialog/edit-user-dialog.component.ts
index 7fab1f3791..4eb0782587 100644
--- 
a/ui/src/app/configuration/security-configuration/edit-user-dialog/edit-user-dialog.component.ts
+++ 
b/ui/src/app/configuration/security-configuration/edit-user-dialog/edit-user-dialog.component.ts
@@ -16,7 +16,13 @@
  *
  */
 
-import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
+import {
+    Component,
+    Input,
+    OnInit,
+    ViewEncapsulation,
+    inject,
+} from '@angular/core';
 import {
     CurrentUserService,
     DialogRef,
@@ -83,6 +89,17 @@ import { AsyncPipe } from '@angular/common';
     ],
 })
 export class EditUserDialogComponent implements OnInit {
+    private dialogRef = inject<DialogRef<EditUserDialogComponent>>(DialogRef);
+    private availableRolesService = inject(AvailableRolesService);
+    private fb = inject(UntypedFormBuilder);
+    private userService = inject(UserService);
+    private userGroupService = inject(UserGroupService);
+    private currentUserService = inject(CurrentUserService);
+    private authService = inject(AuthService);
+    private router = inject(Router);
+    private mailConfigService = inject(MailConfigService);
+    private translateService = inject(TranslateService);
+
     @Input()
     user: any;
 
@@ -105,19 +122,6 @@ export class EditUserDialogComponent implements OnInit {
     emailConfigured = false;
     formAvailable = false;
 
-    constructor(
-        private dialogRef: DialogRef<EditUserDialogComponent>,
-        private availableRolesService: AvailableRolesService,
-        private fb: UntypedFormBuilder,
-        private userService: UserService,
-        private userGroupService: UserGroupService,
-        private currentUserService: CurrentUserService,
-        private authService: AuthService,
-        private router: Router,
-        private mailConfigService: MailConfigService,
-        private translateService: TranslateService,
-    ) {}
-
     ngOnInit(): void {
         this.initRoleFilter();
         this.loadInitialData();
diff --git 
a/ui/src/app/configuration/security-configuration/role-configuration/role-configuration.component.ts
 
b/ui/src/app/configuration/security-configuration/role-configuration/role-configuration.component.ts
index 2369f77921..ec413f3158 100644
--- 
a/ui/src/app/configuration/security-configuration/role-configuration/role-configuration.component.ts
+++ 
b/ui/src/app/configuration/security-configuration/role-configuration/role-configuration.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, OnInit, ViewChild } from '@angular/core';
+import { Component, OnInit, ViewChild, inject } from '@angular/core';
 import { Role, RoleService } from '@streampipes/platform-services';
 import { MatPaginator } from '@angular/material/paginator';
 import { MatSort, MatSortHeader } from '@angular/material/sort';
@@ -71,6 +71,11 @@ import { MatTooltip } from '@angular/material/tooltip';
     ],
 })
 export class SecurityRoleConfigComponent implements OnInit {
+    private roleService = inject(RoleService);
+    private dialogService = inject(DialogService);
+    private dialog = inject(MatDialog);
+    private translateService = inject(TranslateService);
+
     private static readonly ASSET_USER_ROLE = 'ROLE_ASSET_USER';
 
     @ViewChild(MatPaginator) paginator: MatPaginator;
@@ -81,13 +86,6 @@ export class SecurityRoleConfigComponent implements OnInit {
 
     displayedColumns: string[] = ['roleName', 'roleType', 'edit'];
 
-    constructor(
-        private roleService: RoleService,
-        private dialogService: DialogService,
-        private dialog: MatDialog,
-        private translateService: TranslateService,
-    ) {}
-
     ngOnInit(): void {
         this.loadRoles();
     }
diff --git 
a/ui/src/app/configuration/security-configuration/user-group-configuration/user-group-configuration.component.ts
 
b/ui/src/app/configuration/security-configuration/user-group-configuration/user-group-configuration.component.ts
index 1e622f8648..fd4ee78e7d 100644
--- 
a/ui/src/app/configuration/security-configuration/user-group-configuration/user-group-configuration.component.ts
+++ 
b/ui/src/app/configuration/security-configuration/user-group-configuration/user-group-configuration.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, inject } from '@angular/core';
 import { Group, UserGroupService } from '@streampipes/platform-services';
 import {
     MatCell,
@@ -68,17 +68,15 @@ import { MatTooltip } from '@angular/material/tooltip';
     ],
 })
 export class SecurityUserGroupConfigComponent implements OnInit {
+    private userGroupService = inject(UserGroupService);
+    private dialogService = inject(DialogService);
+    private dialog = inject(MatDialog);
+    private translateService = inject(TranslateService);
+
     dataSource: MatTableDataSource<Group>;
 
     displayedColumns: string[] = ['groupName', 'groupId', 'edit'];
 
-    constructor(
-        private userGroupService: UserGroupService,
-        private dialogService: DialogService,
-        private dialog: MatDialog,
-        private translateService: TranslateService,
-    ) {}
-
     ngOnInit(): void {
         this.loadAllGroups();
     }
diff --git a/ui/src/app/configuration/shared/configuration.service.ts 
b/ui/src/app/configuration/shared/configuration.service.ts
index e827ff944e..474d5d8a30 100644
--- a/ui/src/app/configuration/shared/configuration.service.ts
+++ b/ui/src/app/configuration/shared/configuration.service.ts
@@ -1,113 +1,113 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-import { Injectable } from '@angular/core';
-import { HttpClient } from '@angular/common/http';
-import { Observable } from 'rxjs';
-import { map } from 'rxjs/operators';
-import { MultipartUtils } from './multipart-utils';
-import {
-    MessagingSettings,
-    SpServiceConfiguration,
-    SpServiceRegistration,
-} from '@streampipes/platform-services';
-
-@Injectable({ providedIn: 'root' })
-export class ConfigurationService {
-    constructor(private http: HttpClient) {}
-
-    getServerUrl() {
-        return '/streampipes-backend';
-    }
-
-    generateKeyPair(): Observable<string[]> {
-        return this.http
-            .get(this.getServerUrl() + '/api/v2/admin/general-config/keys', {
-                responseType: 'text',
-                observe: 'response',
-            })
-            .pipe(
-                map(response => {
-                    return new 
MultipartUtils().extractMultipartPlainTextContent(
-                        response,
-                    );
-                }),
-            );
-    }
-
-    getMessagingSettings(): Observable<MessagingSettings> {
-        return this.http.get(this.getServerUrl() + '/api/v2/messaging').pipe(
-            map(response => {
-                return response as MessagingSettings;
-            }),
-        );
-    }
-
-    getRegisteredExtensionsServices(): Observable<SpServiceRegistration[]> {
-        return this.http
-            .get(this.getServerUrl() + '/api/v2/extensions-services')
-            .pipe(
-                map(response => {
-                    return response as SpServiceRegistration[];
-                }),
-            );
-    }
-
-    getExtensionsServiceConfigs(): Observable<SpServiceConfiguration[]> {
-        return this.http
-            .get(
-                this.getServerUrl() +
-                    '/api/v2/extensions-services-configurations',
-            )
-            .pipe(
-                map(response => {
-                    return response as SpServiceConfiguration[];
-                }),
-            );
-    }
-
-    updateExtensionsServiceConfigs(
-        config: SpServiceConfiguration,
-    ): Observable<object> {
-        return this.http.put(
-            this.getServerUrl() +
-                
`/api/v2/extensions-services-configurations/${config.serviceGroup}`,
-            config,
-        );
-    }
-
-    updateMessagingSettings(
-        messagingSettings: MessagingSettings,
-    ): Observable<object> {
-        return this.http.post(
-            this.getServerUrl() + '/api/v2/messaging',
-            messagingSettings,
-        );
-    }
-
-    adjustConfigurationKey(key) {
-        const removedKey = key.substr(key.lastIndexOf('/') + 1, key.length);
-
-        let str1 = removedKey.replace(/SP/g, '');
-        str1 = str1.replace(/_/g, ' ');
-        if (str1.startsWith(' ')) {
-            str1 = str1.slice(1, str1.length);
-        }
-        return str1;
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { Injectable, inject } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
+import { MultipartUtils } from './multipart-utils';
+import {
+    MessagingSettings,
+    SpServiceConfiguration,
+    SpServiceRegistration,
+} from '@streampipes/platform-services';
+
+@Injectable({ providedIn: 'root' })
+export class ConfigurationService {
+    private http = inject(HttpClient);
+
+    getServerUrl() {
+        return '/streampipes-backend';
+    }
+
+    generateKeyPair(): Observable<string[]> {
+        return this.http
+            .get(this.getServerUrl() + '/api/v2/admin/general-config/keys', {
+                responseType: 'text',
+                observe: 'response',
+            })
+            .pipe(
+                map(response => {
+                    return new 
MultipartUtils().extractMultipartPlainTextContent(
+                        response,
+                    );
+                }),
+            );
+    }
+
+    getMessagingSettings(): Observable<MessagingSettings> {
+        return this.http.get(this.getServerUrl() + '/api/v2/messaging').pipe(
+            map(response => {
+                return response as MessagingSettings;
+            }),
+        );
+    }
+
+    getRegisteredExtensionsServices(): Observable<SpServiceRegistration[]> {
+        return this.http
+            .get(this.getServerUrl() + '/api/v2/extensions-services')
+            .pipe(
+                map(response => {
+                    return response as SpServiceRegistration[];
+                }),
+            );
+    }
+
+    getExtensionsServiceConfigs(): Observable<SpServiceConfiguration[]> {
+        return this.http
+            .get(
+                this.getServerUrl() +
+                    '/api/v2/extensions-services-configurations',
+            )
+            .pipe(
+                map(response => {
+                    return response as SpServiceConfiguration[];
+                }),
+            );
+    }
+
+    updateExtensionsServiceConfigs(
+        config: SpServiceConfiguration,
+    ): Observable<object> {
+        return this.http.put(
+            this.getServerUrl() +
+                
`/api/v2/extensions-services-configurations/${config.serviceGroup}`,
+            config,
+        );
+    }
+
+    updateMessagingSettings(
+        messagingSettings: MessagingSettings,
+    ): Observable<object> {
+        return this.http.post(
+            this.getServerUrl() + '/api/v2/messaging',
+            messagingSettings,
+        );
+    }
+
+    adjustConfigurationKey(key) {
+        const removedKey = key.substr(key.lastIndexOf('/') + 1, key.length);
+
+        let str1 = removedKey.replace(/SP/g, '');
+        str1 = str1.replace(/_/g, ' ');
+        if (str1.startsWith(' ')) {
+            str1 = str1.slice(1, str1.length);
+        }
+        return str1;
+    }
+}
diff --git 
a/ui/src/app/configuration/sites-configuration/location-features-configuration/location-features-configuration.component.ts
 
b/ui/src/app/configuration/sites-configuration/location-features-configuration/location-features-configuration.component.ts
index 64471e01c0..556544ebc0 100644
--- 
a/ui/src/app/configuration/sites-configuration/location-features-configuration/location-features-configuration.component.ts
+++ 
b/ui/src/app/configuration/sites-configuration/location-features-configuration/location-features-configuration.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input, OnDestroy, OnInit } from '@angular/core';
+import { Component, Input, OnDestroy, OnInit, inject } from '@angular/core';
 import {
     FormsModule,
     ReactiveFormsModule,
@@ -67,6 +67,11 @@ import { MatIcon } from '@angular/material/icon';
 export class LocationFeaturesConfigurationComponent
     implements OnInit, OnDestroy
 {
+    private fb = inject(UntypedFormBuilder);
+    private snackBar = inject(MatSnackBar);
+    private locationConfigService = inject(LocationConfigService);
+    private translateService = inject(TranslateService);
+
     @Input()
     locationConfig: LocationConfig;
 
@@ -74,13 +79,6 @@ export class LocationFeaturesConfigurationComponent
     formSubscription: Subscription;
     showLocationDetails = false;
 
-    constructor(
-        private fb: UntypedFormBuilder,
-        private snackBar: MatSnackBar,
-        private locationConfigService: LocationConfigService,
-        private translateService: TranslateService,
-    ) {}
-
     ngOnInit(): void {
         this.locationForm = this.fb.group({});
         this.showLocationDetails = this.locationConfig.locationEnabled;
diff --git 
a/ui/src/app/configuration/sites-configuration/site-area-configuration/site-area-configuration.component.ts
 
b/ui/src/app/configuration/sites-configuration/site-area-configuration/site-area-configuration.component.ts
index 559c25299a..0b9e86dbbc 100644
--- 
a/ui/src/app/configuration/sites-configuration/site-area-configuration/site-area-configuration.component.ts
+++ 
b/ui/src/app/configuration/sites-configuration/site-area-configuration/site-area-configuration.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input, OnInit, ViewChild } from '@angular/core';
+import { Component, Input, OnInit, ViewChild, inject } from '@angular/core';
 import {
     AssetConstants,
     AssetSiteDesc,
@@ -71,6 +71,10 @@ import { MatTooltip } from '@angular/material/tooltip';
     ],
 })
 export class SiteAreaConfigurationComponent implements OnInit {
+    private genericStorageService = inject(GenericStorageService);
+    private dialogService = inject(DialogService);
+    private translateService = inject(TranslateService);
+
     @Input()
     locationConfig: LocationConfig;
 
@@ -84,12 +88,6 @@ export class SiteAreaConfigurationComponent implements 
OnInit {
     sort: MatSort;
     displayedColumns = ['name', 'areas', 'actions'];
 
-    constructor(
-        private genericStorageService: GenericStorageService,
-        private dialogService: DialogService,
-        private translateService: TranslateService,
-    ) {}
-
     ngOnInit() {
         this.loadSites();
         this.dataSource.sortingDataAccessor = (site, column) => {

Reply via email to