import { inject, injectable } from "inversify"; import * as TYPES from "./types"; import { IResourceMapper, IHttpClient, IFindParams, ISearchParams, IJsonApiResponse, IJsonApiResource, IAvailabilityParams } from "./interfaces"; import { createFilters, createIncludes } from "./jsonApiUtils"; @injectable() export default abstract class Base { public accessToken?: string; public resource: string; public mapper: IResourceMapper; @inject(TYPES.HttpClient) public http: IHttpClient; @inject(TYPES.OpenPlanetHost) protected host = ""; constructor(accessToken) { this.accessToken = accessToken; } public abstract url(options?: { [key: string]: any }): string; public parse(response: IJsonApiResponse, mapper: IResourceMapper = this.mapper): T | T[] { return mapper.map(response); } public qs(options: (IFindParams | ISearchParams | IAvailabilityParams) = {}) { const filters = createFilters({ resource: options.resource || this.resource, ...options }); const include = createIncludes(options.include); const items = [filters, include].filter((i) => i); return items.length ? `?${items.join("&")}` : ""; } public headers(): Object { return this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}; } }