import { Licence } from '../models/licence'; import { MembershipLicenceResponse, LicenceDetails, Link } from '../types/licence'; import { mapAcquisitionContextResponse } from './acquisition-context'; import { AcquisitionContext } from '../models/acquisition-context'; import { MembershipAcquisitionContextResponse } from '../types/acquisition-context'; import { InvalidResponseError } from '../errors'; /** * Maps membership response to the licence model. * @param licenceData Response to licence request. * @throws {InvalidResponseError} If the membership request does not return the expected response. * @returns Licence instance. */ export function mapLicenceResponse(licenceData: MembershipLicenceResponse): Licence { const contractLink = findContractLink(licenceData.details.links); const mappedLicenceData: object = { id: licenceData.id, allocatedSeats: licenceData.seats.allocated, seatLimit: licenceData.details.seatLimit, status: licenceData.details.status, isB2c: Boolean(licenceData.details.isB2c), // typecast added in #422, kept just in case so things don't break isB2b: Boolean(licenceData.details.isB2b), isSso: Boolean(licenceData.details.isSso), types: mapLicenceTypes(licenceData.details.links), acquisitionContext: getAcquisitionContextInstances(licenceData.acqContexts), linkedContractId: contractLink ? contractLink.id : null, links: licenceData.details.links, products: licenceData.details.products, administrators: licenceData.administrators, issueReason: licenceData.details.issueReason }; if (Object.values(mappedLicenceData).includes(undefined)) { throw new InvalidResponseError('Membership licence data response contains undefined values', { mappedLicenceData }); } return new Licence(mappedLicenceData); } /** * An array of licence types * @param types List of links to extract the types from * @returns an array of the licence types - trial, b2b-marketing-initiative or contract */ function mapLicenceTypes(types: LicenceDetails['links']): Array { return types.map(type => type.rel); } /** * Gets AcquisitionContext model instances * @param acquisitionContext Membership acquisition context response * @returns Array of AcquisitionContext instances */ function getAcquisitionContextInstances(acquisitionContext: Array): Array { return acquisitionContext.map(singleAcquisitionContext => mapAcquisitionContextResponse(singleAcquisitionContext) ); } function findContractLink(links: LicenceDetails['links']): Link | undefined { return links.find(link => link.rel.toLowerCase() === 'contract'); }