Skip to content
Snippets Groups Projects
search.effects.ts 4.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • François Agneray's avatar
    François Agneray committed
    import { Injectable } from '@angular/core';
    
    
    François Agneray's avatar
    François Agneray committed
    import { ToastrService } from 'ngx-toastr';
    
    François Agneray's avatar
    François Agneray committed
    import { Effect, Actions, ofType } from '@ngrx/effects';
    
    François Agneray's avatar
    François Agneray committed
    import { Store } from '@ngrx/store';
    import { of } from 'rxjs';
    
    François Agneray's avatar
    François Agneray committed
    import { map, switchMap, withLatestFrom, catchError } from 'rxjs/operators';
    
    François Agneray's avatar
    François Agneray committed
    
    import * as criteriaActions from '../../metamodel/action/criteria.action';
    import * as searchActions from './search.action';
    
    François Agneray's avatar
    François Agneray committed
    import * as fromSearch from './search.reducer';
    
    François Agneray's avatar
    François Agneray committed
    import { SearchService } from './search.service';
    import { BetweenCriterion, SearchMeta } from './model';
    
    François Agneray's avatar
    François Agneray committed
    
    @Injectable()
    export class SearchEffects {
        constructor(
    
    François Agneray's avatar
    François Agneray committed
            private actions$: Actions,
    
    François Agneray's avatar
    François Agneray committed
            private searchService: SearchService,
            private toastr: ToastrService,
    
    François Agneray's avatar
    François Agneray committed
            private store$: Store<{search: fromSearch.State}>
    
    François Agneray's avatar
    François Agneray committed
        ) { }
    
        @Effect()
        loadDatasetAttributeListSuccessAction$ = this.actions$.pipe(
            ofType(criteriaActions.LOAD_DATASET_ATTRIBUTE_LIST_SUCCESS),
            switchMap((action: criteriaActions.LoadDatasetAttributeListSuccessAction) => {
                const outputList = action.payload
                    .filter(attribute => attribute.selected && attribute.id_output_family)
                    .map(attribute => attribute.id);
    
                const criteriaList = action.payload
                    .filter(attribute => attribute.id_criteria_family && attribute.search_type && attribute.min)
                    .map(attribute => {
                        if (attribute.search_type === 'bw') {
                            return new BetweenCriterion(attribute.id, attribute.min.toString(), attribute.max.toString());
                        }
                    });
    
                return [
    
    François Agneray's avatar
    François Agneray committed
                    new searchActions.UpdateDefaultOutputListAction(outputList),
                    new searchActions.UpdateDefaultCriteriaListAction(criteriaList)
    
    François Agneray's avatar
    François Agneray committed
                ];
            })
        );
    
    François Agneray's avatar
    François Agneray committed
    
        @Effect()
        updateDefaultOutputListAction$ = this.actions$.pipe(
            ofType(searchActions.UPDATE_DEFAULT_OUTPUT_LIST),
            withLatestFrom(this.store$),
            switchMap(([action, state]) => {
                if (state.search.outputList.length > 0) {
                    return of({type: 'No Action'});
                } else {
                    const updateDefaultOutputListAction = action as searchActions.UpdateDefaultOutputListAction;
                    return of(new searchActions.UpdateOutputListAction(updateDefaultOutputListAction.payload));
                }
            })
        );
    
        @Effect()
        updateDefaultCriteriaListAction$ = this.actions$.pipe(
            ofType(searchActions.UPDATE_DEFAULT_CRITERIA_LIST),
            withLatestFrom(this.store$),
            switchMap(([action, state]) => {
                if (state.search.criteriaList.length > 0) {
                    return of({type: 'No Action'});
                } else {
                    const updateDefaultCriteriaListAction = action as searchActions.UpdateDefaultCriteriaListAction;
                    return of(new searchActions.UpdateCriteriaListAction(updateDefaultCriteriaListAction.payload));
                }
            })
        );
    
    François Agneray's avatar
    François Agneray committed
    
        @Effect()
        retrieveMetaAction$ = this.actions$.pipe(
            ofType(searchActions.RETRIEVE_META),
            withLatestFrom(this.store$),
            switchMap(([action, state]) => {
                const query = state.search.datasetName + '?a=' + 
                state.search.outputList.join(';') + '&c=' +
                state.search.criteriaList.map(criterion => criterion.getCriterionStr()).join(';');
                return this.searchService.retrieveMeta(query).pipe(
                    map((searchMeta: SearchMeta) => new searchActions.RetrieveMetaSuccessAction(searchMeta)),
                    catchError(() => of(new searchActions.RetrieveMetaFailedAction()))
                )
            })
        )
    
        @Effect({dispatch: false})
        retrieveMetaFailedAction$ = this.actions$.pipe(
            ofType(searchActions.RETRIEVE_META_FAILED),
            map(_ => this.toastr.error('Loading Failed!', 'The search meta data loading failed'))
        );
    
        @Effect()
        retrieveDataAction$ = this.actions$.pipe(
            ofType(searchActions.RETRIEVE_DATA),
            withLatestFrom(this.store$),
            switchMap(([action, state]) => {
                const retrieveDataAction = action as searchActions.RetrieveDataAction;
                const query = state.search.datasetName + '?a=' + 
                state.search.outputList.join(';') + '&c=' +
                state.search.criteriaList.map(criterion => criterion.getCriterionStr()).join(';') +
                '&p=10:' + retrieveDataAction.payload;
                return this.searchService.retrieveData(query).pipe(
                    map((searchData: any[]) => new searchActions.RetrieveDataSuccessAction(searchData)),
                    catchError(() => of(new searchActions.RetrieveDataFailedAction()))
                )
            })
        )
    
        @Effect({dispatch: false})
        retrieveDataFailedAction$ = this.actions$.pipe(
            ofType(searchActions.RETRIEVE_DATA_FAILED),
            map(_ => this.toastr.error('Loading Failed!', 'The search data loading failed'))
        );
    
    François Agneray's avatar
    François Agneray committed
    }