lib/sptfy/playlist.ex

defmodule Sptfy.Playlist do
  @moduledoc """
  https://developer.spotify.com/documentation/web-api/reference-beta/#category-playlists
  """

  use Sptfy.Client

  alias Sptfy.Object.{FullPlaylist, Image, PlaylistTrack, SimplifiedPlaylist}

  get "/v1/me/playlists",
    as: :get_my_playlists,
    query: [:limit, :offset],
    mapping: {:paging, module: SimplifiedPlaylist}

  get "/v1/users/:id/playlists",
    as: :get_user_playlists,
    query: [:limit, :offset],
    mapping: {:paging, module: SimplifiedPlaylist}

  post "/v1/users/:id/playlists",
    as: :create_user_playlist,
    query: [],
    body: [{:name, required: true}, :public, :collaborative, :description],
    mapping: {:single, module: FullPlaylist}

  get "/v1/playlists/:id",
    as: :get_playlist,
    query: [:market, :fields, :additional_types],
    mapping: {:single, module: FullPlaylist}

  put "/v1/playlists/:id",
    as: :update_playlist_details,
    query: [],
    body: [:name, :public, :collaborative, :description],
    mapping: :ok

  get "/v1/playlists/:id/tracks",
    as: :get_playlist_tracks,
    query: [:market, :fields, :limit, :offset, :additional_types],
    mapping: {:paging, module: PlaylistTrack}

  post "/v1/playlists/:id/tracks",
    as: :add_tracks,
    query: [],
    body: [:uris, :position],
    mapping: :ok

  put "/v1/playlists/:id/tracks",
    as: :replace_tracks,
    query: [],
    body: [:uris],
    mapping: :ok

  put "/v1/playlists/:id/tracks",
    as: :reorder_tracks,
    query: [],
    body: [:range_start, :insert_before, :range_length, :snapshot_id],
    mapping: :ok

  get "/v1/playlists/:id/images",
    as: :get_cover_images,
    query: [],
    mapping: {:list, module: Image}

  put_jpeg "/v1/playlists/:id/images",
    as: :upload_cover_image,
    query: [],
    mapping: :ok

  delete "/v1/playlists/:id/tracks",
    as: :remove_tracks,
    query: [],
    body: [{:tracks, required: true}],
    mapping: :ok
end