From a66bc2655ba6edc4169a4d7809895829a65bc356 Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Fri, 25 May 2018 15:16:29 -0400 Subject: [PATCH] Abstract out channel queries --- lib/chess/game_state.ex | 2 +- lib/chess/repo/queries.ex | 28 ++++++++++++++++++++++++++ lib/chess_web/channels/game_channel.ex | 23 ++++++++------------- 3 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 lib/chess/repo/queries.ex diff --git a/lib/chess/game_state.ex b/lib/chess/game_state.ex index 6211b4a..610128e 100644 --- a/lib/chess/game_state.ex +++ b/lib/chess/game_state.ex @@ -38,7 +38,7 @@ defmodule Chess.GameState do |> Board.search(%{"type" => "king", "colour" => colour}) |> List.first - if king == nil do + if is_nil(king) do raise "There is no #{colour} king!" end diff --git a/lib/chess/repo/queries.ex b/lib/chess/repo/queries.ex new file mode 100644 index 0000000..aa4ecde --- /dev/null +++ b/lib/chess/repo/queries.ex @@ -0,0 +1,28 @@ +defmodule Chess.Repo.Queries do + @moduledoc false + + import Ecto.Query + + alias Chess.Repo + alias Chess.Store.Game + + def game_for_info(user_id, game_id) do + user_id + |> Game.for_user_id() + |> preload([:moves, :user, :opponent]) + |> Repo.get!(game_id) + end + + def game_with_moves(user_id, game_id) do + user_id + |> Game.for_user_id() + |> preload(:moves) + |> Repo.get!(game_id) + end + + def game_for_user(user_id, game_id) do + user_id + |> Game.for_user_id() + |> Repo.get!(game_id) + end +end diff --git a/lib/chess_web/channels/game_channel.ex b/lib/chess_web/channels/game_channel.ex index a69a56d..856501d 100644 --- a/lib/chess_web/channels/game_channel.ex +++ b/lib/chess_web/channels/game_channel.ex @@ -3,10 +3,11 @@ defmodule ChessWeb.GameChannel do use ChessWeb, :channel - alias Chess.Store.Game alias Chess.Board - alias Chess.Moves alias Chess.MoveList + alias Chess.Moves + alias Chess.Repo.Queries + alias Chess.Store.Game def join("game:" <> game_id, _params, socket) do send(self(), {:after_join, game_id}) @@ -17,11 +18,7 @@ defmodule ChessWeb.GameChannel do def handle_info({:after_join, game_id}, socket) do game = socket.assigns.current_user_id - |> Game.for_user_id() - |> preload(:moves) - |> preload(:user) - |> preload(:opponent) - |> Repo.get!(game_id) + |> Queries.game_for_info(game_id) payload = %{ player: player(socket, game), @@ -42,9 +39,7 @@ defmodule ChessWeb.GameChannel do move_params = convert_params(params) socket.assigns.current_user_id - |> Game.for_user_id() - |> preload(:moves) - |> Repo.get!(socket.assigns.game_id) + |> Queries.game_with_moves(socket.assigns.game_id) |> Moves.make_move(move_params) |> case do {:ok, _} -> @@ -65,8 +60,7 @@ defmodule ChessWeb.GameChannel do ) do game = socket.assigns.current_user_id - |> Game.for_user_id() - |> Repo.get!(socket.assigns.game_id) + |> Queries.game_for_user(socket.assigns.game_id) moves = Moves.available(game.board, { String.to_integer(file), @@ -90,9 +84,7 @@ defmodule ChessWeb.GameChannel do def send_update(socket) do game = socket.assigns.current_user_id - |> Game.for_user_id() - |> preload(:moves) - |> Repo.get!(socket.assigns.game_id) + |> Queries.game_with_moves(socket.assigns.game_id) payload = %{ board: Board.transform(game.board), @@ -100,6 +92,7 @@ defmodule ChessWeb.GameChannel do state: game.state, moves: MoveList.transform(game.moves), } + ChessWeb.Endpoint.broadcast("game:#{game.id}", "game:update", payload) end