diff --git a/lib/myapp/battle_net/user.ex b/lib/myapp/battle_net/user.ex index a70fa19..597e119 100644 --- a/lib/myapp/battle_net/user.ex +++ b/lib/myapp/battle_net/user.ex @@ -45,7 +45,7 @@ defmodule MyApp.BattleNet.User do defp parse_character_response({:ok, %HTTPoison.Response{body: body}}, user_id) do case Poison.decode(body) do {:ok, data} -> - Cachex.set(:myapp, "usr_char:#{user_id}", data, ttl: :timer.minutes(1)) # 1 minute + Cachex.set(:myapp, "usr_char:#{user_id}", data, ttl: :timer.minutes(10)) # 10 minutes {:ok, data} {:error, error} -> {:error, error} end diff --git a/lib/myapp/data/user.ex b/lib/myapp/data/user.ex index d4a4061..cd8251e 100644 --- a/lib/myapp/data/user.ex +++ b/lib/myapp/data/user.ex @@ -10,6 +10,11 @@ defmodule MyApp.Data.User do field :battle_net_id, :integer field :battletag, :string field :permissions, :string, default: "user" # admin, mod, user + field :character_guild, :string + field :character_name, :string + field :character_class, :string + field :character_realm, :string + field :character_avatar, :string timestamps() end @@ -20,6 +25,25 @@ defmodule MyApp.Data.User do |> unique_constraint(:battle_net_id) end + defp update_char_changeset(user, params \\ %{}) do + user + |> cast(params, [:character_guild, :character_name, :character_class, :character_realm, :character_avatar]) + |> validate_required([:character_name, :character_class, :character_realm, :character_avatar]) + end + + def update_character(params) do + {:ok, data} = Repo.transaction(fn -> + user = Repo.get(__MODULE__, Map.get(params, "id")) + # remove columns from data because we need to update all of them + |> Map.drop([:character_realm, :character_name, :character_guild, :character_class, :character_avatar]) + output = user + |> update_char_changeset(params) + |> Repo.update + |> Data.Util.process_insert_or_update + end) + data + end + @spec get_user(integer) :: nil | map defp get_user(battle_net_id) do query = from u in "user", diff --git a/lib/myapp_web/controllers/battle_net_controller.ex b/lib/myapp_web/controllers/battle_net_controller.ex deleted file mode 100644 index 3297c3a..0000000 --- a/lib/myapp_web/controllers/battle_net_controller.ex +++ /dev/null @@ -1,40 +0,0 @@ -defmodule MyAppWeb.BattleNetController do - use MyAppWeb, :controller - alias MyAppWeb.Response - alias MyApp.BattleNet - alias MyApp.Data - alias MyApp.Guardian.Auth - - # https://us.battle.net/oauth/authorize?redirect_uri=https://localhost/api/battlenet/authorize&scope=wow.profile&client_id=vxqv32fddxsy6cmk6259amtymbuzmfrq&response_type=code - - @spec authorize(map, map) :: any - def authorize(conn, %{"code" => code}) when not is_nil(code) do - - {output, status} = code - |> BattleNet.Auth.get_access_token - |> BattleNet.User.get_user - |> Data.User.upsert_user - |> Auth.Token.add_token_and_map_claims - |> Response.put_resp - - conn - |>put_status(status) - |>Response.json(output) - end - - # TODO: cache this end point - def characters(conn, _params) do - %{"access_token" => token, "id" => user_id} = conn - |> MyApp.Guardian.Plug.current_claims - |> Map.take(["access_token", "id"]) - - {output, status} = user_id - |> BattleNet.User.get_user_characters(token) - |> Response.put_resp - - conn - |>put_status(status) - |>Response.json(output) - end - -end diff --git a/lib/myapp_web/controllers/user_controller.ex b/lib/myapp_web/controllers/user_controller.ex index 2ea8c53..56ae5f1 100644 --- a/lib/myapp_web/controllers/user_controller.ex +++ b/lib/myapp_web/controllers/user_controller.ex @@ -1,11 +1,57 @@ defmodule MyAppWeb.UserController do use MyAppWeb, :controller alias MyAppWeb.Response + alias MyApp.BattleNet + alias MyApp.Data + alias MyApp.Guardian.Auth + + # https://us.battle.net/oauth/authorize?redirect_uri=https://localhost/api/battlenet/authorize&scope=wow.profile&client_id=vxqv32fddxsy6cmk6259amtymbuzmfrq&response_type=code + + @spec authorize(map, map) :: any + def authorize(conn, %{"code" => code}) when not is_nil(code) do + + {output, status} = code + |> BattleNet.Auth.get_access_token + |> BattleNet.User.get_user + |> Data.User.upsert_user + |> Auth.Token.add_token_and_map_claims + |> Response.put_resp - @spec index(map, map) :: any - def index(conn, _params) do conn - |> Response.json("Auth works!") + |>put_status(status) + |>Response.json(output) end - + + def characters(conn, _params) do + %{"access_token" => token, "id" => user_id} = conn + |> MyApp.Guardian.Plug.current_claims + |> Map.take(["access_token", "id"]) + + {output, status} = user_id + |> BattleNet.User.get_user_characters(token) + |> Response.put_resp + + conn + |>put_status(status) + |>Response.json(output) + end + + def update_selected_character(conn, params) do + id = conn + |> MyApp.Guardian.Plug.current_claims + |> Map.get("id") + + params = params + |> Map.put("id", id) + |> Map.put_new("character_guild", nil) # set guild to nil if it doesn't exist + + {output, status} = params + |> Data.User.update_character + |> Response.put_resp + + conn + |>put_status(status) + |>Response.json(output) + end + end diff --git a/lib/myapp_web/router.ex b/lib/myapp_web/router.ex index dc6239b..dfad1f6 100644 --- a/lib/myapp_web/router.ex +++ b/lib/myapp_web/router.ex @@ -22,17 +22,12 @@ defmodule MyAppWeb.Router do scope "/api", MyAppWeb do pipe_through [:api] - scope "/battlenet" do - post "/authorize", BattleNetController, :authorize - - pipe_through [:user_auth] - get "/characters", BattleNetController, :characters - end - scope "/user" do - # authenticated routes + post "/authorize", UserController, :authorize + pipe_through [:user_auth] - get "/", UserController, :index + get "/characters", UserController, :characters + put "/characters", UserController, :update_selected_character end scope "/thread" do diff --git a/priv/repo/migrations/20180101200459_create_user.exs b/priv/repo/migrations/20180101200459_create_user.exs index 767dddd..f11fa48 100644 --- a/priv/repo/migrations/20180101200459_create_user.exs +++ b/priv/repo/migrations/20180101200459_create_user.exs @@ -6,7 +6,11 @@ defmodule MyApp.Repo.Migrations.CreateUser do add :battle_net_id, :integer add :battletag, :string add :permissions, :string - + add :character_guild, :string + add :character_name, :string + add :character_class, :string + add :character_realm, :string + add :character_avatar, :string timestamps() end diff --git a/test/myapp_web/controllers/user_controller_test.exs b/test/myapp_web/controllers/user_controller_test.exs index ca18932..275cce2 100644 --- a/test/myapp_web/controllers/user_controller_test.exs +++ b/test/myapp_web/controllers/user_controller_test.exs @@ -1,14 +1,14 @@ defmodule MyAppWeb.UserControllerTest do use MyAppWeb.ConnCase, async: true - test "get user index should return unauthorized" do - conn = - build_conn() - |> get("/api/user") + # test "get user index should return unauthorized" do + # conn = + # build_conn() + # |> get("/api/user") - body = conn |> response(401) |> Poison.decode! + # body = conn |> response(401) |> Poison.decode! - assert body["error"]["message"] == "unauthorized" - end + # assert body["error"]["message"] == "unauthorized" + # end end