mirror of
https://github.com/danbee/chess
synced 2025-03-04 08:39:06 +00:00
Add queries for finding opponents
This commit is contained in:
parent
9349af64a0
commit
ecf87aa632
@ -5,6 +5,7 @@ defmodule Chess.Repo.Queries do
|
|||||||
|
|
||||||
alias Chess.Repo
|
alias Chess.Repo
|
||||||
alias Chess.Store.Game
|
alias Chess.Store.Game
|
||||||
|
alias Chess.Store.User
|
||||||
|
|
||||||
def game_for_info(user_id, game_id) do
|
def game_for_info(user_id, game_id) do
|
||||||
user_id
|
user_id
|
||||||
@ -19,4 +20,10 @@ defmodule Chess.Repo.Queries do
|
|||||||
|> preload(:moves)
|
|> preload(:moves)
|
||||||
|> Repo.get!(game_id)
|
|> Repo.get!(game_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def opponents(user, query_string) do
|
||||||
|
user
|
||||||
|
|> User.opponents
|
||||||
|
|> User.matches(query_string)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -46,16 +46,21 @@ defmodule Chess.Store.User do
|
|||||||
|> hash_password()
|
|> hash_password()
|
||||||
end
|
end
|
||||||
|
|
||||||
def unique_validations(struct, params \\ %{}) do
|
def unique_validations(struct) do
|
||||||
struct
|
struct
|
||||||
|> unique_constraint(:name)
|
|> unique_constraint(:name)
|
||||||
|> unique_constraint(:email)
|
|> unique_constraint(:email)
|
||||||
end
|
end
|
||||||
|
|
||||||
def opponents(user) do
|
def opponents(user) do
|
||||||
from user in "users",
|
from user in __MODULE__,
|
||||||
where: user.id != ^user.id,
|
where: user.id != ^user.id
|
||||||
select: {user.name, user.id}
|
end
|
||||||
|
|
||||||
|
def matches(query, query_string) do
|
||||||
|
from user in query,
|
||||||
|
where: ilike(user.name, ^"%#{query_string}%")
|
||||||
|
or user.email == ^query_string
|
||||||
end
|
end
|
||||||
|
|
||||||
defp hash_password(changeset) do
|
defp hash_password(changeset) do
|
||||||
|
|||||||
69
test/chess/repo/queries_test.exs
Normal file
69
test/chess/repo/queries_test.exs
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
defmodule Chess.Repo.QueriesTest do
|
||||||
|
use Chess.DataCase
|
||||||
|
|
||||||
|
import Chess.Factory
|
||||||
|
alias Chess.Repo
|
||||||
|
alias Chess.Repo.Queries
|
||||||
|
|
||||||
|
describe "opponents" do
|
||||||
|
test "it finds a user on a partial name match" do
|
||||||
|
user = insert(:user, %{
|
||||||
|
name: "Link",
|
||||||
|
email: "link@hyrule.com",
|
||||||
|
password: "ilovezelda"
|
||||||
|
})
|
||||||
|
opponent = insert(:user, %{
|
||||||
|
name: "Princess Zelda",
|
||||||
|
email: "zelda@hyrule.com",
|
||||||
|
password: "ganonsucks"
|
||||||
|
})
|
||||||
|
|
||||||
|
result =
|
||||||
|
user
|
||||||
|
|> Queries.opponents("zelda")
|
||||||
|
|> Repo.one
|
||||||
|
|
||||||
|
assert result.id == opponent.id
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it finds a user on a complete email match" do
|
||||||
|
user = insert(:user, %{
|
||||||
|
name: "Link",
|
||||||
|
email: "link@hyrule.com",
|
||||||
|
password: "ilovezelda"
|
||||||
|
})
|
||||||
|
opponent = insert(:user, %{
|
||||||
|
name: "Princess Zelda",
|
||||||
|
email: "zelda@hyrule.com",
|
||||||
|
password: "ganonsucks"
|
||||||
|
})
|
||||||
|
|
||||||
|
result =
|
||||||
|
user
|
||||||
|
|> Queries.opponents("zelda@hyrule.com")
|
||||||
|
|> Repo.one
|
||||||
|
|
||||||
|
assert result.id == opponent.id
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it does not find a user on a partial email" do
|
||||||
|
user = insert(:user, %{
|
||||||
|
name: "Link",
|
||||||
|
email: "link@hyrule.com",
|
||||||
|
password: "ilovezelda"
|
||||||
|
})
|
||||||
|
insert(:user, %{
|
||||||
|
name: "Princess Zelda",
|
||||||
|
email: "zelda@hyrule.com",
|
||||||
|
password: "ganonsucks"
|
||||||
|
})
|
||||||
|
|
||||||
|
result =
|
||||||
|
user
|
||||||
|
|> Queries.opponents("hyrule")
|
||||||
|
|> Repo.one
|
||||||
|
|
||||||
|
assert result == nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue
Block a user