1
0
mirror of https://github.com/danbee/chess synced 2025-03-04 08:39:06 +00:00

Refactor queries and channel

This commit is contained in:
Daniel Barber 2018-12-04 13:20:43 -05:00 committed by Daniel Barber
parent 782239b74b
commit 35f26d87df
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
9 changed files with 89 additions and 65 deletions

View File

@ -6,24 +6,46 @@ defmodule Chess.Repo.Queries do
alias Chess.Repo
alias Chess.Store.Game
alias Chess.Store.User
alias Chess.Store.Move
def games_for_index(user) do
Game
|> Game.for_user(user)
|> preload([:user, :opponent])
|> Repo.all
end
def game_for_show(user, game_id) do
Game
|> Game.for_user(user)
|> preload([:user, :opponent])
|> Repo.get!(game_id)
end
def game_for_info(user_id, game_id) do
user_id
|> Game.for_user_id()
Game
|> Game.for_user_id(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()
Game
|> Game.for_user_id(user_id)
|> preload(:moves)
|> Repo.get!(game_id)
end
def moves_with_captures(game_id) do
Move
|> Move.for_game_id(game_id)
|> Move.with_captures
|> Repo.all
end
def opponents(user, query_string) do
user
|> User.opponents
User
|> User.opponents(user)
|> User.matches(query_string)
end
end

View File

@ -51,12 +51,12 @@ defmodule Chess.Store.Game do
def _change_turn("black"), do: "white"
def _change_turn("white"), do: "black"
def for_user(user) do
for_user_id(user.id)
def for_user(query, user) do
for_user_id(query, user.id)
end
def for_user_id(user_id) do
from game in Game,
def for_user_id(query, user_id) do
from game in query,
where: game.user_id == ^user_id,
or_where: game.opponent_id == ^user_id
end

View File

@ -5,6 +5,7 @@ defmodule Chess.Store.Move do
use Timex.Ecto.Timestamps
import Ecto.Changeset
import Ecto.Query
alias Chess.Store.Game
@ -26,11 +27,20 @@ defmodule Chess.Store.Move do
|> validate_required(required_attrs())
end
def for_game_id(query, game_id) do
from move in query,
where: move.game_id == ^game_id
end
def with_captures(query) do
from move in query,
where: not is_nil(move.piece_captured)
end
def transform(move) do
%{
id: move.id,
piece: move.piece,
piece_captured: move.piece_captured,
from: <<97 + move.from["file"], 49 + move.from["rank"]>>,
to: <<97 + move.to["file"], 49 + move.to["rank"]>>,
}

View File

@ -52,13 +52,8 @@ defmodule Chess.Store.User do
|> unique_constraint(:email)
end
def find_by_name(name) do
from user in __MODULE__,
where: user.name == ^name
end
def opponents(user) do
from user in __MODULE__,
def opponents(query, user) do
from user in query,
where: user.id != ^user.id
end

View File

@ -3,12 +3,12 @@ defmodule ChessWeb.GameChannel do
use ChessWeb, :channel
import ChessWeb.GameView, only: [player: 2, opponent: 2]
import ChessWeb.GameView, only: [opponent: 2]
import ChessWeb.GameChannelView,
only: [after_join_payload: 2, update_payload: 1]
alias Chess.Board
alias Chess.Emails
alias Chess.Mailer
alias Chess.MoveList
alias Chess.Moves
alias Chess.Repo.Queries
alias ChessWeb.Presence
@ -24,19 +24,8 @@ defmodule ChessWeb.GameChannel do
socket.assigns.user_id
|> Queries.game_for_info(game_id)
payload = %{
player_id: socket.assigns.user_id,
opponent_id: opponent(game, socket.assigns.user_id).id,
player: player(game, socket.assigns.user_id),
opponent: opponent(game, socket.assigns.user_id).name,
board: Board.transform(game.board),
turn: game.turn,
state: game.state,
moves: MoveList.transform(game.moves),
}
socket
|> push("game:update", payload)
|> push("game:update", after_join_payload(socket, game))
track_presence(socket)
@ -126,13 +115,6 @@ defmodule ChessWeb.GameChannel do
socket.assigns.user_id
|> Queries.game_with_moves(socket.assigns.game_id)
payload = %{
board: Board.transform(game.board),
turn: game.turn,
state: game.state,
moves: MoveList.transform(game.moves),
}
ChessWeb.Endpoint.broadcast("game:#{game.id}", "game:update", payload)
ChessWeb.Endpoint.broadcast("game:#{game.id}", "game:update", update_payload(game))
end
end

View File

@ -4,7 +4,7 @@ defmodule ChessWeb.GameController do
alias Chess.Emails
alias Chess.Mailer
alias Chess.Store.Game
alias Chess.Store.User
alias Chess.Repo.Queries
import Chess.Auth, only: [current_user: 1]
@ -14,10 +14,7 @@ defmodule ChessWeb.GameController do
games =
conn
|> current_user()
|> Game.for_user()
|> Game.ordered
|> preload([:user, :opponent])
|> Repo.all
|> Queries.games_for_index
conn
|> render("index.html", games: games, changeset: changeset)
@ -49,27 +46,16 @@ defmodule ChessWeb.GameController do
|> redirect(to: game_path(conn, :show, game))
{:error, changeset} ->
opponents =
conn
|> current_user()
|> User.opponents()
|> Repo.all
conn
|> render("new.html", changeset: changeset, opponents: opponents)
|> render("new.html", changeset: changeset)
end
end
def show(conn, %{"id" => id}) do
query =
conn
|> current_user()
|> Game.for_user()
|> preload([:user, :opponent])
game =
query
|> Repo.get!(id)
conn
|> current_user
|> Queries.game_for_show(id)
conn
|> render("show.html", game: game)

View File

@ -0,0 +1,33 @@
defmodule ChessWeb.GameChannelView do
@moduledoc false
use ChessWeb, :view
import ChessWeb.GameView, only: [player: 2, opponent: 2]
alias Chess.Board
alias Chess.MoveList
def after_join_payload(socket, game) do
%{
player_id: socket.assigns.user_id,
opponent_id: opponent(game, socket.assigns.user_id).id,
player: player(game, socket.assigns.user_id),
opponent: opponent(game, socket.assigns.user_id).name,
board: Board.transform(game.board),
turn: game.turn,
state: game.state,
moves: MoveList.transform(game.moves),
}
end
def update_payload(game) do
%{
board: Board.transform(game.board),
turn: game.turn,
state: game.state,
moves: MoveList.transform(game.moves),
}
end
end

View File

@ -31,14 +31,12 @@ defmodule Chess.MoveListTest do
%{
id: nil,
piece: %{"type" => "pawn", "colour" => "white"},
piece_captured: nil,
from: "e2",
to: "e4"
},
%{
id: nil,
piece: %{"type" => "pawn", "colour" => "black"},
piece_captured: nil,
from: "e7",
to: "e5"
}
@ -47,7 +45,6 @@ defmodule Chess.MoveListTest do
%{
id: nil,
piece: %{"type" => "knight", "colour" => "white"},
piece_captured: nil,
from: "b1",
to: "c3"
}

View File

@ -89,7 +89,6 @@ defmodule Chess.Store.MoveTest do
assert Move.transform(move) == %{
id: nil,
piece: %{"type" => "pawn", "colour" => "white"},
piece_captured: %{"type" => "pawn", "colour" => "black"},
from: "e2",
to: "e4"
}