import { UrlParamFilterService } from './url-param-filter.service'; import { UrlParamSortService } from './url-param-sort.service'; import { UrlParamPageService } from './url-param-page.service'; export class UrlParamBuilderService { public constructor( private urlParamFilterService: UrlParamFilterService, private urlParamSortService: UrlParamSortService, private urlParamPageService: UrlParamPageService ) {} public build(filters?: {[key: string]: any}, sort?: string[], page?: number, limit?: number): string { const combinedParams: {[key: string]: string|string[]|number} = {}; const sorting: {sort: string|string[]} = this.urlParamSortService.urlEncode(sort); const paging: {page: number, limit: number} = this.urlParamPageService.urlEncode(page, limit); const filter: {[key: string]: string|string[]} = this.urlParamFilterService.urlEncode(filters); for (const key in filter) { if (filter[key]) { combinedParams[key] = filter[key]; } } combinedParams['sort'] = sorting.sort; combinedParams['page'] = paging.page; combinedParams['limit'] = paging.limit; return this.buildQueryString(combinedParams); } private buildQueryString(params: {[key: string]: string|string[]|number}): string { const items: string[] = []; Object.keys(params).forEach((key: string) => { const value: any = params[key]; if (value.constructor === Array) { const valueParams: string[] = []; value.forEach((valueItem: any) => { valueParams.push(key + '[]=' + valueItem); }); items.push(valueParams.join('&')); } else { items.push(key + '=' + value); } }); return items.join('&'); } }