Load files when searching
This commit is contained in:
parent
0a85cc93ef
commit
ab8b3f760a
@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user