forked from code-corps/code-corps-api
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathguardian.ex
More file actions
40 lines (33 loc) · 1.27 KB
/
guardian.ex
File metadata and controls
40 lines (33 loc) · 1.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
defmodule CodeCorps.Guardian do
use Guardian, otp_app: :code_corps
alias CodeCorps.{Project, Repo, User}
def subject_for_token(project = %Project{}, _claims) do
{:ok, "Project:#{project.id}"}
end
def subject_for_token(user = %User{}, _claims) do
{:ok, "User:#{user.id}"}
end
def subject_for_token(_, _) do
{:error, :unknown_resource_type}
end
def resource_from_claims(%{"sub" => sub}), do: resource_from_subject(sub)
def resource_from_claims(_), do: {:error, :missing_subject}
defp resource_from_subject("Project:" <> id), do: {:ok, Repo.get(Project, id)}
defp resource_from_subject("User:" <> id) do
user = Repo.get(User, id)
if user do
name = full_name(user)
%Timber.Contexts.UserContext{id: user.id, email: user.email, name: name}
|> Timber.add_context()
end
{:ok, user}
end
defp resource_from_subject(_), do: {:error, :unknown_resource_type}
defp full_name(%User{first_name: nil, last_name: nil}), do: ""
defp full_name(%User{first_name: first_name, last_name: nil}), do: first_name
defp full_name(%User{first_name: nil, last_name: last_name}), do: last_name
defp full_name(%User{first_name: first_name, last_name: last_name}) do
first_name <> " " <> last_name
end
defp full_name(_), do: ""
end