Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | 21x 21x 21x 21x 21x 21x 21x 7x 7x 7x 2x 2x 2x 2x 2x 1x 2x 2x 2x 2x 2x 1x 2x 2x 2x 2x | import { HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable, map } from 'rxjs';
import { SearchParameter, SearchResponse } from 'ish-core/models/search/search.model';
import { SparqueSearch } from 'ish-core/models/sparque-search/sparque-search.interface';
import { SparqueSearchMapper } from 'ish-core/models/sparque-search/sparque-search.mapper';
import { ProductsServiceInterface } from 'ish-core/service-provider/products.service-provider';
import { SparqueApiService } from 'ish-core/services/sparque-api/sparque-api.service';
import { omit } from 'ish-core/utils/functions';
import { URLFormParams } from 'ish-core/utils/url-form-params';
/**
* Service for interacting with the Sparque API to perform search-related operations.
* Extends the base `SearchService` to provide specific implementations for Sparque.
*/
@Injectable({ providedIn: 'root' })
export class SparqueProductsService implements ProductsServiceInterface {
// API version for Sparque API.
private readonly apiVersion = 'v2';
// Maximum number of facet options to request from the Sparque API.
private readonly facetOptionsCount = '10';
constructor(private sparqueApiService: SparqueApiService, private sparqueSearchMapper: SparqueSearchMapper) {}
/**
* Searches for products based on the provided search parameters.
*
* @param searchParams - The parameters for the product search, including term, amount, offset, and sorting.
* @returns An observable emitting the mapped search response.
*/
searchProducts(searchParams: SearchParameter): Observable<SearchResponse> {
let params = new HttpParams()
.set('count', searchParams.amount.toString())
.set('offset', searchParams.offset.toString())
.set('facetOptionsCount', this.facetOptionsCount);
Iif (searchParams.sorting && searchParams.sorting !== 'default') {
params = params.set('sorting', searchParams.sorting);
}
if (!searchParams.searchParameter && searchParams.searchTerm) {
params = params.set('keyword', searchParams.searchTerm);
}
return this.sparqueApiService
.get<SparqueSearch>(`search`, this.apiVersion, { params, skipApiErrorHandling: true })
.pipe(map(result => this.sparqueSearchMapper.fromData(result, { searchTerm: [searchParams.searchTerm] })));
}
/**
* Retrieves filtered products based on the provided search parameters.
*
* @param searchParameter - The search parameters, including facets and search term.
* @param amount - The number of products to retrieve.
* @param sortKey - The key to sort the results by (optional).
* @param offset - The offset for pagination (default is 0).
* @returns An observable emitting the mapped search response.
*/
getFilteredProducts(
searchParameter: URLFormParams,
amount: number,
sortKey?: string,
offset = 0
): Observable<SearchResponse> {
let params = new HttpParams()
.set('count', amount ? amount.toString() : '')
.set('offset', offset.toString())
.set('facetOptionsCount', this.facetOptionsCount)
.set('keyword', searchParameter.searchTerm ? searchParameter.searchTerm[0] : '');
if (sortKey && sortKey !== 'default') {
params = params.set('sorting', sortKey);
}
params = params.append('selectedFacets', this.selectedFacets(omit(searchParameter, 'searchTerm')));
return this.sparqueApiService
.get<SparqueSearch>(`search`, this.apiVersion, { params, skipApiErrorHandling: true })
.pipe(map(result => this.sparqueSearchMapper.fromData(result, searchParameter)));
}
private selectedFacets(object: URLFormParams): string {
let params = '';
Object.entries(object).forEach(([key, val]) => {
params = params + key.concat('|').concat(val[0]).concat(',');
});
return params.substring(0, params.length - 1);
}
}
|