From 56b64c7da050bf4537a226615155da156cf8a2b9 Mon Sep 17 00:00:00 2001 From: Aaron Votre Date: Sat, 21 Jul 2018 22:57:51 -0400 Subject: [PATCH] Add limit & filter to scores --- lib/scoreboard/games/games.ex | 21 +++++++++++-- lib/scoreboard_web/schema.ex | 6 +++- test/scoreboard_web/schema_test.exs | 49 +++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/lib/scoreboard/games/games.ex b/lib/scoreboard/games/games.ex index 29ddd93..1d564ad 100644 --- a/lib/scoreboard/games/games.ex +++ b/lib/scoreboard/games/games.ex @@ -6,15 +6,30 @@ defmodule Scoreboard.Games do import Ecto.Query, warn: false alias Scoreboard.Repo - alias Scoreboard.Games.Player + alias Scoreboard.Games.{Player, Score} def data() do Dataloader.Ecto.new(Scoreboard.Repo, query: &query/2) end - def query(queryable, _params) do - queryable + @doc """ + Pattern match to build more specific queries + """ + def query(Score, params) do + params + |> Map.put_new(:limit, 10) + |> Map.to_list() + |> Enum.reduce(Score, &apply_param/2) end + def query(queryable, _params), do: queryable + + @doc """ + reduce function + """ + def apply_param({:limit, num}, queryable), do: queryable |> limit(^num) + def apply_param({:player_id, player_id}, queryable), do: queryable |> where([score], score.player_id == ^player_id) + def apply_param(_param, queryable), do: queryable + def get(queryable, id) do case Repo.get(queryable, id) do diff --git a/lib/scoreboard_web/schema.ex b/lib/scoreboard_web/schema.ex index 4209eb3..71539cb 100644 --- a/lib/scoreboard_web/schema.ex +++ b/lib/scoreboard_web/schema.ex @@ -19,7 +19,11 @@ defmodule ScoreboardWeb.Schema do object :game do field(:id, non_null(:id)) field(:name, non_null(:string)) - field(:scores, list_of(:score), resolve: dataloader(:games)) + field :scores, list_of(:score) do + arg :limit, :integer + arg :player_id, :id + resolve dataloader(:games) + end end @desc "A Player" diff --git a/test/scoreboard_web/schema_test.exs b/test/scoreboard_web/schema_test.exs index 8e33422..20bad1d 100644 --- a/test/scoreboard_web/schema_test.exs +++ b/test/scoreboard_web/schema_test.exs @@ -63,6 +63,55 @@ defmodule Scoreboard.SchemaTest do assert get_in(data, ["game", "scores", first, "total"]) == score.total assert get_in(data, ["game", "scores", first, "player", "name"]) == context.player.name end + + test("passing limit param to scores query", context) do + Repo.insert!(%Score{game_id: context.game.id, player_id: context.player.id, total: 101}) + + document = """ + { + game(id: "#{context.game.id}") { + id + name + scores(limit: 0) { + total + } + } + } + """ + + result = Absinthe.run(document, ScoreboardWeb.Schema) + + assert {:ok, %{data: data}} = result + assert length(get_in(data, ["game", "scores"])) == 0 + end + + test("passing limit & player_id param to scores query", context) do + sam = Repo.insert!(%Player{name: "Sam"}) + Repo.insert!(%Score{game_id: context.game.id, player_id: context.player.id, total: 101}) + Repo.insert!(%Score{game_id: context.game.id, player_id: sam.id, total: 12}) + + document = """ + { + game(id: "#{context.game.id}") { + id + name + scores(limit: 5, player_id: "#{context.player.id}") { + total + player { + id + } + } + } + } + """ + + result = Absinthe.run(document, ScoreboardWeb.Schema) + + assert {:ok, %{data: data}} = result + for %{"player" => %{"id" => id}} = _score <- get_in(data, ["game", "scores"]) do + assert id == context.player.id + end + end end describe("mutation queries") do