This is an automated email from the ASF dual-hosted git repository. dominikriemer pushed a commit to branch add-resource-dtos in repository https://gitbox.apache.org/repos/asf/streampipes.git
commit b2cf14e6a9ed2401272f7d78464ed37fdcb3ca4c Author: Dominik Riemer <[email protected]> AuthorDate: Fri Jun 12 23:09:20 2026 +0200 Add dataset summary dto --- .../model/datalake/DatasetSummaryDto.java | 24 ++-- .../management/DataLakeMeasureResourceManager.java | 158 +++++++++++++++++++++ .../resource/management/SpResourceManager.java | 4 + .../impl/datalake/DataLakeMeasureResource.java | 13 ++ .../src/lib/apis/datalake-rest.service.ts | 10 ++ .../lib/model/resource/resource-summary.model.ts | 11 +- .../datalake-configuration-entry.ts | 8 +- .../datalake-configuration.component.html | 40 ++---- .../datalake-configuration.component.ts | 144 +++++++++---------- 9 files changed, 294 insertions(+), 118 deletions(-) diff --git a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration-entry.ts b/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DatasetSummaryDto.java similarity index 63% copy from ui/src/app/dataset/components/datalake-configuration/datalake-configuration-entry.ts copy to streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DatasetSummaryDto.java index 48bdda2273..565d25fdfb 100644 --- a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration-entry.ts +++ b/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DatasetSummaryDto.java @@ -1,5 +1,3 @@ -import { RetentionTimeConfig } from '@streampipes/platform-services'; - /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -17,16 +15,16 @@ import { RetentionTimeConfig } from '@streampipes/platform-services'; * limitations under the License. * */ -export class DataLakeConfigurationEntry { - public name: string; - public pipelines: string[] = []; - public eventsTotal = 0; - public eventsLatest = 0; - public eventsTotalLoading = false; - public eventsLatestLoading = false; - public remove = true; - public elementId: string; - public retention: RetentionTimeConfig; - constructor() {} +package org.apache.streampipes.model.datalake; + +import java.util.List; + +public record DatasetSummaryDto(String elementId, + String measureName, + boolean retentionConfigured, + String lastExport, + Boolean lastRetentionStatus, + List<String> pipelines, + boolean removable) { } diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataLakeMeasureResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataLakeMeasureResourceManager.java new file mode 100644 index 0000000000..a80c7280e1 --- /dev/null +++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataLakeMeasureResourceManager.java @@ -0,0 +1,158 @@ +/* + * 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. + * + */ + +package org.apache.streampipes.resource.management; + +import org.apache.streampipes.model.datalake.DataLakeMeasure; +import org.apache.streampipes.model.datalake.DatasetSummaryDto; +import org.apache.streampipes.model.datalake.RetentionTimeConfig; +import org.apache.streampipes.model.graph.DataSinkInvocation; +import org.apache.streampipes.model.pipeline.Pipeline; +import org.apache.streampipes.model.resource.ResourceSummaryDto; +import org.apache.streampipes.model.staticproperty.FreeTextStaticProperty; +import org.apache.streampipes.resource.management.permission.SpPermissionEvaluator; +import org.apache.streampipes.storage.api.explorer.IDataLakeMeasureStorage; +import org.apache.streampipes.storage.api.pipeline.IPipelineStorage; +import org.apache.streampipes.storage.management.StorageDispatcher; + +import org.springframework.security.core.Authentication; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +public class DataLakeMeasureResourceManager extends AbstractResourceManager<IDataLakeMeasureStorage> { + + private static final String DATA_LAKE_APP_ID = "org.apache.streampipes.sinks.internal.jvm.datalake"; + private static final String MEASURE_FIELD_INTERNAL_NAME = "db_measurement"; + private static final List<String> FORBIDDEN_MEASURE_NAME_CHARS = List.of("/", "?", "=", "\""); + + private final IPipelineStorage pipelineStorage; + private final SpPermissionEvaluator permissionEvaluator; + + public DataLakeMeasureResourceManager() { + super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataLakeStorage()); + this.pipelineStorage = StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineStorageAPI(); + this.permissionEvaluator = new SpPermissionEvaluator(); + } + + public ResourceSummaryDto<DatasetSummaryDto> getSummary(Authentication auth) { + var pipelinesByMeasure = getVisiblePipelinesByMeasure(auth); + + var datasets = db.findAll().stream() + .filter(measure -> canReadMeasure(auth, measure)) + .map(measure -> toSummary(measure, pipelinesByMeasure)) + .toList(); + + return new ResourceSummaryDto<>(datasets, datasets.size()); + } + + private DatasetSummaryDto toSummary( + DataLakeMeasure measure, + Map<String, List<PipelineInfo>> pipelinesByMeasure + ) { + var pipelineInfos = pipelinesByMeasure.getOrDefault(measure.getMeasureName(), List.of()); + var pipelines = pipelineInfos.stream().map(PipelineInfo::name).toList(); + var removable = pipelineInfos.stream().noneMatch(PipelineInfo::running); + var retentionConfigured = hasRetention(measure.getRetentionTime()); + var lastExport = getLastExport(measure.getRetentionTime()); + var lastRetentionStatus = getLastRetentionStatus(measure.getRetentionTime()); + + return new DatasetSummaryDto( + measure.getElementId(), + measure.getMeasureName(), + retentionConfigured, + lastExport, + lastRetentionStatus, + pipelines, + removable + ); + } + + private Map<String, List<PipelineInfo>> getVisiblePipelinesByMeasure(Authentication auth) { + return pipelineStorage.findAll().stream() + .filter(pipeline -> permissionEvaluator.hasPermission(auth, pipeline.getPipelineId(), "READ")) + .flatMap(pipeline -> extractSinks(pipeline).stream() + .map(this::getMeasureName) + .flatMap(Optional::stream) + .map(measureName -> new PipelineMeasure( + measureName, + new PipelineInfo(pipeline.getName(), pipeline.isRunning()) + ))) + .collect(Collectors.groupingBy(PipelineMeasure::measureName, + Collectors.mapping(PipelineMeasure::pipelineInfo, Collectors.toList()))); + } + + private boolean canReadMeasure(Authentication auth, DataLakeMeasure measure) { + return measure != null + && measure.getElementId() != null + && permissionEvaluator.hasPermission(auth, measure.getElementId(), "READ"); + } + + private List<DataSinkInvocation> extractSinks(Pipeline pipeline) { + return pipeline.getActions().stream() + .filter(sink -> DATA_LAKE_APP_ID.equals(sink.getAppId())) + .toList(); + } + + private Optional<String> getMeasureName(DataSinkInvocation sink) { + return sink.getStaticProperties().stream() + .filter(sp -> MEASURE_FIELD_INTERNAL_NAME.equals(sp.getInternalName())) + .filter(FreeTextStaticProperty.class::isInstance) + .map(FreeTextStaticProperty.class::cast) + .map(FreeTextStaticProperty::getValue) + .findFirst() + .map(this::sanitizeMeasureName); + } + + private String sanitizeMeasureName(String measureName) { + return FORBIDDEN_MEASURE_NAME_CHARS.stream() + .reduce(measureName, (currentName, forbiddenChar) -> currentName.replace(forbiddenChar, "_")); + } + + private boolean hasRetention(RetentionTimeConfig retentionTime) { + return retentionTime != null && retentionTime.getDataRetentionConfig() != null; + } + + private Boolean getLastRetentionStatus(RetentionTimeConfig retentionTime) { + if (retentionTime == null + || retentionTime.getRetentionExportConfig() == null + || retentionTime.getRetentionExportConfig().getRetentionLog() == null + || retentionTime.getRetentionExportConfig().getRetentionLog().isEmpty()) { + return null; + } + + var retentionLog = retentionTime.getRetentionExportConfig().getRetentionLog(); + return retentionLog.get(retentionLog.size() - 1).getStatus(); + } + + private String getLastExport(RetentionTimeConfig retentionTime) { + if (retentionTime == null || retentionTime.getRetentionExportConfig() == null) { + return null; + } + + return retentionTime.getRetentionExportConfig().getLastExport(); + } + + private record PipelineInfo(String name, boolean running) { + } + + private record PipelineMeasure(String measureName, PipelineInfo pipelineInfo) { + } +} diff --git a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java index c985766ccb..0eaf2f7947 100644 --- a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java +++ b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java @@ -50,6 +50,10 @@ public class SpResourceManager { return new DataStreamResourceManager(); } + public DataLakeMeasureResourceManager manageDataLakeMeasures() { + return new DataLakeMeasureResourceManager(); + } + public PipelineResourceManager managePipelines() { return new PipelineResourceManager(); } diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java index 28e12fc92e..5f94ed50c3 100644 --- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java +++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeMeasureResource.java @@ -20,7 +20,10 @@ package org.apache.streampipes.rest.impl.datalake; import org.apache.streampipes.dataexplorer.management.DataExplorerDispatcher; import org.apache.streampipes.model.datalake.DataLakeMeasure; +import org.apache.streampipes.model.datalake.DatasetSummaryDto; import org.apache.streampipes.model.monitoring.SpLogMessage; +import org.apache.streampipes.model.resource.ResourceSummaryDto; +import org.apache.streampipes.resource.management.DataLakeMeasureResourceManager; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -50,6 +53,12 @@ public class DataLakeMeasureResource extends AbstractDataLakeResource { super(); } + @GetMapping(path = "/summary", produces = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("this.hasReadAuthority()") + public ResourceSummaryDto<DatasetSummaryDto> getDatasetSummary() { + return getResourceManager().getSummary(getAuthentication()); + } + @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("this.hasWriteAuthority()") public ResponseEntity<?> addDataLake(@RequestBody DataLakeMeasure dataLakeMeasure) { @@ -139,4 +148,8 @@ public class DataLakeMeasureResource extends AbstractDataLakeResource { } } + private DataLakeMeasureResourceManager getResourceManager() { + return getSpResourceManager().manageDataLakeMeasures(); + } + } diff --git a/ui/projects/streampipes/platform-services/src/lib/apis/datalake-rest.service.ts b/ui/projects/streampipes/platform-services/src/lib/apis/datalake-rest.service.ts index 3011e492b0..fb2ccafeff 100644 --- a/ui/projects/streampipes/platform-services/src/lib/apis/datalake-rest.service.ts +++ b/ui/projects/streampipes/platform-services/src/lib/apis/datalake-rest.service.ts @@ -29,6 +29,10 @@ import { DataLakeMeasure, SpQueryResult } from '../model/gen/streampipes-model'; import { map } from 'rxjs/operators'; import { DatalakeQueryParameters } from '../model/datalake/DatalakeQueryParameters'; import { NGX_LOADING_BAR_IGNORED } from '@ngx-loading-bar/http-client'; +import { + DatasetSummaryDto, + ResourceSummaryDto, +} from '../model/resource/resource-summary.model'; import { CsvImportPreviewRequest, CsvImportPreviewResult, @@ -85,6 +89,12 @@ export class DatalakeRestService { ); } + getMeasurementSummary(): Observable<ResourceSummaryDto<DatasetSummaryDto>> { + return this.http.get<ResourceSummaryDto<DatasetSummaryDto>>( + `${this.dataLakeMeasureUrl}/summary`, + ); + } + getMeasurement(id: string): Observable<DataLakeMeasure> { return this.http .get(`${this.dataLakeMeasureUrl}/${id}`) diff --git a/ui/projects/streampipes/platform-services/src/lib/model/resource/resource-summary.model.ts b/ui/projects/streampipes/platform-services/src/lib/model/resource/resource-summary.model.ts index 4e3b8b3aef..067d05ea54 100644 --- a/ui/projects/streampipes/platform-services/src/lib/model/resource/resource-summary.model.ts +++ b/ui/projects/streampipes/platform-services/src/lib/model/resource/resource-summary.model.ts @@ -18,7 +18,6 @@ import { PipelineHealthStatus } from '../gen/streampipes-model'; import { DataExplorerWidgetHealthStatus } from '../gen/streampipes-model'; - export interface ResourceSummaryDto<T> { totalCount: number; resources: T[]; @@ -44,6 +43,16 @@ export interface AdapterSummaryDto { icon: string; } +export interface DatasetSummaryDto { + elementId: string; + measureName: string; + retentionConfigured: boolean; + lastExport: string | null; + lastRetentionStatus: boolean | null; + pipelines: string[]; + removable: boolean; +} + export interface PipelineSummaryDto { elementId: string; name: string; diff --git a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration-entry.ts b/ui/src/app/dataset/components/datalake-configuration/datalake-configuration-entry.ts index 48bdda2273..a6b3aadef5 100644 --- a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration-entry.ts +++ b/ui/src/app/dataset/components/datalake-configuration/datalake-configuration-entry.ts @@ -1,5 +1,3 @@ -import { RetentionTimeConfig } from '@streampipes/platform-services'; - /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -17,8 +15,10 @@ import { RetentionTimeConfig } from '@streampipes/platform-services'; * limitations under the License. * */ + export class DataLakeConfigurationEntry { public name: string; + public measureName: string; public pipelines: string[] = []; public eventsTotal = 0; public eventsLatest = 0; @@ -26,7 +26,9 @@ export class DataLakeConfigurationEntry { public eventsLatestLoading = false; public remove = true; public elementId: string; - public retention: RetentionTimeConfig; + public retentionConfigured = false; + public lastExport: string | null = null; + public lastRetentionStatus: boolean | null = null; constructor() {} } diff --git a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.html b/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.html index 7f0a7a3db5..198b41c9f0 100644 --- a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.html +++ b/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.html @@ -199,9 +199,9 @@ <i class="material-icons" [ngStyle]="{ - color: configurationEntry?.retention + color: configurationEntry.retentionConfigured ? 'var(--color-success)' - : 'var(--color-neutral', + : 'var(--color-neutral)', }" >history</i > @@ -226,19 +226,15 @@ fxLayout="row" fxLayoutAlign="start center" > - @if (configurationEntry?.retention) { + @if (configurationEntry.retentionConfigured) { <button color="accent" mat-icon-button [matTooltip]=" ('Open Retention Log' | translate) + - (configurationEntry?.retention - ?.retentionExportConfig - ?.lastExport + (configurationEntry.lastExport ? ' • ' + - (configurationEntry.retention - .retentionExportConfig - .lastExport + (configurationEntry.lastExport | date : 'yyyy-MM-dd HH:mm:ss') : '') @@ -247,9 +243,7 @@ matTooltipPosition="above" (click)=" openRetentionLog( - configurationEntry?.retention - .retentionExportConfig - .retentionLog + configurationEntry.elementId ) " > @@ -257,22 +251,12 @@ class="material-icons" [ngStyle]="{ color: - configurationEntry - ?.retention - ?.retentionExportConfig - ?.retentionLog - ?.length && - configurationEntry.retention - .retentionExportConfig - .retentionLog[ - configurationEntry - .retention - .retentionExportConfig - .retentionLog - .length - 1 - ].status - ? 'green' - : 'red', + configurationEntry.lastRetentionStatus === + null + ? 'var(--color-neutral)' + : configurationEntry.lastRetentionStatus + ? 'green' + : 'red', }" >list_alt</i > diff --git a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.ts b/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.ts index 2de04b35a0..fcfc0472aa 100644 --- a/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.ts +++ b/ui/src/app/dataset/components/datalake-configuration/datalake-configuration.component.ts @@ -39,12 +39,11 @@ import { } from '@angular/material/table'; import { DataLakeConfigurationEntry } from './datalake-configuration-entry'; import { - ChartService, - DataLakeMeasure, DatalakeRestService, + DataLakeMeasure, + DatasetSummaryDto, ExportProviderService, ExportProviderSettings, - RetentionLog, } from '@streampipes/platform-services'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; @@ -143,7 +142,6 @@ export class DatalakeConfigurationComponent spTable!: SpTableComponent<DataLakeConfigurationEntry>; private datalakeRestService = inject(DatalakeRestService); - private dataViewDataExplorerService = inject(ChartService); private dialogService = inject(DialogService); private breadcrumbService = inject(SpBreadcrumbService); private exportProviderRestService = inject(ExportProviderService); @@ -227,7 +225,7 @@ export class DatalakeConfigurationComponent this.assetFilter$?.unsubscribe(); } - loadAvailableExportProvider() { + loadAvailableExportProvider(): void { this.availableExportProvider = []; this.exportProviderRestService .getAllExportProviders() @@ -237,50 +235,23 @@ export class DatalakeConfigurationComponent }); } - loadAvailableMeasurements() { + loadAvailableMeasurements(): void { this.availableMeasurements = []; - // get all available measurements that are stored in the data lake this.datalakeRestService - .getAllMeasurementSeries() - .subscribe(allMeasurements => { - // get all measurements that are still used in pipelines - this.dataViewDataExplorerService - .getAllPersistedDataStreams() - .subscribe(inUseMeasurements => { - allMeasurements.forEach(measurement => { - const entry = new DataLakeConfigurationEntry(); - entry.elementId = measurement.elementId; - entry.name = measurement.measureName; - entry.eventsLatest = -1; - entry.eventsTotal = -1; - if (measurement?.retentionTime != null) { - entry.retention = measurement.retentionTime; - } - inUseMeasurements.forEach(inUseMeasurement => { - if ( - inUseMeasurement.measureName === - measurement.measureName - ) { - entry.pipelines.push( - inUseMeasurement.pipelineName, - ); - if (inUseMeasurement.pipelineIsRunning) { - entry.remove = false; - } - } - }); - this.availableMeasurements.push(entry); - }); - - this.availableMeasurements.sort((a, b) => - a.name.localeCompare(b.name), - ); - this.applyMeasurementFilters(this.currentFilterIds); - }); + .getMeasurementSummary() + .subscribe(datasetSummary => { + this.availableMeasurements = datasetSummary.resources.map( + measurement => this.toConfigurationEntry(measurement), + ); + + this.availableMeasurements.sort((a, b) => + a.name.localeCompare(b.name), + ); + this.applyMeasurementFilters(this.currentFilterIds); }); } - applyMeasurementFilters(elementIds: Set<string>) { + applyMeasurementFilters(elementIds: Set<string>): void { this.currentFilterIds = elementIds; if (elementIds === undefined) { this.filteredMeasurements = []; @@ -317,7 +288,7 @@ export class DatalakeConfigurationComponent } } - createExportProvider(provider: ExportProviderSettings | null) { + createExportProvider(provider: ExportProviderSettings | null): void { const dialogRef: DialogRef<ExportProviderComponent> = this.dialogService.open(ExportProviderComponent, { panelType: PanelType.SLIDE_IN_PANEL, @@ -333,7 +304,7 @@ export class DatalakeConfigurationComponent }); } - cleanDatalakeIndex(measurementIndex: string) { + cleanDatalakeIndex(measurementIndex: string): void { const dialogRef: DialogRef<DeleteDatalakeIndexComponent> = this.dialogService.open(DeleteDatalakeIndexComponent, { panelType: PanelType.STANDARD_PANEL, @@ -352,7 +323,7 @@ export class DatalakeConfigurationComponent }); } - deleteDatalakeIndex(measurementIndex: string) { + deleteDatalakeIndex(measurementIndex: string): void { const dialogRef: DialogRef<DeleteDatalakeIndexComponent> = this.dialogService.open(DeleteDatalakeIndexComponent, { panelType: PanelType.STANDARD_PANEL, @@ -371,7 +342,7 @@ export class DatalakeConfigurationComponent }); } - deleteExportProvider(providerId: string) { + deleteExportProvider(providerId: string): void { const dialogRef: DialogRef<DeleteExportProviderComponent> = this.dialogService.open(DeleteExportProviderComponent, { panelType: PanelType.STANDARD_PANEL, @@ -388,7 +359,7 @@ export class DatalakeConfigurationComponent } }); } - testExportProvider(providerId: string) { + testExportProvider(providerId: string): void { const dialogRef: DialogRef<ExportProviderConnectionTestComponent> = this.dialogService.open(ExportProviderConnectionTestComponent, { panelType: PanelType.STANDARD_PANEL, @@ -408,7 +379,7 @@ export class DatalakeConfigurationComponent }); } - openDownloadDialog(measurementName: string) { + openDownloadDialog(measurementName: string): void { this.dialogService.open(DataDownloadDialogComponent, { panelType: PanelType.SLIDE_IN_PANEL, title: this.translateService.instant('Download data'), @@ -421,7 +392,7 @@ export class DatalakeConfigurationComponent }); } - openRetentionDialog(measurementId: string) { + openRetentionDialog(measurementId: string): void { const dialogRef: DialogRef<DataRetentionDialogComponent> = this.dialogService.open(DataRetentionDialogComponent, { panelType: PanelType.SLIDE_IN_PANEL, @@ -444,37 +415,25 @@ export class DatalakeConfigurationComponent }); } - openRetentionLog(retentionLog: RetentionLog[]) { - const dialogRef: DialogRef<DataRetentionLogDialogComponent> = - this.dialogService.open(DataRetentionLogDialogComponent, { - panelType: PanelType.STANDARD_PANEL, - title: this.translateService.instant('Retention Log'), - width: '100vw', - data: { - retentionLog: retentionLog, - }, - }); - - dialogRef.afterClosed().subscribe(data => { - if (data) { - setTimeout(() => { - this.loadAvailableMeasurements(); - }, 1000); - } + openRetentionLog(measurementId: string): void { + this.datalakeRestService.getMeasurement(measurementId).subscribe({ + next: measurement => { + this.openRetentionLogDialog(measurement); + }, }); } - onPageChange(event: any) { + onPageChange(event: any): void { this.pageIndex = event.pageIndex; this.pageSize = event.pageSize; //this.receiveMeasurementSizes(this.pageIndex); } - receiveTotalMeasurementSize(entry: DataLakeConfigurationEntry) { + receiveTotalMeasurementSize(entry: DataLakeConfigurationEntry): void { this.queryEntryCounts([entry.name], 'eventsTotal'); } - receiveMeasurementSizes(pageIndex: number) { + receiveMeasurementSizes(pageIndex: number): void { const start = pageIndex * this.pageSize; const end = start + this.pageSize; const measurements = this.filteredMeasurements @@ -485,7 +444,7 @@ export class DatalakeConfigurationComponent this.queryEntryCounts(measurements, 'eventsLatest', 7); } } - showPermissionsDialog(element: DataLakeMeasure) { + showPermissionsDialog(element: DataLakeConfigurationEntry): void { this.dialogService.open(ObjectPermissionDialogComponent, { panelType: PanelType.SLIDE_IN_PANEL, title: this.translateService.instant('Manage permissions'), @@ -500,7 +459,7 @@ export class DatalakeConfigurationComponent }); } - openCsvImportDialog() { + openCsvImportDialog(): void { const dialogRef: DialogRef<CsvImportDialogComponent> = this.dialogService.open(CsvImportDialogComponent, { panelType: PanelType.SLIDE_IN_PANEL, @@ -553,4 +512,43 @@ export class DatalakeConfigurationComponent } }); } + + private toConfigurationEntry( + measurement: DatasetSummaryDto, + ): DataLakeConfigurationEntry { + const entry = new DataLakeConfigurationEntry(); + entry.elementId = measurement.elementId; + entry.name = measurement.measureName; + entry.measureName = measurement.measureName; + entry.pipelines = measurement.pipelines; + entry.retentionConfigured = measurement.retentionConfigured; + entry.lastExport = measurement.lastExport; + entry.lastRetentionStatus = measurement.lastRetentionStatus; + entry.remove = measurement.removable; + entry.eventsLatest = -1; + entry.eventsTotal = -1; + return entry; + } + + private openRetentionLogDialog(measurement: DataLakeMeasure): void { + const dialogRef: DialogRef<DataRetentionLogDialogComponent> = + this.dialogService.open(DataRetentionLogDialogComponent, { + panelType: PanelType.STANDARD_PANEL, + title: this.translateService.instant('Retention Log'), + width: '100vw', + data: { + retentionLog: + measurement.retentionTime?.retentionExportConfig + ?.retentionLog ?? [], + }, + }); + + dialogRef.afterClosed().subscribe(data => { + if (data) { + setTimeout(() => { + this.loadAvailableMeasurements(); + }, 1000); + } + }); + } }
