From fec6550cba8b0fefdfeb87d3c242a97f1c77db51 Mon Sep 17 00:00:00 2001 From: FrancescoMolinaro Date: Fri, 29 Dec 2023 11:45:13 +0100 Subject: [PATCH] finalize config and mapping --- .../admin-notify-dashboard.component.html | 2 +- .../admin-notify-dashboard.component.ts | 71 ++++++++++++++++--- ...dmin-notify-message-search-result.model.ts | 8 +++ .../models/admin-notify-message.model.ts | 31 ++++++++ .../admin-notify-message.resource-type.ts | 9 +++ src/app/core/core.module.ts | 2 + 6 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts create mode 100644 src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts create mode 100644 src/app/admin/admin-notify-dashboard/models/admin-notify-message.resource-type.ts diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.html b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.html index e366fbc909..2975fdde9c 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.html +++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.html @@ -8,7 +8,7 @@ {{'admin-notify-dashboard.metrics' | translate}}
- +
diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts index abaf9f05b5..b4e03d5ec7 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.ts @@ -3,10 +3,21 @@ import { SearchService } from "../../core/shared/search/search.service"; import { environment } from "../../../environments/environment"; import { PaginatedSearchOptions } from "../../shared/search/models/paginated-search-options.model"; import { PaginationComponentOptions } from "../../shared/pagination/pagination-component-options.model"; -import { concatAll, concatWith, flatMap, forkJoin, from, mergeAll, switchMap } from "rxjs"; -import { concat, delay } from "rxjs/operators"; -import { getFirstSucceededRemoteData } from "../../core/shared/operators"; +import { + listableObjectComponent +} from "../../shared/object-collection/shared/listable-object/listable-object.decorator"; +import { ViewMode } from "../../core/shared/view-mode.model"; +import { Context } from "../../core/shared/context.model"; +import { AdminNotifySearchResult } from "./models/admin-notify-message-search-result.model"; +import { forkJoin, Observable } from "rxjs"; +import { getFirstCompletedRemoteData } from "../../core/shared/operators"; +import { map } from "rxjs/operators"; +import { SearchObjects } from "../../shared/search/models/search-objects.model"; +import { AdminNotifyMetricsBox, AdminNotifyMetricsRow } from "./admin-notify-metrics/admin-notify-metrics.model"; +import { DSpaceObject } from "../../core/shared/dspace-object.model"; + +@listableObjectComponent(AdminNotifySearchResult, ViewMode.GridElement, Context.AdminSearch) @Component({ selector: 'ds-admin-notify-dashboard', templateUrl: './admin-notify-dashboard.component.html', @@ -14,7 +25,9 @@ import { getFirstSucceededRemoteData } from "../../core/shared/operators"; }) export class AdminNotifyDashboardComponent implements OnInit{ - metricsConfig = environment.notifyMetrics; + public notifyMetricsRows$: Observable + + private metricsConfig = environment.notifyMetrics; private singleResultOptions = Object.assign(new PaginationComponentOptions(), { id: 'single-result-options', pageSize: 1 @@ -22,14 +35,56 @@ export class AdminNotifyDashboardComponent implements OnInit{ constructor(private searchService: SearchService) {} ngOnInit() { - const discoveryConfigurations = this.metricsConfig + const mertricsRowsConfigurations = this.metricsConfig .map(row => row.boxes) .map(boxes => boxes.map(box => box.config).filter(config => !!config)); - const mergedConfigurations = discoveryConfigurations[0].concat(discoveryConfigurations[1]); - const searchConfigurations = mergedConfigurations + const flatConfigurations = [].concat(...mertricsRowsConfigurations.map((config) => config)); + const searchConfigurations = flatConfigurations .map(config => Object.assign(new PaginatedSearchOptions({}), { configuration: config, pagination: this.singleResultOptions } )); - // TODO: check for search completion before executing next one + + this.notifyMetricsRows$ = forkJoin(searchConfigurations.map(config => this.searchService.search(config) + .pipe( + getFirstCompletedRemoteData(), + map(response => this.mapSearchObjectsToMetricsBox(response.payload)), + ) + ) + ).pipe( + map(metricBoxes => this.mapUpdatedBoxesToMetricsRows(metricBoxes)) + ) + } + + /** + * Function to map received SearchObjects to notify boxes config + * + * @param searchObject The object to map + * @private + */ + private mapSearchObjectsToMetricsBox(searchObject: SearchObjects) : AdminNotifyMetricsBox { + const objectConfig = searchObject.configuration; + const count = searchObject.pageInfo.totalElements; + const metricsBoxes = [].concat(...this.metricsConfig.map((config) => config.boxes)); + + return { + ...metricsBoxes.find(box => box.config === objectConfig), + count + } + } + + /** + * Function to map updated boxes with count to each row of the configuration + * + * @param boxes The object to map + * @private + */ + private mapUpdatedBoxesToMetricsRows(boxes: AdminNotifyMetricsBox[]) : AdminNotifyMetricsRow[] { + return this.metricsConfig.map(row => { + return { + ...row, + boxes: row.boxes.map(box => boxes.find(boxWithCount => boxWithCount.config === box.config)) + .filter(box => !!box) + } + }) } } diff --git a/src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts b/src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts new file mode 100644 index 0000000000..254151ce76 --- /dev/null +++ b/src/app/admin/admin-notify-dashboard/models/admin-notify-message-search-result.model.ts @@ -0,0 +1,8 @@ +import { AdminNotifyMessage } from "./admin-notify-message.model"; +import { searchResultFor } from "../../../shared/search/search-result-element-decorator"; +import { SearchResult } from "../../../shared/search/models/search-result.model"; + + +@searchResultFor(AdminNotifyMessage) +export class AdminNotifySearchResult extends SearchResult { +} diff --git a/src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts b/src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts new file mode 100644 index 0000000000..440c084d0f --- /dev/null +++ b/src/app/admin/admin-notify-dashboard/models/admin-notify-message.model.ts @@ -0,0 +1,31 @@ +import { deserialize, inheritSerialization } from 'cerialize'; +import { typedObject } from "../../../core/cache/builders/build-decorators"; +import { ADMIN_NOTIFY_MESSAGE } from "./admin-notify-message.resource-type"; +import { excludeFromEquals } from "../../../core/utilities/equals.decorators"; +import { DSpaceObject } from "../../../core/shared/dspace-object.model"; + +/** + * A message that includes admin notify info + */ +@typedObject +@inheritSerialization(DSpaceObject) +export class AdminNotifyMessage extends DSpaceObject { + static type = ADMIN_NOTIFY_MESSAGE; + + /** + * The type of the message + */ + @excludeFromEquals + type = ADMIN_NOTIFY_MESSAGE; + + @deserialize + _links: { + self: { + href: string; + }; + }; + + get self(): string { + return this._links.self.href; + } +} diff --git a/src/app/admin/admin-notify-dashboard/models/admin-notify-message.resource-type.ts b/src/app/admin/admin-notify-dashboard/models/admin-notify-message.resource-type.ts new file mode 100644 index 0000000000..f8d7c4d1f6 --- /dev/null +++ b/src/app/admin/admin-notify-dashboard/models/admin-notify-message.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from "../../../core/shared/resource-type"; + +/** + * The resource type for AdminNotifyMessage + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const ADMIN_NOTIFY_MESSAGE = new ResourceType('message'); diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index eef4f1f68e..728419c574 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -197,6 +197,7 @@ import { import { SubmissionCoarNotifyConfig } from '../submission/sections/section-coar-notify/submission-coar-notify.config'; import { NotifyRequestsStatus } from '../item-page/simple/notify-requests-status/notify-requests-status.model'; import { NotifyRequestsStatusDataService } from './data/notify-services-status-data.service'; +import { AdminNotifyMessage } from "../admin/admin-notify-dashboard/models/admin-notify-message.model"; /** @@ -410,6 +411,7 @@ export const models = Itemfilter, SubmissionCoarNotifyConfig, NotifyRequestsStatus, + AdminNotifyMessage ]; @NgModule({