Home Reference Source Repository

src/handlers/PlaylistHandler.js

'use strict';

import Playlist from '../helpers/Playlist';
import Client from '../Client';

/**
 * Methods for retrieving information about playlists and for managing playlists.
 *
 * @see https://developer.spotify.com/web-api/playlist-endpoints/
 */
class PlaylistHandler {

    /**
     * Get a collection of artists that match a keyword string.
     * 
     * @see https://developer.spotify.com/web-api/search-item/
     *
     * @public
     * @param {String} name Name of the playlist.
     * @param {Object} [query] Query parameters.
     * @return {Promise} playlistCollection
     */
    search(name, query) {
        return Client.instance.request(`/search?type=playlist&q=${encodeURIComponent(name)}`, 'GET', query);
    }

    /**
     * Get a list of Spotify featured playlists.
     * @see https://developer.spotify.com/web-api/get-list-featured-playlists/
     *
     * @public
     * @required {OAuth}
     * @param {Object} [query] Query parameters.
     * @return {Promise} playlistCollection
     */
    featuredPlaylists(query) {
        return Client.instance.request(`/browse/featured-playlists`, 'GET', query);
    }

    /**
     * Get a list of Spotify playlists tagged with a particular category.
     * @see https://developer.spotify.com/web-api/get-categorys-playlists/
     *
     * @public
     * @required {OAuth}
     * @param {int} id Category id
     * @param {Object} [query] Query parameters.
     * @return {Promise} playlistCollection
     */
    categoriesPlaylists(id, query) {
        return Client.instance.request(`/browse/categories/${id}/playlists`, 'GET', query);
    }

    /**
     * Add one or more tracks to a user’s playlist.
     * @see https://developer.spotify.com/web-api/add-tracks-to-playlist/
     *
     * @public 
     * @required {OAuth}
     * @param {array} tracks List of uri tracks
     * @param {String} userId User id
     * @param {String} playlistId Playlist id
     * @param {Object} [query] Query parameters.
     * @return {Promise} JSON response
     */
    addTracks(tracks, userId, playlistId, query) {
        return Client.instance
            .request(
                `/users/${userId}/playlists/${playlistId}/tracks`,
                'POST',
                {uris: tracks}
            );
    }

    /**
     * Remove one or more tracks from a user’s playlist.
     * @see https://developer.spotify.com/web-api/remove-tracks-playlist/
     *
     * @public 
     * @required {OAuth}
     * @param {array} tracks List of uri tracks
     * @param {String} userId User id
     * @param {String} playlistId Playlist id
     * @param {Object} [query] Query parameters.
     * @return {Promise} JSON response
     */
    removeTracks(tracks, userId, playlistId, query) {
        return Client.instance
            .request(
                `/users/${userId}/playlists/${playlistId}/tracks`,
                'DELETE',
                {uris: tracks}
            );
    }

    /**
     * Add a user as a follower of a playlist.
     * @see https://developer.spotify.com/web-api/follow-playlist/
     *
     * @public 
     * @required {OAuth}
     * @param {String} userId User id
     * @param {String} playlistId Playlist id
     * @param {Object} [query] Query parameters.
     * @return {Promise} JSON response
     */
    follow(userId, playlistId, query) {
        return Client.instance
            .request(
                `/users/${userId}/playlists/${playlistId}/followers`,
                'PUT'
            );
    }

    /**
     * Remove a user as a follower of a playlist.
     * @see https://developer.spotify.com/web-api/unfollow-playlist/
     *
     * @public 
     * @required {OAuth}
     * @param {String} userId User id
     * @param {String} playlistId Playlist id
     * @param {Object} [query] Query parameters.
     * @return {Promise} JSON response
     */
    unfollow(userId, playlistId, query) {
        return Client.instance
            .request(
                `/users/${userId}/playlists/${playlistId}/followers`,
                'DELETE'
            );
    }

    /**
     * Create a playlist for a Spotify user.
     * @see https://developer.spotify.com/web-api/create-playlist/
     *
     * @public 
     * @required {OAuth}
     * @param {String} userId User id
     * @param {String} name Name of the future playlist
     * @param {Bool} is_public public or private
     * @return {Promise} JSON response
     */
    create(userId, name, is_public) {
        return Client.instance
            .request(
                `/users/${userId}/playlists`,
                'POST',
                {name: name, public: is_public}
            );
    }

    /**
     * Change a playlist’s name and public/private state.
     * @see https://developer.spotify.com/web-api/change-playlist-details/
     *
     * @public 
     * @required {OAuth}
     * @param {String} userId User id
     * @param {String} playlistId Playlist id
     * @param {String} name Name of the future playlist
     * @param {Bool} is_public public or private
     * @return {Promise} JSON response
     */
    edit(userId, playlistId, name, is_public) {
        return Client.instance
            .request(
                `/users/${userId}/playlists`,
                'PUT',
                {name: name, public: is_public}
            );
    }

    /**
     * Convert a valid object to a Playlist entity
     * 
     * @public 
     * @param {Object} item Object to convert in entity
     * @return {Object}
     */
    convert(item) {
        return new Playlist(item);
    }

}

/**
 * Exports the PlaylistHandler class.
 */
export default PlaylistHandler;