import { injectable } from "inversify"; import VideoPlaylist, {IVideoPlaylist, IVideoPlaylistResource, videoPlaylistType} from "./"; import {IJsonApiRelationshipResource, IJsonApiResource} from "../../interfaces"; import Mapper from "../../mapper"; import {VideoPlaylistItemMapper} from "../videoPlaylistItem/mapper"; import {videoPlaylistItemType} from "../videoPlaylistItem/index"; @injectable() export class VideoPlaylistMapper extends Mapper { private playlistItemMapper = new VideoPlaylistItemMapper(); toModel(resource: IVideoPlaylistResource, included: IJsonApiResource[] = []): IVideoPlaylist { const model = new VideoPlaylist(); const { relationships, attributes: attrs } = resource; model.id = resource.id; model.referenceId = attrs.reference_id; model.providerName = attrs.provider_name; model.providerId = attrs.provider_id; model.createdAt = attrs.create_date; model.updatedAt = attrs.modify_date; model.slug = attrs.slug; model.name = attrs.name; model.playlistType = attrs.playlist_type; if (relationships && relationships.items && Array.isArray(relationships.items.data)) { const data = resource.relationships.items.data as IJsonApiRelationshipResource[]; model.items = data.map((itemResourceLinkage: IJsonApiResource) => { const item = included.find((i) => i.type === videoPlaylistItemType && i.id === itemResourceLinkage.id); if (item) { return this.playlistItemMapper.toModel(item, included); } else { return itemResourceLinkage; } }); } return model; } toResource(model: IVideoPlaylist): IVideoPlaylistResource { const resource: IVideoPlaylistResource = { id: model.id, type: videoPlaylistType, attributes: { reference_id: model.referenceId, provider_name: model.providerName, provider_id: model.providerId, slug: model.slug, name: model.name, playlist_type: model.playlistType, }, relationships: { items: { data: [] } } }; if (model.items) { resource.relationships.items.data = model.items.map(({ id }) => ({ id: id, type: videoPlaylistItemType, })); } Object.keys(resource.attributes).forEach((key) => { if (typeof resource.attributes[key] === "undefined") { delete resource.attributes[key]; } }); if (Object.keys(resource.relationships).length === 0) { delete resource.relationships; } return resource; } } export default VideoPlaylistMapper;