Usernames, logging in, validations, etc.
This commit is contained in:
parent
bddf7ff040
commit
2a288e2507
@ -7,10 +7,9 @@ defmodule Bwc do
|
|||||||
|
|
||||||
@repo Repo
|
@repo Repo
|
||||||
|
|
||||||
|
|
||||||
def new_player, do: Player.changeset(%Player{})
|
def new_player, do: Player.changeset(%Player{})
|
||||||
|
|
||||||
def create_player(attrs), do: Player.changeset(%Player{},attrs) |> @repo.insert()
|
def create_player(attrs), do: Player.changeset(%Player{}, attrs) |> @repo.insert()
|
||||||
|
|
||||||
def delete_player(id), do: get_player(id) |> @repo.delete
|
def delete_player(id), do: get_player(id) |> @repo.delete
|
||||||
|
|
||||||
@ -18,19 +17,30 @@ defmodule Bwc do
|
|||||||
|
|
||||||
def get_player(id), do: @repo.get!(Player, id)
|
def get_player(id), do: @repo.get!(Player, id)
|
||||||
|
|
||||||
|
def get_player_by(params), do: @repo.get_by(Player, params)
|
||||||
|
|
||||||
|
def get_or_create_player(username) do
|
||||||
|
case get_player_by(%{username: username}) do
|
||||||
|
%Player{} = player ->
|
||||||
|
{:ok, player}
|
||||||
|
_ ->
|
||||||
|
create_player(%{username: username})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def list_cards, do: @repo.all(Card)
|
def list_cards, do: @repo.all(Card)
|
||||||
|
|
||||||
def get_card(id), do: @repo.get!(Card, id)
|
def get_card(id), do: @repo.get!(Card, id)
|
||||||
|
|
||||||
def get_card_by(attrs), do: @repo.get_by(Card, attrs)
|
def get_card_by(attrs), do: @repo.get_by(Card, attrs)
|
||||||
|
|
||||||
def create_card(attrs), do: Card.changeset(%Card{},attrs) |> @repo.insert()
|
def create_card(attrs), do: Card.changeset(%Card{}, attrs) |> @repo.insert()
|
||||||
|
|
||||||
def new_card, do: Card.changeset(%Card{})
|
def new_card, do: Card.changeset(%Card{})
|
||||||
|
|
||||||
def size, do: Bwc.list_cards |> length
|
def size, do: Bwc.list_cards() |> length
|
||||||
|
|
||||||
def draw_card, do: Bwc.list_cards |> Enum.random
|
def draw_card, do: Bwc.list_cards() |> Enum.random()
|
||||||
def draw, do: draw_card()
|
def draw, do: draw_card()
|
||||||
|
|
||||||
def delete_card(%Bwc.Card{} = card), do: @repo.delete(card)
|
def delete_card(%Bwc.Card{} = card), do: @repo.delete(card)
|
||||||
@ -41,5 +51,4 @@ defmodule Bwc do
|
|||||||
|> Card.changeset(updates)
|
|> Card.changeset(updates)
|
||||||
|> @repo.update
|
|> @repo.update
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -12,7 +12,7 @@ defmodule Bwc.Player do
|
|||||||
|> cast(attrs, [:username, :picture])
|
|> cast(attrs, [:username, :picture])
|
||||||
|> validate_required(:username)
|
|> validate_required(:username)
|
||||||
|> unique_constraint(:username)
|
|> unique_constraint(:username)
|
||||||
|> validate_length(:username, min: 3)
|
|> validate_length(:username, min: 3, max: 20)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -9,6 +9,9 @@ border-bottom: 2px solid gainsboro;
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#top-bar-login-box{display:none; width: 100px;margin:0px;border:1px solid gray !important; background-image:"" !important}
|
||||||
|
#top-bar-username{width:200px;font-size:15px}
|
||||||
|
|
||||||
.uk-subnav-pill > * > :first-child{
|
.uk-subnav-pill > * > :first-child{
|
||||||
padding: 0px 50px !important;
|
padding: 0px 50px !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,57 @@ window.jQuery = $;
|
|||||||
window.$ = $;
|
window.$ = $;
|
||||||
window.UIkit = UIkit;
|
window.UIkit = UIkit;
|
||||||
|
|
||||||
|
window.show_login_box = () => {
|
||||||
|
|
||||||
|
$("#top-bar-username a").hide();
|
||||||
|
$("#top-bar-login-box").show().focus();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
window.hide_login_box = () => {
|
||||||
|
|
||||||
|
$("#top-bar-username a").show();
|
||||||
|
$("#top-bar-login-box").hide()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$('#top-bar-login-box').on('keyup keypress', function(e) {
|
||||||
|
var keyCode = e.keyCode || e.which;
|
||||||
|
if (keyCode === 13) {
|
||||||
|
e.preventDefault();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$("#top-bar-login-box").keyup(function(e) {
|
||||||
|
if (e.keyCode == "13") {
|
||||||
|
login();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.login = () => {
|
||||||
|
var CSRF_TOKEN = $("input[name=_csrf_token]").val();
|
||||||
|
var username = $("#top-bar-login-box").val();
|
||||||
|
$.ajax({
|
||||||
|
url: "/api/join",
|
||||||
|
method: 'POST',
|
||||||
|
beforeSend: function(xhr) {
|
||||||
|
xhr.setRequestHeader("X-CSRF-Token", CSRF_TOKEN);
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
username: username
|
||||||
|
}
|
||||||
|
}).done(function(response) {
|
||||||
|
console.log(response);
|
||||||
|
UIkit.notification(response['data']);
|
||||||
|
hide_login_box();
|
||||||
|
$("#top-bar-username a").text(response['username']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
window.deleteCard = (id) => {
|
window.deleteCard = (id) => {
|
||||||
var CSRF_TOKEN = $("input[name=_csrf_token]").val();
|
var CSRF_TOKEN = $("input[name=_csrf_token]").val();
|
||||||
$.ajax({
|
$.ajax({
|
||||||
|
|||||||
@ -3,16 +3,33 @@ defmodule BwcWeb.SessionController do
|
|||||||
|
|
||||||
def new(conn, _params) do
|
def new(conn, _params) do
|
||||||
player = Bwc.new_player()
|
player = Bwc.new_player()
|
||||||
render conn, "new.html", player: player
|
render(conn, "new.html", player: player)
|
||||||
end
|
end
|
||||||
|
|
||||||
def create(conn, params) do
|
def set_name(conn, params) do
|
||||||
require Logger
|
import Logger
|
||||||
Logger.debug(params)
|
|
||||||
|
case Map.get(params, "username") |> Bwc.get_or_create_player() do
|
||||||
|
{:ok, player} ->
|
||||||
|
conn |> put_session(:username, player.username) |> render("set_name.json", username: player.username)
|
||||||
|
|
||||||
|
{:error, username} ->
|
||||||
|
conn |> render("error.json", username: username)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def create(conn, %{"player" => %{"username" => username, "picture" => picture}}) do
|
||||||
cards = Bwc.list_cards()
|
cards = Bwc.list_cards()
|
||||||
case Bwc.create_player(Map.get(params, "player")) do
|
|
||||||
{:ok, username} -> conn |> put_session(:username, username) |> redirect(to: Routes.card_path(conn, :index, cards))
|
case Bwc.get_or_create_player(username) do
|
||||||
{:error, player} -> render(conn, "new.html", player: player)
|
{:ok, player} ->
|
||||||
|
conn
|
||||||
|
|> put_session(:username, username)
|
||||||
|
|> put_flash(:info, "Welcome to the game, #{player.username}.")
|
||||||
|
|> redirect(to: Routes.card_path(conn, :index, cards))
|
||||||
|
|
||||||
|
{:error, player} ->
|
||||||
|
conn |> put_flash(:error, "Something's wrong.") |> render("new.html", player: player)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
17
apps/bwc_web/lib/bwc_web/roster.ex
Normal file
17
apps/bwc_web/lib/bwc_web/roster.ex
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
defmodule BwcWeb.Roster do
|
||||||
|
import Plug.Conn
|
||||||
|
|
||||||
|
def init(opts), do: opts
|
||||||
|
|
||||||
|
def call(conn, _opts) do
|
||||||
|
player =
|
||||||
|
conn
|
||||||
|
|> get_session(:username)
|
||||||
|
|> case do
|
||||||
|
nil -> Bwc.new_player()
|
||||||
|
username -> Bwc.get_player_by(%{username: username})
|
||||||
|
end
|
||||||
|
|
||||||
|
assign(conn, :player, player)
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -7,10 +7,12 @@ defmodule BwcWeb.Router do
|
|||||||
plug :fetch_flash
|
plug :fetch_flash
|
||||||
plug :protect_from_forgery
|
plug :protect_from_forgery
|
||||||
plug :put_secure_browser_headers
|
plug :put_secure_browser_headers
|
||||||
|
plug BwcWeb.Roster
|
||||||
end
|
end
|
||||||
|
|
||||||
pipeline :api do
|
pipeline :api do
|
||||||
plug :accepts, ["json"]
|
plug :accepts, ["json"]
|
||||||
|
plug :fetch_session
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/", BwcWeb do
|
scope "/", BwcWeb do
|
||||||
@ -32,6 +34,9 @@ defmodule BwcWeb.Router do
|
|||||||
pipe_through :api
|
pipe_through :api
|
||||||
|
|
||||||
resources "/cards", CardController, only: [:delete]
|
resources "/cards", CardController, only: [:delete]
|
||||||
|
|
||||||
|
post "/join", SessionController, :set_name
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Enables LiveDashboard only for development
|
# Enables LiveDashboard only for development
|
||||||
|
|||||||
@ -19,9 +19,16 @@
|
|||||||
</a>
|
</a>
|
||||||
</h1>
|
</h1>
|
||||||
<div class='auth uk-flex uk-flex-column uk-flex-center'>
|
<div class='auth uk-flex uk-flex-column uk-flex-center'>
|
||||||
<span class='uk-icon' uk-icon="icon:user"></span>
|
<div>
|
||||||
<small><b>You are: </b>
|
<span class='uk-icon' uk-icon="icon:user" style="width:150px;"></span>
|
||||||
Nobody</small>
|
</div>
|
||||||
|
<div id="top-bar-username" class='uk-flex uk-flex-row uk-flex-center uk-margin-small-top'>
|
||||||
|
<b>You are: </b>
|
||||||
|
<a style='width:100px;' href="javascript:show_login_box()">
|
||||||
|
<%= @player.username %>
|
||||||
|
</a>
|
||||||
|
<input id="top-bar-login-box"/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,13 @@
|
|||||||
defmodule BwcWeb.SessionView do
|
defmodule BwcWeb.SessionView do
|
||||||
use BwcWeb, :view
|
use BwcWeb, :view
|
||||||
|
|
||||||
|
|
||||||
|
def render("set_name.json", params) do
|
||||||
|
username = Map.get(params,:username)
|
||||||
|
%{
|
||||||
|
data: "You are now known as '#{username}'.",
|
||||||
|
username: username
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user