1
0
mirror of https://github.com/algora-io/tv.git synced 2025-03-17 20:17:45 +02:00
algora-tv/lib/algora_web/controllers/oauth_callback_controller.ex

55 lines
1.6 KiB
Elixir
Raw Normal View History

2024-02-29 22:31:42 +03:00
defmodule AlgoraWeb.OAuthCallbackController do
use AlgoraWeb, :controller
require Logger
alias Algora.Accounts
def new(conn, %{"provider" => "github", "code" => code, "state" => state} = params) do
2024-02-29 22:31:42 +03:00
client = github_client(conn)
with {:ok, info} <- client.exchange_access_token(code: code, state: state),
%{info: info, primary_email: primary, emails: emails, token: token} = info,
{:ok, user} <- Accounts.register_github_user(primary, info, emails, token) do
conn =
if params["return_to"] do
conn |> put_session(:user_return_to, params["return_to"])
else
conn
end
2024-02-29 22:31:42 +03:00
conn
|> put_flash(:info, "Welcome, #{user.handle}!")
|> AlgoraWeb.UserAuth.log_in_user(user)
else
{:error, %Ecto.Changeset{} = changeset} ->
Logger.debug("failed GitHub insert #{inspect(changeset.errors)}")
conn
|> put_flash(
:error,
"We were unable to fetch the necessary information from your GithHub account"
)
|> redirect(to: "/")
{:error, reason} ->
Logger.debug("failed GitHub exchange #{inspect(reason)}")
conn
|> put_flash(:error, "We were unable to contact GitHub. Please try again later")
|> redirect(to: "/")
end
end
def new(conn, %{"provider" => "github", "error" => "access_denied"}) do
redirect(conn, to: "/")
end
def sign_out(conn, _) do
AlgoraWeb.UserAuth.log_out_user(conn)
end
defp github_client(conn) do
conn.assigns[:github_client] || Algora.Github
end
end