import { inject, injectable } from "inversify"; import BlogPost, { IBlogPost, IBlogPostResource, blogPostType, blogPostCategoryType, IBlogPostRelationships } from "../blogPost"; import { IResourceMapper, IJsonApiResponse, IJsonApiResource, IJsonApiRelationshipResource } from "../../interfaces"; import * as TYPES from "../../types"; import Mapper from "../../mapper"; @injectable() export class BlogPostMapper extends Mapper { @inject(TYPES.User) model: IBlogPost; toModel(resource: IBlogPostResource, included: IJsonApiResource[] = []): IBlogPost { const model = new BlogPost(); model.id = resource.id; model.attribution = resource.attributes.attribution; model.publicationDate = new Date(resource.attributes.publication_date); model.excerpt = resource.attributes.excerpt; model.featuredImage = resource.attributes.featured_image; model.featuredProduct = resource.attributes.featured_product; model.content = resource.attributes.content[0].text; model.metadata = resource.attributes.seo_metadata; model.title = resource.attributes.title; const relationships = resource.relationships; if (relationships.categories) { const categories = relationships.categories.data as IJsonApiRelationshipResource[]; model.categories = categories.reduce((memo, c) => { const category = included.find((i) => i.type === blogPostCategoryType && i.id === c.id); if (category) { memo.push({ id: category.id, name: category.attributes.text, slug: category.attributes.slug, }); } return memo; }, []); } return model; } toResource(model: IBlogPost): IBlogPostResource { const resource = { id: model.id, type: blogPostType, attributes: { attribution: model.attribution, publication_date: model.publicationDate.toISOString(), excerpt: model.excerpt, featured_image: model.featuredImage, featured_product: model.featuredProduct, content: [{ text: model.content }], seo_metadata: model.metadata, title: model.title, }, }; return resource; } } export default BlogPostMapper;