Home Reference Source Repository

src/core/entities/media/media.handler.js


import OlapicEntitiesHandler from '../../interfaces/handler';
import OlapicUsersHandler from '../user/user.handler';
import OlapicStreamsHandler from '../stream/stream.handler';
import OlapicCategoriesHandler from '../category/category.handler';
import OlapicMediaEntity from './media.entity';
import OlapicUtils from '../../../tools/utils';
/**
 * The entities handler for the Olapic media in DevKit.
 * It's basically a set of static methods used to create and obtain media from the API or
 * DevKit itself.
 * @extends {OlapicEntitiesHandler}
 */
class OlapicMediaHandler extends OlapicEntitiesHandler {
    /**
     * It parses a raw API JSON information and returns a media entity.
     * @example
     * const JSONInfo = {
     *     metadata: {},
     *     data: {
     *         caption: 'My Pic!',
     *     },
     * };
     * const media = OlapicMediaHandler.entityFromJSON(JSONInfo);
     * // It will log 'My Pic!'
     * console.log(media.get('caption'));
     *
     * @param  {Object} json - The raw API JSON object to parse.
     * @return {OlapicMediaEntity} The entity created from the JSON information.
     * @override
     */
    static entityFromJSON(json) {
        if (json.data) {
            json = json.data;
        }

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

        media.link = json._links.self.href;
        media.resources = this.getResourcesFromObject(json._embedded);
        media.actions = this.getFormsFromObject(json._forms);
        return new OlapicMediaEntity(media);
    }
    /**
     * 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: {
     *             media: [
     *                 {
     *                     caption: 'Photo One',
     *                 },
     *                 {
     *                     caption: 'Photo Two',
     *                 }
     *             ],
     *         },
     *     },
     * };
     * let entities = OlapicMediaHandler.extractEntities(JSONInfo);
     * // It will log 'Photo One'
     * console.log(entities[0].get('caption'));
     *
     * @param  {Object} obj - The API response with the array.
     * @return {Array} A list of parsed entities.
     * @override
     */
    static extractEntities(obj) {
        const result = {
            media: [],
            links: {},
        };
        (obj.data._embedded.media || []).forEach((media) => {
            result.media.push(this.entityFromJSON(media));
        }, this);

        if (obj.data._links) {
            Object.keys(obj.data._links).forEach((link) => {
                result.links[link] = obj.data._links[link].href;
            });
        }

        return result;
    }
    /**
     * Gets the user that uploaded a media.
     * @example
     * OlapicMediaHandler.getMediaUser(mediaEntity).then((user) => {
     *     console.log(user.get('name'));
     * });
     *
     * @param  {OlapicMediaEntity} media - The target media entity.
     * @return {Promise<OlapicUserEntity, Error>} A promise with the user entity or an `Error`
     *                                            object if something goes wrong.
     */
    static getMediaUser(media) {
        let result = null;
        if (media._user) {
            result = OlapicUtils.resolvedPromise(media._user);
        } else {
            result = this.DevKit.rest.get(media.get('resources/uploader/link')).then((response) => {
                media._user = OlapicUsersHandler.entityFromJSON(response);
                return media._user;
            });
        }

        return result;
    }
    /**
     * Report a media to be removed.
     * @param  {OlapicMediaEntity} media  - The target media entity.
     * @param  {String}            email  - The email address of the person reporting the media.
     * @param  {String}            reason - The reason the media should be taken down.
     * @return {Promise<Object, Error>} A response object from the API if the media was
     *                                  successfully reported, or an `Error` object if something
     *                                  went wrong.
     * @todo Improve the response for when the media was successfully to something more than just
     *       the API response.
     */
    static reportMedia(media, email, reason) {
        return this.DevKit.rest.post(media.get('actions/report/action/href'), {
            email: email,
            reason: reason,
        });
    }
    /**
     * Gets all the streams related to a media.
     * @example
     * OlapicMediaHandler.getRelatedStreamsFromMedia(mediaEntity).then((streams) => {
     *     console.log('Streams: ', streams);
     * });
     *
     * @param  {OlapicMediaEntity} media  - The target media entity.
     * @return {Promise<Array, Error>} A list of related streams or an `Error` object if something
     *                                 goes wrong.
     */
    static getRelatedStreamsFromMedia(media) {
        return this.DevKit.rest.get(media.get('resources/streams/all/link'))
        .then((response) => {
            return OlapicStreamsHandler.extractEntities(response);
        });
    }
    /**
     * Gets all the categories related to this media.
     * @example
     * OlapicMediaHandler.getRelatedCategoriesFromMedia(mediaEntity).then((categories) => {
     *     console.log('Categories: ', categories);
     * });
     *
     * @param  {OlapicMediaEntity} media  - The target media entity.
     * @return {Promise<Array, Error>} A list of related categories or an `Error` object if
     *                                 something goes wrong.
     */
    static getRelatedCategoriesFromMedia(media) {
        return this.DevKit.rest.get(media.get('resources/categories/all/link'))
        .then((response) => {
            return OlapicCategoriesHandler.extractEntities(response);
        });
    }
    /**
     * Gets an Olapic media by its API url.
     * @example
     * OlapicMediaHandler.getMediaByUrl('http://...')
     * .then((media) => {
     *     console.log('Media: ', media);
     * });
     *
     * @param  {String} url - The Olapic API url for the media.
     * @return {Promise<OlapicMediaEntity, Error>} The media entity or an `Error` object if
     *                                                something goes wrong.
     */
    static getMediaByUrl(url) {
        return this.DevKit.rest.get(url).then(((response) => {
            if (response.data._links.length === 0) {
                response.data = response.data._embedded.media[0];
            }

            return this.entityFromJSON(response.data);
        }).bind(this));
    }
    /**
     * Gets an Olapic media by its unique ID.
     * @example
     * OlapicMediaHandler.getMediaByID(12)
     * .then((media) => {
     *     console.log('Media: ', media);
     * });
     *
     * @param  {Number} ID - The media ID.
     * @return {Promise<OlapicMediaEntity, Error>} The media entity or an `Error` object if
     *                                                something goes wrong.
     */
    static getMediaByID(ID) {
        return this.getMediaByUrl(this.DevKit.getEndpoint('mediaByID', {
            ID: ID,
        }));
    }
}
/**
 * @type {OlapicMediaHandler}
 * @module OlapicMediaHandler
 */
export default OlapicMediaHandler;