Home Reference Source Repository

src/Factory.js

'use strict';

import ArtistHandler from './handlers/ArtistHandler';
import AlbumHandler from './handlers/AlbumHandler';
import TrackHandler from './handlers/TrackHandler';
import PlaylistHandler from './handlers/PlaylistHandler';
import UserHandler from './handlers/UserHandler';
import CollectionHandler from './handlers/CollectionHandler';
import Client from './Client';

/**
 * Factory is the responsible of create new entities or collections
 *
 * @param {Object} data Entity object or Api response
 */
var Factory = function(data) {
    var _type;
    var _items;
    var _source;

    if (data.error) {
        return data.error;
    } else if (Object.keys(data).length === 1 && data.snapshot_id) {
        return data;
    }

    // a lot of magic happens here :D
    if (data.type) {
        _type = data.type;
        _items = data;
    } else if (typeof Object.keys(data)[0] === 'string' && !Array.isArray(data) && !data.items) {
        _type = Object.keys(data)[0];
        _items = data[_type].items || data[_type];
        _source = data[_type];
    } else if (Array.isArray(data)){
        _type = data[0].type+'s';
        _items = data; 
    } else if (Array.isArray(data.items) && data.items[0].type) {
        _type = data.items[0].type+'s';
        _items = data.items;
        _source = data;
    } else if (Array.isArray(data.items) && !data.items[0].type) {
        _items = data.items;
        _type = Object.keys(data.items[0])[3]+'s';
        _source = data;
    }

    switch(_type) {
        case 'track':
            return new TrackHandler().convert(_items);
            break;
        case 'tracks':
            return new CollectionHandler(_items, TrackHandler, _source);
            break;
        case 'playlist':
            return new PlaylistHandler().convert(_items);
            break;
        case 'playlists':
            return new CollectionHandler(_items, PlaylistHandler, _source);
            break;
        case 'artists':
            return new CollectionHandler(_items, ArtistHandler, _source);
            break;
        case 'album':
            return new AlbumHandler().convert(_items);
            break;
        case 'albums':
            return new CollectionHandler(_items, AlbumHandler, _source);
            break;
        case 'user':
            return new UserHandler().convert(_items);
            break;
        default:
            return Client.instance.request(data.href);
    }

};

/**
 * Exports a function that init a new Factory.
 */
export default function(data) {
    return new Factory(data);
};