Home Reference Source Repository

src/core/entities/stream/stream.handler.js


import OlapicEntitiesHandler from '../../interfaces/handler';
import OlapicMediaHandler from '../media/media.handler';
import OlapicStreamEntity from './stream.entity';
/**
 * The entities handler for the Olapic streams in DevKit.
 * It's basically a set of static methods used to create and obtain streams entities from the API
 * or DevKit itself. It also allows you to acces streams resources, as the cover and base image,
 * from the API.
 * @extends {OlapicEntitiesHandler}
 */
class OlapicStreamsHandler extends OlapicEntitiesHandler {
    /**
     * It parses a raw API JSON information and returns a stream entity.
     * @example
     * let JSONInfo = {
     *     metadata: {},
     *     data: {
     *         name: 'My Stream',
     *     },
     * };
     * let stream = OlapicStreamsHandler.entityFromJSON(JSONInfo);
     * // It will log 'My Stream'
     * console.log(stream.get('name'));
     *
     * @param  {Object} json - The raw API JSON object to parse.
     * @return {OlapicStreamEntity} The entity created from the JSON information.
     * @override
     */
    static entityFromJSON(json) {
        if (json.data) {
            json = json.data;
        }

        const stream = Object.assign({}, json);
        [
            '_embedded',
            '_fixed',
            '_forms',
            '_links',
            '_analytics',
            'views',
        ].forEach((remove) => {
            delete stream[remove];
        });

        stream.link = json._links.self.href;
        stream.resources = this.getResourcesFromObject(json._embedded);
        return new OlapicStreamEntity(stream);
    }
    /**
     * When requesting a collection of entities, the API response contains an array instead of an
     * object, so this method will loop the array, create entities using `.entityFromJSON()` and
     * return a new array of entities.
     * @example
     * let JSONInfo = {
     *     metadata: {},
     *     data: {
     *         _embedded: {
     *             stream: [
     *                 {
     *                     name: 'Stream One',
     *                 },
     *                 {
     *                     name: 'Stream Two',
     *                 }
     *             ],
     *         },
     *     },
     * };
     * let entities = OlapicStreamsHandler.extractEntities(JSONInfo);
     * // It will log 'Stream One'
     * console.log(entities[0].get('name'));
     *
     * @param  {Object} obj - The API response with the array.
     * @return {Array} A list of parsed entities.
     * @override
     */
    static extractEntities(obj) {
        const result = [];
        (obj.data._embedded.stream || []).forEach((stream) => {
            result.push(this.entityFromJSON(stream));
        }, this);

        return result;
    }
    /**
     * Gets a stream base image as a media entity.
     * @example
     * OlapicStreamsHandler.getStreamBaseImage(streamEntity).then((media) => {
     *     console.log(media.get('caption'));
     * });
     *
     * @return {Promise<OlapicMediaEntity, Error>} A promise with the media entity or an `Error`
     *                                             object if something goes wrong.
     */
    static getStreamBaseImage(stream) {
        return this.DevKit.rest.get(stream.get('resources/base_image/link'))
        .then((response) => {
            return OlapicMediaHandler.entityFromJSON(response.data);
        });
    }
    /**
     * Gets a stream cover image as a media entity.
     * @example
     * OlapicStreamsHandler.getStreamCoverImage(streamEntity).then((media) => {
     *     console.log(media.get('caption'));
     * });
     *
     * @return {Promise<OlapicMediaEntity, Error>} A promise with the media entity or an `Error`
     *                                             object if something goes wrong.
     */
    static getStreamCoverImage(stream) {
        return this.DevKit.rest.get(stream.get('resources/cover_media/link'))
        .then((response) => {
            return OlapicMediaHandler.entityFromJSON(response.data);
        });
    }
    /**
     * Gets an Olapic stream by its API url.
     * @example
     * OlapicStreamsHandler.getStreamByUrl('http://...')
     * .then((stream) => {
     *     console.log('Stream: ', stream);
     * });
     *
     * @param  {String} url - The Olapic API url for the stream.
     * @return {Promise<OlapicStreamEntity, Error>} The stream entity or an `Error` object if
     *                                              something goes wrong.
     */
    static getStreamByUrl(url) {
        return this.DevKit.rest.get(url).then(((response) => {
            if (response.data._links.length === 0) {
                response.data = response.data._embedded.stream[0];
            }

            return this.entityFromJSON(response.data);
        }).bind(this));
    }
    /**
     * Gets an Olapic stream by its unique ID.
     * @example
     * OlapicStreamsHandler.getStreamByID(12)
     * .then((stream) => {
     *     console.log('Stream: ', stream);
     * });
     *
     * @param  {Number} ID - The stream ID.
     * @return {Promise<OlapicStreamEntity, Error>} The stream entity or an `Error` object if
     *                                              something goes wrong.
     */
    static getStreamByID(ID) {
        return this.getStreamByUrl(this.DevKit.getEndpoint('streamByID', {
            ID: ID,
        }));
    }
}
/**
 * @type {OlapicStreamsHandler}
 * @module OlapicStreamsHandler
 */
export default OlapicStreamsHandler;