diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard-routing.module.ts b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard-routing.module.ts index 345dc31ce3..7f74c023ff 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard-routing.module.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard-routing.module.ts @@ -34,11 +34,27 @@ import { path: 'inbound', component: AdminNotifyIncomingComponent, canActivate: [SiteAdministratorGuard], + resolve: { + breadcrumb: I18nBreadcrumbResolver, + }, + data: { + title: 'admin.notify.dashboard.page.title', + breadcrumbKey: 'admin.notify.dashboard', + showBreadcrumbsFluid: false + }, }, { path: 'outbound', component: AdminNotifyOutgoingComponent, canActivate: [SiteAdministratorGuard], + resolve: { + breadcrumb: I18nBreadcrumbResolver, + }, + data: { + title: 'admin.notify.dashboard.page.title', + breadcrumbKey: 'admin.notify.dashboard', + showBreadcrumbsFluid: false + }, } ]) ], diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.module.ts b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.module.ts index 498c40a58d..1383b14443 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.module.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.module.ts @@ -8,14 +8,13 @@ import { AdminNotifyIncomingComponent } from './admin-notify-logs/admin-notify-i import { SharedModule } from '../../shared/shared.module'; import { SearchModule } from '../../shared/search/search.module'; import { SearchPageModule } from '../../search-page/search-page.module'; -import { AdminNotifyIncomingSearchResultComponent } from './admin-notify-search-result/incoming/admin-notify-incoming-search-result.component'; import { AdminNotifyOutgoingComponent } from './admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component'; import { AdminNotifyDetailModalComponent } from './admin-notify-detail-modal/admin-notify-detail-modal.component'; import { - AdminNotifyOutgoingSearchResultComponent -} from "./admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component"; + AdminNotifySearchResultComponent +} from "./admin-notify-search-result/admin-notify-search-result.component"; import { AdminNotifyMessagesService } from "./services/admin-notify-messages.service"; @@ -36,8 +35,7 @@ import { AdminNotifyMessagesService } from "./services/admin-notify-messages.ser AdminNotifyMetricsComponent, AdminNotifyIncomingComponent, AdminNotifyOutgoingComponent, - AdminNotifyIncomingSearchResultComponent, - AdminNotifyOutgoingSearchResultComponent, + AdminNotifySearchResultComponent, AdminNotifyDetailModalComponent ] }) diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.html b/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.html index 57e1b40c1d..bbbfc22ed4 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.html +++ b/src/app/admin/admin-notify-dashboard/admin-notify-detail-modal/admin-notify-detail-modal.component.html @@ -1,14 +1,14 @@ - diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.ts index ffb5306643..d895e35ede 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component.ts @@ -16,7 +16,7 @@ import { SearchConfigurationService } from "../../../../core/shared/search/searc ] }) export class AdminNotifyIncomingComponent { - protected readonly context = Context.CoarNotifyIncoming; + protected readonly context = Context.CoarNotify; constructor(@Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: SearchConfigurationService) { } } diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.html b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.html index 050e25c241..8b9c031776 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.html +++ b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.html @@ -21,7 +21,6 @@ [showViewModes]="false" [searchEnabled]="false" [context]="context" - [useUniquePageId]="true" > diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.ts index ac7a5cfafa..d85ec2daae 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component.ts @@ -16,7 +16,7 @@ import { SearchConfigurationService } from "../../../../core/shared/search/searc ] }) export class AdminNotifyOutgoingComponent { - protected readonly context = Context.CoarNotifyOutgoing; + protected readonly context = Context.CoarNotify; constructor(@Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: SearchConfigurationService) { } diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.html b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.html new file mode 100644 index 0000000000..310a04c1ed --- /dev/null +++ b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.html @@ -0,0 +1,43 @@ +
+ + + + + + + + + + + + + + + + + + + + + +
{{ 'notify-message-result.timestamp' | translate}}{{'notify-message-result.repositoryItem' | translate}}{{ 'notify-message-result.ldnService' | translate}}{{ 'notify-message-result.type' | translate }}{{ 'notify-message-result.status' | translate }}{{ 'notify-message-result.action' | translate }}
+
{{message.queueTimeout}}
+
+
{{message.context}}
+
{{message.object}}
+
+
{{message.origin}}
+
{{message.target}}
+
+
{{message.coarNotifyType}}
+
+
{{message.queueStatusLabel}}
+
+
+ + +
+
+
diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.scss b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.scss similarity index 100% rename from src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.scss rename to src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.scss diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.spec.ts new file mode 100644 index 0000000000..b17a03274f --- /dev/null +++ b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminNotifySearchResultComponent } from './admin-notify-search-result.component'; + +describe('AdminNotifySearchResultComponent', () => { + let component: AdminNotifySearchResultComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ AdminNotifySearchResultComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AdminNotifySearchResultComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.ts new file mode 100644 index 0000000000..f75eab3366 --- /dev/null +++ b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.ts @@ -0,0 +1,122 @@ +import { ChangeDetectorRef, Component, Inject, OnDestroy, OnInit } from '@angular/core'; +import { AdminNotifySearchResult } from '../models/admin-notify-message-search-result.model'; +import { ViewMode } from '../../../core/shared/view-mode.model'; +import { Context } from '../../../core/shared/context.model'; +import { AdminNotifyMessage, QueueStatusMap } from '../models/admin-notify-message.model'; +import { + tabulatableObjectsComponent +} from '../../../shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator'; +import { + TabulatableResultListElementsComponent +} from '../../../shared/object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { AdminNotifyDetailModalComponent } from '../admin-notify-detail-modal/admin-notify-detail-modal.component'; +import { LdnServicesService } from "../../admin-ldn-services/ldn-services-data/ldn-services-data.service"; +import { BehaviorSubject, from, Observable, of, scan, Subscription, switchMap } from "rxjs"; +import { combineLatest, filter, map, mergeMap, tap } from "rxjs/operators"; +import { getAllSucceededRemoteDataPayload } from "../../../core/shared/operators"; +import { ItemDataService } from "../../../core/data/item-data.service"; +import { AdminNotifyMessagesService } from "../services/admin-notify-messages.service"; +import { SearchConfigurationService } from "../../../core/shared/search/search-configuration.service"; +import { SEARCH_CONFIG_SERVICE } from "../../../my-dspace-page/my-dspace-page.component"; + +@tabulatableObjectsComponent(PaginatedList, ViewMode.Table, Context.CoarNotify) +@Component({ + selector: 'ds-admin-notify-search-result', + templateUrl: './admin-notify-search-result.component.html', + styleUrls: ['./admin-notify-search-result.component.scss'], + providers: [ + { + provide: SEARCH_CONFIG_SERVICE, + useClass: SearchConfigurationService + } + ] +}) +export class AdminNotifySearchResultComponent extends TabulatableResultListElementsComponent, AdminNotifySearchResult> implements OnInit, OnDestroy{ + public messagesSubject$: BehaviorSubject = new BehaviorSubject([]); + public reprocessStatus = QueueStatusMap.QUEUE_STATUS_QUEUED_FOR_RETRY; + //we check on one type of config to render specific table headers + public isInbound: boolean; + + /** + * Array to track all subscriptions and unsubscribe them onDestroy + * @type {Array} + */ + private subs: Subscription[] = []; + + constructor(private modalService: NgbModal, + private adminNotifyMessagesService: AdminNotifyMessagesService, + @Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: SearchConfigurationService) { + super(); + } + + /** + * Map messages on init for readable representation + */ + ngOnInit() { + this.mapDetailsToMessages() + this.subs.push(this.searchConfigService.getCurrentConfiguration('') + .subscribe(configuration => { + this.isInbound = configuration === 'NOTIFY.incoming'; + }) + ); + } + + ngOnDestroy() { + this.subs.forEach(sub => sub.unsubscribe()); + } + + /** + * Open modal for details visualization + * @param message the message to be displayed + */ + openDetailModal(message: AdminNotifyMessage) { + const modalRef = this.modalService.open(AdminNotifyDetailModalComponent); + const messageToOpen = {...message}; + // we delete not necessary or not readable keys + if (this.isInbound) { + delete messageToOpen.target; + delete messageToOpen.object; + } else { + delete messageToOpen.context; + delete messageToOpen.origin; + } + delete messageToOpen._links; + delete messageToOpen.metadata; + delete messageToOpen.thumbnail; + delete messageToOpen.item; + delete messageToOpen.accessStatus; + delete messageToOpen.queueStatus; + + const messageKeys = Object.keys(messageToOpen); + modalRef.componentInstance.notifyMessage = messageToOpen; + modalRef.componentInstance.notifyMessageKeys = messageKeys; + } + + /** + * Reprocess message in status QUEUE_STATUS_QUEUED_FOR_RETRY and update results + * @param message the message to be reprocessed + */ + reprocessMessage(message: AdminNotifyMessage) { + this.subs.push( + this.adminNotifyMessagesService.reprocessMessage(message, this.messagesSubject$) + .subscribe(response => { + this.messagesSubject$.next(response) + } + ) + ) + } + + + /** + * Map readable results to messages + * @private + */ + private mapDetailsToMessages() { + this.subs.push(this.adminNotifyMessagesService.getDetailedMessages(this.objects?.page.map(pageResult => pageResult.indexableObject)) + .subscribe(response => { + this.messagesSubject$.next(response) + })) + } +} diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.html b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.html deleted file mode 100644 index 06aa551a44..0000000000 --- a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.html +++ /dev/null @@ -1,40 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - -
TimestampLDN ServiceRepository ItemTypeStatusAction
-
{{message.queueTimeout}}
-
-
{{message.origin}}
-
-
{{message.context}}
-
-
{{message.coarNotifyType}}
-
-
{{message.queueStatusLabel}}
-
-
- - -
-
-
diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.spec.ts deleted file mode 100644 index 2db8920d7f..0000000000 --- a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdminNotifyIncomingSearchResultComponent } from './admin-notify-incoming-search-result.component'; - -describe('AdminNotifySearchResultComponent', () => { - let component: AdminNotifyIncomingSearchResultComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ AdminNotifyIncomingSearchResultComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(AdminNotifyIncomingSearchResultComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.ts deleted file mode 100644 index 11e94c05c5..0000000000 --- a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/incoming/admin-notify-incoming-search-result.component.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { AdminNotifySearchResult } from '../../models/admin-notify-message-search-result.model'; -import { ViewMode } from '../../../../core/shared/view-mode.model'; -import { Context } from '../../../../core/shared/context.model'; -import { AdminNotifyMessage, QueueStatusMap } from '../../models/admin-notify-message.model'; -import { - tabulatableObjectsComponent -} from '../../../../shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator'; -import { - TabulatableResultListElementsComponent -} from '../../../../shared/object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component'; -import { PaginatedList } from '../../../../core/data/paginated-list.model'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { AdminNotifyDetailModalComponent } from '../../admin-notify-detail-modal/admin-notify-detail-modal.component'; -import { LdnServicesService } from "../../../admin-ldn-services/ldn-services-data/ldn-services-data.service"; -import { BehaviorSubject, concatMap, from, Observable, of, scan, switchMap } from "rxjs"; -import { RemoteData } from "../../../../core/data/remote-data"; -import { LdnService } from "../../../admin-ldn-services/ldn-services-model/ldn-services.model"; -import { filter, map, mergeMap, take, tap, toArray } from "rxjs/operators"; -import { getAllSucceededRemoteDataPayload } from "../../../../core/shared/operators"; -import { ItemDataService } from "../../../../core/data/item-data.service"; -import { AdminNotifyMessagesService } from "../../services/admin-notify-messages.service"; - -@tabulatableObjectsComponent(PaginatedList, ViewMode.Table, Context.CoarNotifyIncoming) -@Component({ - selector: 'ds-admin-notify-search-result', - templateUrl: './admin-notify-incoming-search-result.component.html', - styleUrls: ['./admin-notify-incoming-search-result.component.scss'] -}) -export class AdminNotifyIncomingSearchResultComponent extends TabulatableResultListElementsComponent, AdminNotifySearchResult> implements OnInit{ - public notifyMessages: AdminNotifyMessage[]; - public notifyMessages$: Observable; - public reprocessStatus = QueueStatusMap.QUEUE_STATUS_QUEUED_FOR_RETRY; - - - - constructor(private modalService: NgbModal, - private ldnServicesService: LdnServicesService, - private itemDataService: ItemDataService, - private adminNotifyMessagesService: AdminNotifyMessagesService) { - super(); - } - - /** - * Map messages on init for readable representation - */ - ngOnInit() { - this.notifyMessages = this.objects?.page.map(object => { - const indexableObject = object.indexableObject; - indexableObject.coarNotifyType = indexableObject.coarNotifyType.split(':')[1]; - indexableObject.queueStatusLabel = QueueStatusMap[indexableObject.queueStatusLabel]; - return indexableObject; - }); - - this.notifyMessages$ = from(this.notifyMessages).pipe( - mergeMap(message => of(message)), - mergeMap(message => - message.origin ? this.ldnServicesService.findById(message.origin.toString()).pipe( - getAllSucceededRemoteDataPayload(), - map(detail => ({...message, origin: detail.name})) - ) : of(message), - ), - mergeMap(message => - message.context ? this.itemDataService.findById(message.context.toString()).pipe( - getAllSucceededRemoteDataPayload(), - map(detail => ({...message, context: detail.name})) - ) : of(message), - ), - scan((acc: any, value: any) => [...acc, value], []), - ) - } - - /** - * Open modal for details visualization - * @param message the message to be displayed - */ - openDetailModal(message: AdminNotifyMessage) { - const modalRef = this.modalService.open(AdminNotifyDetailModalComponent); - const messageKeys = Object.keys(message); - const keysToRead = []; - messageKeys.forEach((key) => { - if (typeof message[key] !== 'object') { - keysToRead.push(key); - } - }); - modalRef.componentInstance.notifyMessage = message; - modalRef.componentInstance.notifyMessageKeys = keysToRead; - } - - /** - * Reprocess message in status QUEUE_STATUS_QUEUED_FOR_RETRY and update results - * @param message - */ - reprocessMessage(message: AdminNotifyMessage) { - // TODO implement reprocess - } -} diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.html b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.html deleted file mode 100644 index 639d66a1f3..0000000000 --- a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.html +++ /dev/null @@ -1,39 +0,0 @@ -
- - - - - - - - - - - - - - - - - - - - - -
TimestampRepository ItemLDN ServiceTypeStatusAction
-
{{message.queueTimeout}}
-
-
{{message.object}}
-
-
{{message.target}}
-
-
{{message.coarNotifyType}}
-
-
{{message.queueStatusLabel}}
-
-
- - -
-
-
diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.scss b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.spec.ts deleted file mode 100644 index 110feb2e0c..0000000000 --- a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdminNotifyOutgoingSearchResultComponent } from './admin-notify-outgoing-search-result.component'; - -describe('AdminNotifySearchResultComponent', () => { - let component: AdminNotifyOutgoingSearchResultComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ AdminNotifyOutgoingSearchResultComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(AdminNotifyOutgoingSearchResultComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.ts b/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.ts deleted file mode 100644 index b5b49a8a71..0000000000 --- a/src/app/admin/admin-notify-dashboard/admin-notify-search-result/outgoing/admin-notify-outgoing-search-result.component.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { AdminNotifySearchResult } from '../../models/admin-notify-message-search-result.model'; -import { ViewMode } from '../../../../core/shared/view-mode.model'; -import { Context } from '../../../../core/shared/context.model'; -import { AdminNotifyMessage, QueueStatusMap } from '../../models/admin-notify-message.model'; -import { - tabulatableObjectsComponent -} from '../../../../shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator'; -import { - TabulatableResultListElementsComponent -} from '../../../../shared/object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component'; -import { PaginatedList } from '../../../../core/data/paginated-list.model'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { AdminNotifyDetailModalComponent } from '../../admin-notify-detail-modal/admin-notify-detail-modal.component'; -import { LdnServicesService } from "../../../admin-ldn-services/ldn-services-data/ldn-services-data.service"; -import { from, Observable, of, scan, switchMap } from "rxjs"; -import { combineLatest, filter, map, mergeMap } from "rxjs/operators"; -import { getAllSucceededRemoteDataPayload } from "../../../../core/shared/operators"; -import { ItemDataService } from "../../../../core/data/item-data.service"; -import { AdminNotifyMessagesService } from "../../services/admin-notify-messages.service"; - -@tabulatableObjectsComponent(PaginatedList, ViewMode.Table, Context.CoarNotifyOutgoing) -@Component({ - selector: 'ds-admin-notify-search-result', - templateUrl: './admin-notify-outgoing-search-result.component.html', - styleUrls: ['./admin-notify-outgoing-search-result.component.scss'] -}) -export class AdminNotifyOutgoingSearchResultComponent extends TabulatableResultListElementsComponent, AdminNotifySearchResult> implements OnInit{ - public notifyMessages: AdminNotifyMessage[]; - public notifyMessages$: Observable; - public reprocessStatus = QueueStatusMap.QUEUE_STATUS_QUEUED_FOR_RETRY; - - constructor(private modalService: NgbModal, - private ldnServicesService: LdnServicesService, - private itemDataService: ItemDataService, - private adminNotifyMessagesService: AdminNotifyMessagesService) { - super(); - } - - /** - * Map messages on init for readable representation - */ - ngOnInit() { - this.mapDetailsToMessages() - } - - /** - * Open modal for details visualization - * @param message the message to be displayed - */ - openDetailModal(message: AdminNotifyMessage) { - const modalRef = this.modalService.open(AdminNotifyDetailModalComponent); - const messageKeys = Object.keys(message); - modalRef.componentInstance.notifyMessage = message; - modalRef.componentInstance.notifyMessageKeys = messageKeys; - } - - /** - * Reprocess message in status QUEUE_STATUS_QUEUED_FOR_RETRY and update results - * @param message - */ - reprocessMessage(message: AdminNotifyMessage) { - this.adminNotifyMessagesService.findById(message.id).pipe(getAllSucceededRemoteDataPayload()).subscribe(response => { - console.log(response); - }) - } - - - /** - * Map readable results to messages - * @private - */ - private mapDetailsToMessages() { - this.notifyMessages = this.objects?.page.map(object => { - const indexableObject = object.indexableObject; - indexableObject.coarNotifyType = indexableObject.coarNotifyType.split(':')[1]; - indexableObject.queueStatusLabel = QueueStatusMap[indexableObject.queueStatusLabel]; - return indexableObject; - }); - - this.notifyMessages$ = from(this.notifyMessages).pipe( - mergeMap(message => of(message)), - mergeMap(message => - message.target ? this.ldnServicesService.findById(message.target.toString()).pipe( - getAllSucceededRemoteDataPayload(), - map(detail => ({...message, target: detail.name})) - ) : of(message), - ), - mergeMap(message => - message.object ? this.itemDataService.findById(message.object.toString()).pipe( - getAllSucceededRemoteDataPayload(), - map(detail => ({...message, object: detail.name})) - ) : of(message), - ), - scan((acc: any, value: any) => [...acc, value], []), - ) - } -} 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 index 1fda25d1ef..4c36e01eaf 100644 --- 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 @@ -1,10 +1,11 @@ -import { autoserialize, deserialize, inheritSerialization } from 'cerialize'; +import { autoserialize, autoserializeAs, 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'; import { GenericConstructor } from '../../../core/shared/generic-constructor'; import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model'; +import { Observable } from "rxjs"; export enum QueueStatusMap { QUEUE_STATUS_PROCESSED = 'Processed', @@ -107,6 +108,25 @@ export class AdminNotifyMessage extends DSpaceObject { @autoserialize queueStatus: number; + /** + * Thumbnail link used when browsing items with showThumbs config enabled. + */ + @autoserialize + thumbnail: string; + + /** + * The observable pointing to the item itself + */ + @autoserialize + item: Observable; + + /** + * The observable pointing to the access status of the item + */ + @autoserialize + accessStatus: Observable; + + @deserialize _links: { diff --git a/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.ts b/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.ts index 8f710d987d..d61c6f7712 100644 --- a/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.ts +++ b/src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.ts @@ -10,7 +10,7 @@ import {HALEndpointService} from '../../../core/shared/hal-endpoint.service'; import {NotificationsService} from '../../../shared/notifications/notifications.service'; import {FindListOptions} from '../../../core/data/find-list-options.model'; import {FollowLinkConfig} from '../../../shared/utils/follow-link-config.model'; -import {Observable} from 'rxjs'; +import { BehaviorSubject, from, Observable, of, scan } from 'rxjs'; import {RemoteData} from '../../../core/data/remote-data'; import {PaginatedList} from '../../../core/data/paginated-list.model'; import {NoContent} from '../../../core/shared/NoContent.model'; @@ -21,7 +21,13 @@ import {RestRequestMethod} from '../../../core/data/rest-request-method'; import {CreateData, CreateDataImpl} from '../../../core/data/base/create-data'; import {SearchDataImpl} from '../../../core/data/base/search-data'; import { ADMIN_NOTIFY_MESSAGE } from "../models/admin-notify-message.resource-type"; -import { AdminNotifyMessage } from "../models/admin-notify-message.model"; +import { AdminNotifyMessage, QueueStatusMap } from "../models/admin-notify-message.model"; +import { SearchResult } from "../../../shared/search/models/search-result.model"; +import { map, mergeMap } from "rxjs/operators"; +import { getAllSucceededRemoteDataPayload } from "../../../core/shared/operators"; +import { AdminNotifySearchResult } from "../models/admin-notify-message-search-result.model"; +import { LdnServicesService } from "../../admin-ldn-services/ldn-services-data/ldn-services-data.service"; +import { ItemDataService } from "../../../core/data/item-data.service"; /** * Injectable service responsible for fetching/sending data from/to the REST API on the messages endpoint. @@ -39,7 +45,77 @@ export class AdminNotifyMessagesService extends IdentifiableDataService { + return from(messages.map(message => this.formatMessageLabels(message))).pipe( + mergeMap(message => + message.target ? this.ldnServicesService.findById(message.target.toString()).pipe( + getAllSucceededRemoteDataPayload(), + map(detail => ({...message, target: detail.name})) + ) : of(message), + ), + mergeMap(message => + message.object ? this.itemDataService.findById(message.object.toString()).pipe( + getAllSucceededRemoteDataPayload(), + map(detail => ({...message, object: detail.name})) + ) : of(message), + ), + mergeMap(message => + message.origin ? this.ldnServicesService.findById(message.origin.toString()).pipe( + getAllSucceededRemoteDataPayload(), + map(detail => ({...message, origin: detail.name})) + ) : of(message), + ), + mergeMap(message => + message.context ? this.itemDataService.findById(message.context.toString()).pipe( + getAllSucceededRemoteDataPayload(), + map(detail => ({...message, context: detail.name})) + ) : of(message), + ), + scan((acc: any, value: any) => [...acc, value], []), + ) + } + + /** + * Reprocess message in status QUEUE_STATUS_QUEUED_FOR_RETRY and update results + * @param message the message to reprocess + * @param messageSubject the current visualised messages source + */ + public reprocessMessage(message: AdminNotifyMessage, messageSubject: BehaviorSubject) : Observable { + return this.findById(message.id).pipe( + getAllSucceededRemoteDataPayload(), + map(reprocessedMessage => this.formatMessageLabels(reprocessedMessage)), + mergeMap((newMessage) => messageSubject.pipe( + map(messages => { + const messageToUpdate = messages.find(currentMessage => currentMessage.id === message.id); + const indexOfMessageToUpdate = messages.indexOf(messageToUpdate); + newMessage.target = messageToUpdate.target; + newMessage.object = messageToUpdate.object; + newMessage.origin = messageToUpdate.origin; + newMessage.context = messageToUpdate.context; + messages[indexOfMessageToUpdate] = newMessage; + return messages + }) + )), + ) + } } diff --git a/src/app/core/shared/context.model.ts b/src/app/core/shared/context.model.ts index 1526be1033..dcebf5794c 100644 --- a/src/app/core/shared/context.model.ts +++ b/src/app/core/shared/context.model.ts @@ -40,6 +40,5 @@ export enum Context { Bitstream = 'bitstream', - CoarNotifyIncoming = 'coarNotifyIncoming', - CoarNotifyOutgoing = 'coarNotifyOutgoing', + CoarNotify = 'coarNotify', } diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 60134d54e3..b93abdf993 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -3529,7 +3529,51 @@ "sorting.queue_attempts.ASC": "Queue attempted Ascending", - "orgunit.listelement.badge": "Organizational Unit", + "type.notify-detail-modal": "Type", + + "id.notify-detail-modal": "Id", + + "coarNotifyType.notify-detail-modal": "Coar Notify type", + + "activityStreamType.notify-detail-modal": "Activity stream type", + + "inReplyTo.notify-detail-modal": "In reply to", + + "object.notify-detail-modal": "Repository Item", + + "context.notify-detail-modal": "Repository Item", + + "queueAttempts.notify-detail-modal": "Queue attempts", + + "queueLastStartTime.notify-detail-modal": "Queue last started", + + "origin.notify-detail-modal": "LDN Service", + + "target.notify-detail-modal": "LDN Service", + + "queueStatusLabel.notify-detail-modal": "Queue status", + + "queueTimeout.notify-detail-modal": "Queue timeout", + + "notify-message-modal.title": "Message Detail", + + "notify-message-result.timestamp": "Timestamp", + + "notify-message-result.repositoryItem": "Repository Item", + + "notify-message-result.ldnService": "LDN Service", + + "notify-message-result.type": "Type", + + "notify-message-result.status": "Status", + + "notify-message-result.action": "Action", + + "notify-message-result.detail": "Detail", + + "notify-message-result.reprocess": "Reprocess", + + "orgunit.listelement.badge": "Repository Item", "orgunit.listelement.no-title": "Untitled",