import { injectable } from "inversify"; import { IResourceMapper, IJsonApiResponse, IJsonApiResource } from "./interfaces"; @injectable() export default abstract class Mapper implements IResourceMapper { abstract toModel(resource: From, included?:IJsonApiResource[]): To; abstract toResource(model: To): From; map(resource: IJsonApiResponse) { if (Array.isArray(resource.data)) { return this.mapMany(resource.data, resource.included); } return this.mapSingle(resource.data, resource.included); } private mapMany(resource: From[], included?: IJsonApiResource[]): To[] { return resource.map((r) => this.mapSingle(r, included)); } private mapSingle(resource: From, included?: IJsonApiResource[]): To { return this.toModel(resource, included); } }