import { inject, injectable } from "inversify"; import Bookmark, { IBookmark, IBookmarkEntryResource, IBookmarkEntryAttributes, bookmarkEntryType } from "../bookmark"; import { IJsonApiResource, IResourceMapper } from "../../interfaces"; import Mapper from "../../mapper"; import * as TYPES from "../../types"; import PoiMapper from "../poi/mapper"; import PartnerActivityMapper from "../partnerActivity/mapper"; import { IPoiResource, IPoi } from "../poi"; import { IUser } from "../user"; import { IPartnerActivity } from "../partnerActivity"; const mappers = { poi: new PoiMapper(), lodging: new PoiMapper(), partner_activity: new PartnerActivityMapper(), }; type BookmarkEntry = IPoi & IUser & IPartnerActivity; @injectable() export class BookmarkMapper extends Mapper { @inject(TYPES.Bookmark) model: IBookmark; toModel(resource: IBookmarkEntryResource, included: IJsonApiResource[] = []): IBookmark { const model = new Bookmark(); model.id = resource.id; model.checked = resource.attributes.checked; model.createdAt = new Date(resource.attributes.created_at); model.order = resource.attributes.order_number; model.note = resource.attributes.note; if (resource.relationships.target) { const targetResource = resource.relationships.target.data; const target = included.find((i) => i.type === targetResource.type && i.id === targetResource.id); if (target) { const mapper: IResourceMapper = mappers[target.type]; model.target = mapper.toModel(target, included); } else { model.target = resource.relationships.target.data; } } return model; } toResource(model: IBookmark): IBookmarkEntryResource { const resource: IBookmarkEntryResource = { id: model.id, type: bookmarkEntryType, attributes: { checked: model.checked, order_number: model.order, note: model.note, }, relationships: {}, }; if (model.target) { resource.relationships.target = { data: { type: model.target.type, id: model.target.id, } }; } return resource; } } export default BookmarkMapper;