import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http' import { Observable } from 'rxjs'; import { map, catchError } from 'rxjs/operators'; import { Album } from './model/album'; import { ElsService } from './els.service'; @Injectable() export class ElsAlbumService extends ElsService { public static readonly GET_ALBUMS_DEFAULT_QUERY = { 'query': { 'bool': { 'must': [], 'must_not': [], 'filter': [ { 'range': { 'Avg Bit Rate': { 'lte': '128'}}} ] } }, 'sort': [ { '_script' : { 'type' : 'number', 'script' : { 'lang': 'painless', 'source': 'doc[\'Play Count\'].value / doc[\'Track Count\'].value' }, 'order' : 'desc' } }, { 'Avg Bit Rate': { 'order': 'asc' } } ], 'size': 500 } constructor(protected http: HttpClient) { super(http); } getAlbums(query: any): Observable { console.info('getAlbums'); console.info(query); return this.http .post(this.elsUrl + ElsService.ALBUM_INDEX_NAME + ElsService.ACTION_SEARCH, JSON.stringify(query), {headers: this.headers}) .pipe( map(res => this.responseToAlbums(res)), catchError(error => this.handleError(error, 'getAlbums')) ); } getAlbumsFiltered(size: number): Observable { // http://localhost:9200/itunes-albums/_search console.info('getAlbums'); return this.http .post(this.elsUrl + ElsService.ALBUM_INDEX_NAME + ElsService.ACTION_SEARCH, JSON.stringify({ 'sort': [ { 'Avg Bit Rate': { 'order': 'asc' } } ], 'size': size, 'query': { 'bool': { 'must': [], 'filter': [ { 'match_all': {} } ], 'should': [], 'must_not': [ { 'match_phrase': { 'Artist': 'François Pérusse' } }, { 'match_phrase': { 'Album Artist': 'Comédiens' } } ] } } }), {headers: this.headers}) .pipe( map(res => this.responseToAlbums(res)), catchError(error => this.handleError(error, 'getAlbums')) ); } }