Skip to content

Commit

Permalink
Merge pull request #65 from doughsay/api-recent-player-states
Browse files Browse the repository at this point in the history
Recent player states API
  • Loading branch information
doughsay authored Oct 21, 2021
2 parents efd352f + fce67e7 commit 7d90655
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 13 deletions.
15 changes: 3 additions & 12 deletions lib/ambry_web/controllers/api/book_controller.ex
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
defmodule AmbryWeb.API.BookController do
use AmbryWeb, :controller

import AmbryWeb.API.ControllerUtils

alias Ambry.Books

action_fallback AmbryWeb.FallbackController

@limit 10

def index(conn, params) do
page =
case params |> Map.get("page", "1") |> Integer.parse() do
{page, _} when page >= 1 -> page
{_bad_page, _} -> 1
:error -> 1
end

offset = page_to_offset(page)
offset = offset_from_params(params, @limit)

books = Books.get_recent_books!(offset, @limit)
render(conn, "index.json", books: books)
Expand All @@ -25,8 +20,4 @@ defmodule AmbryWeb.API.BookController do
book = Books.get_book_with_media!(id)
render(conn, "show.json", book: book)
end

defp page_to_offset(page) do
page * @limit - @limit
end
end
16 changes: 16 additions & 0 deletions lib/ambry_web/controllers/api/controller_utils.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
defmodule AmbryWeb.API.ControllerUtils do
@moduledoc """
Util functions for API controllers.
"""

def offset_from_params(params, limit) do
page =
case params |> Map.get("page", "1") |> Integer.parse() do
{page, _} when page >= 1 -> page
{_bad_page, _} -> 1
:error -> 1
end

page * limit - limit
end
end
11 changes: 11 additions & 0 deletions lib/ambry_web/controllers/api/player_state_controller.ex
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
defmodule AmbryWeb.API.PlayerStateController do
use AmbryWeb, :controller

import AmbryWeb.API.ControllerUtils

alias Ambry.Media

action_fallback AmbryWeb.FallbackController

@limit 10

def index(conn, params) do
offset = offset_from_params(params, @limit)

player_states = Media.get_recent_player_states(conn.assigns.api_user.id, offset, @limit)
render(conn, "index.json", player_states: player_states)
end

def show(conn, %{"id" => media_id}) do
player_state = Media.get_or_create_player_state!(conn.assigns.api_user.id, media_id)
render(conn, "show.json", player_state: player_state)
Expand Down
2 changes: 1 addition & 1 deletion lib/ambry_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ defmodule AmbryWeb.Router do
resources "/books", BookController, only: [:index, :show]
resources "/people", PersonController, only: [:show]
resources "/series", SeriesController, only: [:show]
resources "/player_states", PlayerStateController, only: [:show, :update]
resources "/player_states", PlayerStateController, only: [:index, :show, :update]
end

# Other scopes may use custom stacks.
Expand Down
4 changes: 4 additions & 0 deletions lib/ambry_web/views/api/player_state_view.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ defmodule AmbryWeb.API.PlayerStateView do

alias AmbryWeb.API.{BookView, PlayerStateView}

def render("index.json", %{player_states: player_states}) do
%{data: render_many(player_states, PlayerStateView, "player_state.json")}
end

def render("show.json", %{player_state: player_state}) do
%{data: render_one(player_state, PlayerStateView, "player_state.json")}
end
Expand Down

0 comments on commit 7d90655

Please sign in to comment.