diff --git a/projects/laji-api-client-b/src/laji-api-client-b.service.ts b/projects/laji-api-client-b/src/laji-api-client-b.service.ts index 77b50a92b..49d87e54e 100644 --- a/projects/laji-api-client-b/src/laji-api-client-b.service.ts +++ b/projects/laji-api-client-b/src/laji-api-client-b.service.ts @@ -2,7 +2,7 @@ import { Inject, Injectable, InjectionToken } from '@angular/core'; import { paths } from 'projects/laji-api-client-b/generated/api.d'; import { HttpClient } from '@angular/common/http'; import { Observable, of } from 'rxjs'; -import { shareReplay, tap } from 'rxjs/operators'; +import { share, tap } from 'rxjs/operators'; type WithResponses = T & { responses: unknown }; type Parameters = 'parameters' extends keyof T ? T['parameters'] : never; @@ -189,7 +189,7 @@ export class LajiApiClientBService { lastRefresh: Date.now() }); }), - shareReplay(1) + share() ) as any; cachedPath?.set(paramsHash, { diff --git a/projects/laji/src/app/shared-modules/spreadsheet/importer/importer.component.ts b/projects/laji/src/app/shared-modules/spreadsheet/importer/importer.component.ts index 3e2c3ff6f..1db57cf10 100644 --- a/projects/laji/src/app/shared-modules/spreadsheet/importer/importer.component.ts +++ b/projects/laji/src/app/shared-modules/spreadsheet/importer/importer.component.ts @@ -35,9 +35,9 @@ import { toHtmlSelectElement } from '../../../shared/service/html-element.servic import { ModalRef, ModalService } from 'projects/laji-ui/src/lib/modal/modal.service'; import type { components } from 'projects/laji-api-client-b/generated/api'; +import type { paths } from 'projects/laji-api-client-b/generated/api'; -type Document = components['schemas']['document']; -type PublicityRestrictions = Document['publicityRestrictions']; +type PublicityRestrictions = NonNullable['publicityRestrictions']; type BatchJob = components['schemas']['BatchJobValidationStatusResponse']; @Component({ @@ -525,11 +525,7 @@ export class ImporterComponent implements OnInit, OnDestroy { const rowData = this.parsedData!.filter(data => data.document !== null); - this.importService.sendData({ - ...this.job, - dataOrigin: 'MY.dataOriginSpreadsheetFile', - publicityRestrictions - } as any).pipe( + this.importService.sendData(this.job!.id, 'MY.dataOriginSpreadsheetFile', publicityRestrictions).pipe( switchMap(() => this.importService.waitToComplete(this.job!, (status) => { ticker += add; this.current = status.processed === this.total ? diff --git a/projects/laji/src/app/shared-modules/spreadsheet/service/import.service.ts b/projects/laji/src/app/shared-modules/spreadsheet/service/import.service.ts index 0d680ab74..9e07693c6 100644 --- a/projects/laji/src/app/shared-modules/spreadsheet/service/import.service.ts +++ b/projects/laji/src/app/shared-modules/spreadsheet/service/import.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; +import { EMPTY, Observable, of, Subject, timer } from 'rxjs'; import { IFormField, LEVEL_DOCUMENT, @@ -10,12 +10,15 @@ import { } from '../model/excel'; import { MappingService } from './mapping.service'; import * as Hash from 'object-hash'; -import { catchError, delay, switchMap } from 'rxjs/operators'; +import { catchError, delay, expand, switchMap, tap } from 'rxjs/operators'; import { LajiApiClientBService } from 'projects/laji-api-client-b/src/laji-api-client-b.service'; import type { components } from 'projects/laji-api-client-b/generated/api'; +import type { paths } from 'projects/laji-api-client-b/generated/api'; type Document = components['schemas']['document']; type BatchJob = components['schemas']['BatchJobValidationStatusResponse']; +type DataOrigin = NonNullable['dataOrigin']; +type PublicityRestrictions = NonNullable['publicityRestrictions']; export interface IData { rowIdx: number; @@ -87,31 +90,23 @@ export class ImportService { } waitToComplete(job: BatchJob, processCB: (status: BatchJob['status']) => void): Observable { - return this.api.get('/documents/batch/{jobID}', { path: { jobID: job.id }, query: { validationErrorFormat: 'dotNotation' } }).pipe( - switchMap(response => { + const req$ = () => this.api.get('/documents/batch/{jobID}', { path: { jobID: job.id } }, 0); + return req$().pipe( + expand(response => { processCB(response.status); - if (!['VALIDATING', 'COMPLETING'].includes(response.phase)) { - return of(response); - } - return of(response).pipe( - delay(1000), - switchMap(() => this.waitToComplete(job, processCB)) - ); - }), - catchError((e) => { - console.log('ERROR', e); - return of(e).pipe( - delay(1000), - switchMap(() => this.waitToComplete(job, processCB)) - ); + return !['VALIDATING', 'COMPLETING'].includes(response.phase) + ? EMPTY + : req$().pipe(delay(1000)); }) ); } sendData( - job: BatchJob - ): Observable { - return this.api.post('/documents/batch/{jobID}', { path: { jobID: job.id } }); + jobID: string, + dataOrigin: DataOrigin, + publicityRestrictions: PublicityRestrictions + ) { + return this.api.post('/documents/batch/{jobID}', { path: { jobID }, query: { dataOrigin, publicityRestrictions } }); } flatFieldsToDocuments(