Skip to content
Snippets Groups Projects
Commit 442b5fdf authored by Menou Lucas's avatar Menou Lucas
Browse files

Handle request and IDFinder with @ngrx/component-store

The component store is now used to get all the aliases
contained in a given dataset.
parent 526aa06e
No related branches found
No related tags found
1 merge request!99Make implementation of form-sample with abstraction
...@@ -63,4 +63,4 @@ describe('[Instance][Store] SearchService', () => { ...@@ -63,4 +63,4 @@ describe('[Instance][Store] SearchService', () => {
} }
) )
); );
}); });
\ No newline at end of file
...@@ -30,7 +30,6 @@ export class SearchService { ...@@ -30,7 +30,6 @@ export class SearchService {
* @return Observable<any[]> * @return Observable<any[]>
*/ */
retrieveData(query: string): Observable<any[]> { retrieveData(query: string): Observable<any[]> {
console.log(`${this.config.apiUrl}/search/${query}`);
return this.http.get<any[]>(`${this.config.apiUrl}/search/${query}`); return this.http.get<any[]>(`${this.config.apiUrl}/search/${query}`);
} }
......
...@@ -3,10 +3,26 @@ import { ComponentStore, tapResponse } from '@ngrx/component-store'; ...@@ -3,10 +3,26 @@ import { ComponentStore, tapResponse } from '@ngrx/component-store';
import { Observable, concatMap } from 'rxjs'; import { Observable, concatMap } from 'rxjs';
import { queryMakerService } from './query-maker.service'; import { queryMakerService } from './query-maker.service';
/**
* Interface representing the internal state in the component store
*
* @interface
*/
export interface aliasesState { export interface aliasesState {
aliases: string[]; aliases: string[];
} }
/**
* Interface to pass all necessary information to retrieve an alias in a database
*
* @interface
*/
export interface getterAliases {
alias: string;
attributes: number[];
datasetName: string;
}
@Injectable() @Injectable()
export class aliasesStore extends ComponentStore<aliasesState> { export class aliasesStore extends ComponentStore<aliasesState> {
constructor(private query: queryMakerService) { constructor(private query: queryMakerService) {
...@@ -15,15 +31,13 @@ export class aliasesStore extends ComponentStore<aliasesState> { ...@@ -15,15 +31,13 @@ export class aliasesStore extends ComponentStore<aliasesState> {
aliases$: Observable<string[]> = this.select((state) => state.aliases); aliases$: Observable<string[]> = this.select((state) => state.aliases);
readonly getAlias = this.effect((trigger$: Observable<string>) => { readonly getAlias = this.effect((trigger$: Observable<getterAliases>) => {
return trigger$.pipe( return trigger$.pipe(
concatMap((id) => concatMap((id) =>
this.query.logger(id).pipe( this.query.aliasesRetriever(id).pipe(
tapResponse( tapResponse(
(res) => { (res) => {
for (const property in res[0]) { this.formUpdater(res[0]);
this.addAlias(res[0][property]);
}
}, },
(err) => console.error(err) (err) => console.error(err)
) )
...@@ -35,4 +49,17 @@ export class aliasesStore extends ComponentStore<aliasesState> { ...@@ -35,4 +49,17 @@ export class aliasesStore extends ComponentStore<aliasesState> {
readonly addAlias = this.updater((state: aliasesState, value: string) => { readonly addAlias = this.updater((state: aliasesState, value: string) => {
return { aliases: [...state.aliases, value] } as aliasesState; return { aliases: [...state.aliases, value] } as aliasesState;
}); });
readonly cleanAliases = this.updater(() => {
return { aliases: [] } as aliasesState;
});
private formUpdater(res: Object): void {
this.cleanAliases();
console.log(res[0]);
for (const prop in res[0]) {
const el = res[0][prop].toString();
this.addAlias(el);
}
}
} }
...@@ -7,15 +7,15 @@ ...@@ -7,15 +7,15 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
import { HttpErrorResponse } from '@angular/common/http';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { NgForm } from '@angular/forms'; import { NgForm } from '@angular/forms';
import { catchError, Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { SearchService } from 'src/app/instance/store/services/search.service'; import { DatasetService } from 'src/app/instance/store/services/dataset.service';
import { AbstractFormSampleComponent } from '../abstract-form-sample.component'; import { AbstractFormSampleComponent } from '../abstract-form-sample.component';
import { aliasesStore } from './aliases.store'; import { aliasesStore, getterAliases } from './aliases.store';
import { queryMakerService } from './query-maker.service'; import { queryMakerService } from './query-maker.service';
/** /**
* Component to find aliases or IDs for a data from a dataset or a view (e.g. a star name). * Component to find aliases or IDs for a data from a dataset or a view (e.g. a star name).
* *
...@@ -27,27 +27,24 @@ import { queryMakerService } from './query-maker.service'; ...@@ -27,27 +27,24 @@ import { queryMakerService } from './query-maker.service';
@Component({ @Component({
selector: 'app-form-findID', selector: 'app-form-findID',
templateUrl: './form-findID.component.html', templateUrl: './form-findID.component.html',
providers: [aliasesStore, queryMakerService], providers: [aliasesStore, queryMakerService, DatasetService],
}) })
export class FormFindIDComponent extends AbstractFormSampleComponent< export class FormFindIDComponent extends AbstractFormSampleComponent<
NgForm, NgForm,
void void
> { > {
@Input() attributesToSearch: number[] = null;
aliases$: Observable<string[]> = this.store.aliases$; aliases$: Observable<string[]> = this.store.aliases$;
constructor(private readonly store: aliasesStore) { constructor(private readonly store: aliasesStore) {
super(); super();
} this.store.setState({ aliases: [] });
ngOnInit(): void {
this.store.setState({ aliases: ['hi', 'coucou'] });
} }
submit(f: NgForm): void { submit(f: NgForm): void {
// console.log(f.value.alias); const getterObject: getterAliases = <getterAliases>{ alias: f.value.alias, attributes: this.attributesToSearch, datasetName: this.datasetName };
// this.store.addAlias(f.value.alias); this.store.getAlias(getterObject);
this.store.getAlias(f.value.alias);
// this.store.addAlias(f.value.alias);
} }
// @Input() attributesToSearch: number[] = null; // @Input() attributesToSearch: number[] = null;
......
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { interval, Observable, of, take } from 'rxjs'; import { concat, merge, Observable } from 'rxjs';
import { SearchService } from 'src/app/instance/store/services/search.service'; import { SearchService } from 'src/app/instance/store/services/search.service';
import { DatasetService } from 'src/app/instance/store/services/dataset.service';
import { getterAliases } from './aliases.store';
import { Attribute } from 'src/app/metamodel/models/attribute.model';
@Injectable() @Injectable()
export class queryMakerService { export class queryMakerService {
private queries: string[] = [];
constructor(private search: SearchService) {}; constructor(
private dataset: DatasetService,
private search: SearchService
) {}
logger(id: string): Observable<any[]> { private attributeGetter(datasetName: string): Observable<Attribute[]> {
// query for plato synonyms return this.dataset.retrieveAttribute(datasetName);
console.log(id); }
const query = `wp131400_main?a=1;2;3&c=1::eq::${id}`;
console.log(query); private inputIsString(input: string): boolean {
return this.search.retrieveData(query); const num = parseInt(input);
return isNaN(num);
}
aliasesRetriever(id: getterAliases): Observable<Object[]> | never {
if (!this.inputIsString(id.alias)) {
const a = id.attributes.toString().replace(/\,/g, ';');
id.attributes.every((el: number) => {
this.queries.push(
`${id.datasetName}?a=${a}&c=${el}::eq::${id.alias}`
);
});
const observables: Observable<any[]>[] = [];
this.queries.every((query: string) => {
observables.push(this.search.retrieveData(query));
});
return merge(...observables);
}
throw new Error(
`Cannot handle the case where alias is not a number yet`
);
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment