From 2a288e250774a3671210f73c6e7d18f6efb4ec7f Mon Sep 17 00:00:00 2001 From: Ryan Pandya Date: Tue, 29 Dec 2020 00:06:44 -0800 Subject: [PATCH] Usernames, logging in, validations, etc. --- apps/bwc/lib/bwc.ex | 21 +++++--- apps/bwc/lib/bwc/player.ex | 2 +- apps/bwc_web/assets/css/bwc.css | 3 ++ apps/bwc_web/assets/js/bwc.js | 51 +++++++++++++++++++ .../bwc_web/controllers/session_controller.ex | 31 ++++++++--- apps/bwc_web/lib/bwc_web/roster.ex | 17 +++++++ apps/bwc_web/lib/bwc_web/router.ex | 5 ++ .../lib/bwc_web/templates/layout/app.html.eex | 13 +++-- .../bwc_web/lib/bwc_web/views/session_view.ex | 10 ++++ 9 files changed, 136 insertions(+), 17 deletions(-) create mode 100644 apps/bwc_web/lib/bwc_web/roster.ex diff --git a/apps/bwc/lib/bwc.ex b/apps/bwc/lib/bwc.ex index efbd953..47c5f29 100644 --- a/apps/bwc/lib/bwc.ex +++ b/apps/bwc/lib/bwc.ex @@ -7,10 +7,9 @@ defmodule Bwc do @repo Repo - 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 @@ -18,19 +17,30 @@ defmodule Bwc do 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 get_card(id), do: @repo.get!(Card, id) 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 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 delete_card(%Bwc.Card{} = card), do: @repo.delete(card) @@ -41,5 +51,4 @@ defmodule Bwc do |> Card.changeset(updates) |> @repo.update end - end diff --git a/apps/bwc/lib/bwc/player.ex b/apps/bwc/lib/bwc/player.ex index 3f7886e..a1a583b 100644 --- a/apps/bwc/lib/bwc/player.ex +++ b/apps/bwc/lib/bwc/player.ex @@ -12,7 +12,7 @@ defmodule Bwc.Player do |> cast(attrs, [:username, :picture]) |> validate_required(:username) |> unique_constraint(:username) - |> validate_length(:username, min: 3) + |> validate_length(:username, min: 3, max: 20) end end diff --git a/apps/bwc_web/assets/css/bwc.css b/apps/bwc_web/assets/css/bwc.css index d145209..a325afb 100755 --- a/apps/bwc_web/assets/css/bwc.css +++ b/apps/bwc_web/assets/css/bwc.css @@ -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{ padding: 0px 50px !important; } diff --git a/apps/bwc_web/assets/js/bwc.js b/apps/bwc_web/assets/js/bwc.js index cf657d2..f1f9048 100644 --- a/apps/bwc_web/assets/js/bwc.js +++ b/apps/bwc_web/assets/js/bwc.js @@ -4,6 +4,57 @@ window.jQuery = $; window.$ = $; 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) => { var CSRF_TOKEN = $("input[name=_csrf_token]").val(); $.ajax({ diff --git a/apps/bwc_web/lib/bwc_web/controllers/session_controller.ex b/apps/bwc_web/lib/bwc_web/controllers/session_controller.ex index ce8c5e9..fcff91b 100644 --- a/apps/bwc_web/lib/bwc_web/controllers/session_controller.ex +++ b/apps/bwc_web/lib/bwc_web/controllers/session_controller.ex @@ -3,16 +3,33 @@ defmodule BwcWeb.SessionController do def new(conn, _params) do player = Bwc.new_player() - render conn, "new.html", player: player + render(conn, "new.html", player: player) end - def create(conn, params) do - require Logger - Logger.debug(params) + def set_name(conn, params) do + import Logger + + 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() - case Bwc.create_player(Map.get(params, "player")) do - {:ok, username} -> conn |> put_session(:username, username) |> redirect(to: Routes.card_path(conn, :index, cards)) - {:error, player} -> render(conn, "new.html", player: player) + + case Bwc.get_or_create_player(username) do + {: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 diff --git a/apps/bwc_web/lib/bwc_web/roster.ex b/apps/bwc_web/lib/bwc_web/roster.ex new file mode 100644 index 0000000..6784c6f --- /dev/null +++ b/apps/bwc_web/lib/bwc_web/roster.ex @@ -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 diff --git a/apps/bwc_web/lib/bwc_web/router.ex b/apps/bwc_web/lib/bwc_web/router.ex index fc9b745..5a96571 100644 --- a/apps/bwc_web/lib/bwc_web/router.ex +++ b/apps/bwc_web/lib/bwc_web/router.ex @@ -7,10 +7,12 @@ defmodule BwcWeb.Router do plug :fetch_flash plug :protect_from_forgery plug :put_secure_browser_headers + plug BwcWeb.Roster end pipeline :api do plug :accepts, ["json"] + plug :fetch_session end scope "/", BwcWeb do @@ -32,6 +34,9 @@ defmodule BwcWeb.Router do pipe_through :api resources "/cards", CardController, only: [:delete] + + post "/join", SessionController, :set_name + end # Enables LiveDashboard only for development diff --git a/apps/bwc_web/lib/bwc_web/templates/layout/app.html.eex b/apps/bwc_web/lib/bwc_web/templates/layout/app.html.eex index 16ef760..49791a5 100644 --- a/apps/bwc_web/lib/bwc_web/templates/layout/app.html.eex +++ b/apps/bwc_web/lib/bwc_web/templates/layout/app.html.eex @@ -19,9 +19,16 @@
- - You are:  - Nobody +
+ +
+
diff --git a/apps/bwc_web/lib/bwc_web/views/session_view.ex b/apps/bwc_web/lib/bwc_web/views/session_view.ex index 4ba94b0..0f906bc 100644 --- a/apps/bwc_web/lib/bwc_web/views/session_view.ex +++ b/apps/bwc_web/lib/bwc_web/views/session_view.ex @@ -1,3 +1,13 @@ defmodule BwcWeb.SessionView do 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