Load files when searching

This commit is contained in:
Adina Țeudan 2021-11-17 23:33:12 +02:00
parent 0a85cc93ef
commit ab8b3f760a

View File

@ -1,20 +1,53 @@
import { Injectable, Injector } from '@angular/core';
import { GenericService } from '@iqser/common-ui';
import { ISearchInput, ISearchRequest, ISearchResponse } from '@red/domain';
import { from, Observable, of, zip } from 'rxjs';
import { mapTo, switchMap } from 'rxjs/operators';
import { AppStateService } from '../../../../state/app-state.service';
import { DossiersService } from '../../../../services/entity-services/dossiers.service';
import { FilesMapService } from '../../../../services/entity-services/files-map.service';
@Injectable()
export class PlatformSearchService extends GenericService<ISearchResponse> {
constructor(protected readonly _injector: Injector) {
constructor(
protected readonly _injector: Injector,
private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService,
private readonly _filesMapService: FilesMapService,
) {
super(_injector, 'search');
}
search({ dossierIds, query }: ISearchInput) {
search({ dossierIds, query }: ISearchInput): Observable<ISearchResponse> {
if (!query) {
return of({
matchedDocuments: [],
total: 0,
});
}
return this._post({
dossierIds,
queryString: query ?? '',
page: 1,
returnSections: false,
pageSize: 300,
} as ISearchRequest);
} as ISearchRequest).pipe(switchMap(searchValue => this._loadFiles$(searchValue)));
}
private _loadFiles$(searchResponse: ISearchResponse): Observable<ISearchResponse> {
const responseDossierIds = Array.from(
searchResponse.matchedDocuments
.filter(document => this._dossiersService.has(document.dossierId))
.filter(document => !this._filesMapService.get(document.dossierId, document.fileId))
.reduce((set, document) => set.add(document.dossierId), new Set<string>()),
);
return responseDossierIds.length
? zip(...responseDossierIds.map(dossierId => this._filesForDossier$(dossierId))).pipe(mapTo(searchResponse))
: of(searchResponse);
}
private _filesForDossier$(dossierId: string): Observable<any> {
return from(this._appStateService.getFiles(this._dossiersService.find(dossierId)));
}
}