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.Store.Game
|
||||
alias Chess.Store.User
|
||||
|
||||
def game_for_info(user_id, game_id) do
|
||||
user_id
|
||||
@ -19,4 +20,10 @@ defmodule Chess.Repo.Queries do
|
||||
|> preload(:moves)
|
||||
|> Repo.get!(game_id)
|
||||
end
|
||||
|
||||
def opponents(user, query_string) do
|
||||
user
|
||||
|> User.opponents
|
||||
|> User.matches(query_string)
|
||||
end
|
||||
end
|
||||
|
||||
@ -46,16 +46,21 @@ defmodule Chess.Store.User do
|
||||
|> hash_password()
|
||||
end
|
||||
|
||||
def unique_validations(struct, params \\ %{}) do
|
||||
def unique_validations(struct) do
|
||||
struct
|
||||
|> unique_constraint(:name)
|
||||
|> unique_constraint(:email)
|
||||
end
|
||||
|
||||
def opponents(user) do
|
||||
from user in "users",
|
||||
where: user.id != ^user.id,
|
||||
select: {user.name, user.id}
|
||||
from user in __MODULE__,
|
||||
where: user.id != ^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
|
||||
|
||||
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