111638: Clean up autoRefreshing calls

This commit is contained in:
Andreas Awouters
2024-02-19 13:58:42 +01:00
parent 08299e5c78
commit fa2f3e63e7
2 changed files with 34 additions and 8 deletions

View File

@@ -1,4 +1,4 @@
import { Component, Input, OnDestroy } from '@angular/core'; import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { ScriptDataService } from '../../../../core/data/processes/script-data.service'; import { ScriptDataService } from '../../../../core/data/processes/script-data.service';
import { ContentSource } from '../../../../core/shared/content-source.model'; import { ContentSource } from '../../../../core/shared/content-source.model';
import { ProcessDataService } from '../../../../core/data/processes/process-data.service'; import { ProcessDataService } from '../../../../core/data/processes/process-data.service';
@@ -29,7 +29,7 @@ import { ContentSourceSetSerializer } from '../../../../core/shared/content-sour
styleUrls: ['./collection-source-controls.component.scss'], styleUrls: ['./collection-source-controls.component.scss'],
templateUrl: './collection-source-controls.component.html', templateUrl: './collection-source-controls.component.html',
}) })
export class CollectionSourceControlsComponent implements OnDestroy { export class CollectionSourceControlsComponent implements OnInit, OnDestroy {
/** /**
* Should the controls be enabled. * Should the controls be enabled.
@@ -48,6 +48,7 @@ export class CollectionSourceControlsComponent implements OnDestroy {
contentSource$: Observable<ContentSource>; contentSource$: Observable<ContentSource>;
private subs: Subscription[] = []; private subs: Subscription[] = [];
private autoRefreshIDs: string[] = [];
testConfigRunning$ = new BehaviorSubject(false); testConfigRunning$ = new BehaviorSubject(false);
importRunning$ = new BehaviorSubject(false); importRunning$ = new BehaviorSubject(false);
@@ -94,7 +95,10 @@ export class CollectionSourceControlsComponent implements OnDestroy {
}), }),
// filter out responses that aren't successful since the pinging of the process only needs to happen when the invocation was successful. // filter out responses that aren't successful since the pinging of the process only needs to happen when the invocation was successful.
filter((rd) => rd.hasSucceeded && hasValue(rd.payload)), filter((rd) => rd.hasSucceeded && hasValue(rd.payload)),
switchMap((rd) => this.processDataService.autoRefreshUntilCompletion(rd.payload.processId)), switchMap((rd) => {
this.autoRefreshIDs.push(rd.payload.processId);
return this.processDataService.autoRefreshUntilCompletion(rd.payload.processId);
}),
map((rd) => rd.payload) map((rd) => rd.payload)
).subscribe((process: Process) => { ).subscribe((process: Process) => {
if (process.processStatus.toString() === ProcessStatus[ProcessStatus.FAILED].toString()) { if (process.processStatus.toString() === ProcessStatus[ProcessStatus.FAILED].toString()) {
@@ -135,7 +139,10 @@ export class CollectionSourceControlsComponent implements OnDestroy {
} }
}), }),
filter((rd) => rd.hasSucceeded && hasValue(rd.payload)), filter((rd) => rd.hasSucceeded && hasValue(rd.payload)),
switchMap((rd) => this.processDataService.autoRefreshUntilCompletion(rd.payload.processId)), switchMap((rd) => {
this.autoRefreshIDs.push(rd.payload.processId);
return this.processDataService.autoRefreshUntilCompletion(rd.payload.processId);
}),
map((rd) => rd.payload) map((rd) => rd.payload)
).subscribe((process) => { ).subscribe((process) => {
if (process.processStatus.toString() === ProcessStatus[ProcessStatus.FAILED].toString()) { if (process.processStatus.toString() === ProcessStatus[ProcessStatus.FAILED].toString()) {
@@ -170,7 +177,10 @@ export class CollectionSourceControlsComponent implements OnDestroy {
} }
}), }),
filter((rd) => rd.hasSucceeded && hasValue(rd.payload)), filter((rd) => rd.hasSucceeded && hasValue(rd.payload)),
switchMap((rd) => this.processDataService.autoRefreshUntilCompletion(rd.payload.processId)), switchMap((rd) => {
this.autoRefreshIDs.push(rd.payload.processId);
return this.processDataService.autoRefreshUntilCompletion(rd.payload.processId);
}),
map((rd) => rd.payload) map((rd) => rd.payload)
).subscribe((process) => { ).subscribe((process) => {
if (process.processStatus.toString() === ProcessStatus[ProcessStatus.FAILED].toString()) { if (process.processStatus.toString() === ProcessStatus[ProcessStatus.FAILED].toString()) {
@@ -191,5 +201,9 @@ export class CollectionSourceControlsComponent implements OnDestroy {
sub.unsubscribe(); sub.unsubscribe();
} }
}); });
this.autoRefreshIDs.forEach((id) => {
this.processDataService.stopAutoRefreshing(id);
});
} }
} }

View File

@@ -1,5 +1,5 @@
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { Component, Inject, NgZone, OnInit, PLATFORM_ID } from '@angular/core'; import { Component, Inject, NgZone, OnInit, PLATFORM_ID, OnDestroy } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
import { finalize, map, switchMap, take, tap, find, startWith } from 'rxjs/operators'; import { finalize, map, switchMap, take, tap, find, startWith } from 'rxjs/operators';
@@ -36,7 +36,7 @@ import { PROCESS_PAGE_FOLLOW_LINKS } from '../process-page.resolver';
/** /**
* A component displaying detailed information about a DSpace Process * A component displaying detailed information about a DSpace Process
*/ */
export class ProcessDetailComponent implements OnInit { export class ProcessDetailComponent implements OnInit, OnDestroy {
/** /**
* The AlertType enumeration * The AlertType enumeration
@@ -80,6 +80,8 @@ export class ProcessDetailComponent implements OnInit {
isRefreshing$: Observable<boolean>; isRefreshing$: Observable<boolean>;
protected autoRefreshingID: string;
/** /**
* Reference to NgbModal * Reference to NgbModal
*/ */
@@ -108,7 +110,8 @@ export class ProcessDetailComponent implements OnInit {
this.processRD$ = this.route.data.pipe( this.processRD$ = this.route.data.pipe(
switchMap((data) => { switchMap((data) => {
if (isPlatformBrowser(this.platformId)) { if (isPlatformBrowser(this.platformId)) {
return this.processService.autoRefreshUntilCompletion(this.route.snapshot.params.id, 5000, ...PROCESS_PAGE_FOLLOW_LINKS); this.autoRefreshingID = this.route.snapshot.params.id;
return this.processService.autoRefreshUntilCompletion(this.autoRefreshingID, 5000, ...PROCESS_PAGE_FOLLOW_LINKS);
} else { } else {
return [data.process as RemoteData<Process>]; return [data.process as RemoteData<Process>];
} }
@@ -128,6 +131,15 @@ export class ProcessDetailComponent implements OnInit {
); );
} }
/**
* Make sure the autoRefreshUntilCompletion is cleaned up properly
*/
ngOnDestroy() {
if (hasValue(this.autoRefreshingID)) {
this.processService.stopAutoRefreshing(this.autoRefreshingID);
}
}
/** /**
* Get the name of a bitstream * Get the name of a bitstream
* @param bitstream * @param bitstream