· 8 years ago · Dec 17, 2017, 07:36 PM
1defmodule WarehouseWeb.UserController do
2 use WarehouseWeb, :controller
3
4 alias Warehouse.Account
5 alias Warehouse.Account.User
6
7 action_fallback WarehouseWeb.FallbackController
8
9 def index(conn, _params) do
10 users = Account.list_users()
11 render(conn, "index.json-api", data: users)
12 end
13# ... ...
14end
15
16defmodule WarehouseWeb.Router do
17 use WarehouseWeb, :router
18
19 pipeline :api do
20 plug :accepts, ["json", "json-api"]
21 end
22
23 pipeline :api_auth do
24 plug WarehouseWeb.Guardian.AuthPipeline
25 end
26
27 scope "/api", WarehouseWeb do
28 pipe_through :api
29 post "/register", RegistrationController, :create
30 post "/token", SessionController, :create, as: :login
31 end
32
33 scope "/api", WarehouseWeb do
34 pipe_through :api_auth
35
36 resources "/users", UserController, except: [:new, :edit]
37 end
38end
39
40defmodule WarehouseWeb.Guardian.AuthPipeline do
41 use Guardian.Plug.Pipeline, otp_app: :warehouse,
42 module: WarehouseWeb.Guardian,
43 error_handler: WarehouseWeb.Guardian.AuthErrorHandler
44
45 plug Guardian.Plug.VerifyHeader
46 plug Guardian.Plug.EnsureAuthenticated
47end
48
49defmodule Warehouse.Guardian do
50 use Guardian, otp: :warehouse,
51 secret_key: "some secret"
52
53 def subject_for_token(resource, _claims) do
54 {:ok, to_string(resource.id)}
55 end
56 def resource_from_claims(claims) do
57 user = Warehouse.Account.get_user!(claims["sub"])
58 {:ok, user}
59 end
60end
61
62defmodule WarehouseWeb.Guardian.AuthErrorHandler do
63 import Plug.Conn
64
65 def auth_error(conn, {type, reason}, opts) do
66 IO.inspect "authentication is not working!!"
67 body = Poison.encode!(%{message: to_string(type)})
68 send_resp(conn, 401, body)
69 end
70end
71
72defmodule WarehouseWeb.UserControllerTest do
73 use WarehouseWeb.ConnCase
74
75 alias Warehouse.Account
76 alias Warehouse.Account.User
77
78 @create_attrs %{email: "some email", firstname: "some firstname", lastname: "some lastname", password: "some password"}
79 @update_attrs %{email: "some updated email", firstname: "some updated firstname", lastname: "some updated lastname", password: "some updated password"}
80 @invalid_attrs %{email: nil, firstname: nil, lastname: nil, password: nil}
81
82 def fixture(:user) do
83 {:ok, user} = Account.create_user(@create_attrs)
84 user
85 end
86
87 setup %{conn: conn} do
88 # create user to be logged in
89 {:ok, user} = Account.create_user(%{email: "gg@ex.com", real_password: "abc123", real_password_confirmation: "abc123"})
90
91 # create token for session
92 {:ok, jwt, _claims} = Account.authenticate(%{user: user, password: "abc123"})
93
94 # add authorization header to the request
95 conn = conn
96 |> put_req_header("authorization", "Bearer: #{jwt}")
97 |> put_req_header("accept", "application/json")
98
99 {:ok, %{conn: conn, user: user}}
100 end
101
102 describe "index" do
103 test "lists all users", %{conn: conn} do
104 conn = get conn, user_path(conn, :index)
105 assert json_response(conn, 200)["data"] == []
106 end
107 end
108end