lib/sptfy/library.ex

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

  use Sptfy.Client

  alias Sptfy.Object.{SavedAlbum, SavedShow, SavedTrack}

  get "/v1/me/albums",
    as: :get_saved_albums,
    query: [:limit, :offset, :market],
    mapping: {:paging, module: SavedAlbum}

  put "/v1/me/albums",
    as: :save_albums,
    query: [],
    body: [{:ids, required: true}],
    mapping: :ok

  delete "/v1/me/albums",
    as: :remove_from_saved_albums,
    query: [],
    body: [{:ids, required: true}],
    mapping: :ok

  get "/v1/me/albums/contains",
    as: :check_albums_saved_state,
    query: [{:ids, required: true}],
    mapping: :as_is,
    return_type: {:ok, [boolean()]}

  get "/v1/me/tracks",
    as: :get_saved_tracks,
    query: [:limit, :offset, :market],
    mapping: {:paging, module: SavedTrack}

  put "/v1/me/tracks",
    as: :save_tracks,
    query: [],
    body: [{:ids, required: true}],
    mapping: :ok

  delete "/v1/me/tracks",
    as: :remove_from_saved_tracks,
    query: [],
    body: [{:ids, required: true}],
    mapping: :ok

  get "/v1/me/tracks/contains",
    as: :check_tracks_saved_state,
    query: [{:ids, required: true}],
    mapping: :as_is,
    return_type: {:ok, [boolean()]}

  get "/v1/me/shows",
    as: :get_saved_shows,
    query: [:limit, :offset],
    mapping: {:paging, module: SavedShow}

  put "/v1/me/shows",
    as: :save_shows,
    query: [],
    body: [{:ids, required: true}],
    mapping: :ok

  delete "/v1/me/shows",
    as: :remove_from_saved_shows,
    query: [],
    body: [{:ids, required: true}],
    mapping: :ok

  get "/v1/me/shows/contains",
    as: :check_shows_saved_state,
    query: [{:ids, required: true}],
    mapping: :as_is,
    return_type: {:ok, [boolean()]}
end