public/lib/capi-content-service.js (125 lines of code) (raw):

import angular from 'angular'; import _ from 'lodash'; angular.module('wfCapiContentService', []) .service('wfCapiContentService', ['$http', '$q', 'wfAtomService', wfCapiContentService]); function wfCapiContentService($http, $q, wfAtomService) { function getSize(asset) { if (asset.typeData) { const w = parseInt(asset.typeData.width); const h = parseInt(asset.typeData.height); return h && w ? h * w : null; } else return null; } function getSmallestAsset(assets) { return assets.reduceRight(function(l,r) { return getSize(l) < getSize(r) ? l : r; }); } function getMainMedia(elements) { const mainElements = elements.filter((e) => e.relation === "main"); if (mainElements.length && mainElements[0] && mainElements[0].assets) { const smallest = getSmallestAsset(mainElements[0].assets); if (smallest) { return { type: mainElements[0].type, url: smallest.file, caption: smallest.typeData.caption, altText: smallest.typeData.altText }; } } return null; } function getContentAtomElements(body) { return body.reduce((all, item) => { const atoms = item.elements.filter((element) => { return element.type === 'contentatom'; }); return all.concat(atoms); }, []); } function getContentUsages(atomUsages) { return Promise.all( atomUsages.map((usage) => { const atomType = usage.contentAtomTypeData.atomType; const atomId = usage.contentAtomTypeData.atomId; return getCapiContent(`atom/${atomType}/${atomId}`).then((capiResponse) => { const atom = _.get(capiResponse.data.response[atomType].data, atomType); atom.contentChangeDetails = _.get(capiResponse.data.response[atomType], 'contentChangeDetails'); atom.defaultHtml = _.get(capiResponse.data.response[atomType], 'defaultHtml'); return wfAtomService.parseAtom(atom, atomType, atomId); }) }) ) } function getTagTitles(tags) { return tags.map((t) => t.webTitle); } function emptyCapiContentObject() { return { headline: "Unknown", standfirst: "Unknown", mainMediaType: "", mainMediaUrl: "", mainMediaCaption: "Unknown", mainMediaAltText: "Unknown", trailImageUrl: "", trailText : "Unknown", commentsTitle: "Unknown", wordCount: "Unknown", commissioningDesks: "", firstPublishedDate: "", capiError: true, atomUsages: [], packages: [] } } function parseCapiContentData(response) { const content = _.get(response, 'data.response.content'); const packages = _.get(response, 'data.response.packages'); if (content) { const fields = _.get(content, 'fields', {}); const elements = _.get(content, 'elements'); const tags = _.get(content, 'tags'); const body = _.get(content, 'blocks.body'); const atomUsages = body ? getContentAtomElements(body) : []; const mainMedia = elements ? getMainMedia(elements): null; return Promise.resolve({ headline: fields.headline ? fields.headline : "", standfirst: fields.standfirst ? fields.standfirst : "", mainMediaType: mainMedia ? mainMedia.type : "", mainMediaUrl: mainMedia ? mainMedia.url : "", mainMediaCaption: mainMedia ? mainMedia.caption : "", mainMediaAltText: mainMedia ? mainMedia.altText : "", trailImageUrl: fields.thumbnail ? fields.thumbnail : "", trailText : fields.trailText ? fields.trailText : "", commentsTitle: fields.commentable ? (fields.commentable === "true" ? "on" : "off") : "off", wordCount: fields.wordcount ? fields.wordcount : "", commissioningDesks: tags ? getTagTitles(tags) : "", firstPublishedDate: fields.firstPublicationDate ? fields.firstPublicationDate : "", atomUsages: atomUsages, packages: packages.map((p) => { return {id: p.packageId, name: p.packageName} }) }); } return emptyCapiContentObject(); } function getCapiContent(path) { return $http({ method: 'GET', url: "/capi/"+path, params: { 'show-fields': 'headline,standfirst,thumbnail,trailText,firstPublicationDate,wordcount,commentable,internalComposerCode', 'show-elements': 'all', 'show-blocks': 'body', 'show-tags': 'tracking', 'show-packages': 'true' }, withCredentials: true, timeout: 1000 }); } this.getContentUsages = getContentUsages; this.getCapiContent = getCapiContent; this.parseCapiContentData = parseCapiContentData; this.emptyCapiContentObject = emptyCapiContentObject; }