|
| 1 | +defmodule CodeCorps.Guardian do |
| 2 | + use Guardian, otp_app: :code_corps |
| 3 | + |
| 4 | + alias CodeCorps.{Project, Repo, User} |
| 5 | + |
| 6 | + def subject_for_token(project = %Project{}, _claims) do |
| 7 | + {:ok, "Project:#{project.id}"} |
| 8 | + end |
| 9 | + def subject_for_token(user = %User{}, _claims) do |
| 10 | + {:ok, "User:#{user.id}"} |
| 11 | + end |
| 12 | + def subject_for_token(_, _) do |
| 13 | + {:error, :unknown_resource_type} |
| 14 | + end |
| 15 | + |
| 16 | + def resource_from_claims(%{"sub" => sub}), do: resource_from_subject(sub) |
| 17 | + def resource_from_claims(_), do: {:error, :missing_subject} |
| 18 | + |
| 19 | + defp resource_from_subject("Project:" <> id), do: {:ok, Repo.get(Project, id)} |
| 20 | + defp resource_from_subject("User:" <> id) do |
| 21 | + user = Repo.get(User, id) |
| 22 | + |
| 23 | + if user do |
| 24 | + name = full_name(user) |
| 25 | + %Timber.Contexts.UserContext{id: user.id, email: user.email, name: name} |
| 26 | + |> Timber.add_context() |
| 27 | + end |
| 28 | + |
| 29 | + {:ok, user} |
| 30 | + end |
| 31 | + defp resource_from_subject(_), do: {:error, :unknown_resource_type} |
| 32 | + |
| 33 | + defp full_name(%User{first_name: nil, last_name: nil}), do: "" |
| 34 | + defp full_name(%User{first_name: first_name, last_name: nil}), do: first_name |
| 35 | + defp full_name(%User{first_name: nil, last_name: last_name}), do: last_name |
| 36 | + defp full_name(%User{first_name: first_name, last_name: last_name}) do |
| 37 | + first_name <> " " <> last_name |
| 38 | + end |
| 39 | + defp full_name(_), do: "" |
| 40 | +end |
0 commit comments