blonk is a radar for your web, where you follow vibes for cool blips on the radar
1defmodule ElixirBlonkWeb.UserSessionController do
2 use ElixirBlonkWeb, :controller
3
4 alias ElixirBlonk.Accounts
5 alias ElixirBlonkWeb.UserAuth
6
7 def new(conn, _params) do
8 render(conn, :new, error_message: nil)
9 end
10
11 def create(conn, %{"user" => user_params}) do
12 handle = user_params["handle"] || user_params["email"]
13 password = user_params["password"]
14
15 case Accounts.authenticate_with_atproto(handle, password) do
16 {:ok, user} ->
17 conn
18 |> put_flash(:info, "Welcome to Blonk, #{user.display_name || user.handle}! 🎉")
19 |> UserAuth.log_in_user(user, user_params)
20
21 {:error, :invalid_credentials} ->
22 render(conn, :new, error_message: "Invalid handle or App Password. Make sure you're using an App Password, not your main password.")
23
24 {:error, :network_error} ->
25 render(conn, :new, error_message: "Unable to connect to Bluesky. Please try again.")
26
27 {:error, reason} ->
28 require Logger
29 Logger.warning("ATProto authentication failed: #{inspect(reason)}")
30 render(conn, :new, error_message: "Authentication failed. Please check your handle and App Password.")
31 end
32 end
33
34 def delete(conn, _params) do
35 conn
36 |> put_flash(:info, "Logged out successfully.")
37 |> UserAuth.log_out_user()
38 end
39end