Fixup profiles

This commit is contained in:
Chris McCord 2021-11-16 15:54:40 -05:00
parent 364b0659e1
commit 2f4940fab6
10 changed files with 54 additions and 32 deletions

View file

@ -29,7 +29,6 @@ if config_env() == :prod do
You can generate one by calling: mix phx.gen.secret You can generate one by calling: mix phx.gen.secret
""" """
app_name = System.fetch_env!("FLY_APP_NAME")
host = System.get_env("URL_HOST") || "example.com" host = System.get_env("URL_HOST") || "example.com"
config :live_beats, LiveBeatsWeb.Endpoint, config :live_beats, LiveBeatsWeb.Endpoint,

View file

@ -11,6 +11,10 @@ processes = []
IPV6 = 1 IPV6 = 1
URL_HOST = "livebeats.fly.dev" URL_HOST = "livebeats.fly.dev"
[mounts]
source="data"
destination="/app/live_beats/lib/live_beats-0.1.0/priv/uploads"
[experimental] [experimental]
allowed_public_ports = [] allowed_public_ports = []
auto_rollback = true auto_rollback = true
@ -25,7 +29,7 @@ processes = []
[services.concurrency] [services.concurrency]
hard_limit = 25 hard_limit = 25
soft_limit = 20 soft_limit = 20
type = "connections" type = "requests"
[[services.ports]] [[services.ports]]
handlers = ["http"] handlers = ["http"]

View file

@ -21,6 +21,12 @@ defmodule LiveBeats.Accounts do
Repo.all(from u in User, limit: ^Keyword.fetch!(opts, :limit)) Repo.all(from u in User, limit: ^Keyword.fetch!(opts, :limit))
end end
def lists_users_by_active_profile(id, opts) do
Repo.all(
from u in User, where: u.active_profile_user_id == ^id, limit: ^Keyword.fetch!(opts, :limit)
)
end
def admin?(%User{} = user) do def admin?(%User{} = user) do
user.email in Application.fetch_env!(:live_beats, :admin_emails) user.email in Application.fetch_env!(:live_beats, :admin_emails)
end end
@ -76,6 +82,8 @@ defmodule LiveBeats.Accounts do
""" """
def get_user!(id), do: Repo.get!(User, id) def get_user!(id), do: Repo.get!(User, id)
def get_user(id), do: Repo.get(User, id)
def get_user_by!(fields), do: Repo.get_by!(User, fields) def get_user_by!(fields), do: Repo.get_by!(User, fields)
def update_active_profile(%User{active_profile_user_id: same_id} = current_user, same_id) do def update_active_profile(%User{active_profile_user_id: same_id} = current_user, same_id) do

View file

@ -15,7 +15,7 @@ defmodule LiveBeatsWeb.Presence do
~H""" ~H"""
<!-- users --> <!-- users -->
<div class="px-4 mt-6 sm:px-6 lg:px-8"> <div class="px-4 mt-6 sm:px-6 lg:px-8">
<h2 class="text-gray-500 text-xs font-medium uppercase tracking-wide">Who's Here</h2> <h2 class="text-gray-500 text-xs font-medium uppercase tracking-wide">Who's Listening</h2>
<ul role="list" class="grid grid-cols-1 gap-4 sm:gap-4 sm:grid-cols-2 xl:grid-cols-5 mt-3" x-max="1"> <ul role="list" class="grid grid-cols-1 gap-4 sm:gap-4 sm:grid-cols-2 xl:grid-cols-5 mt-3" x-max="1">
<%= for presence <- @presences do %> <%= for presence <- @presences do %>
<li class="relative col-span-1 flex shadow-sm rounded-md overflow-hidden"> <li class="relative col-span-1 flex shadow-sm rounded-md overflow-hidden">

View file

@ -7,7 +7,7 @@ defmodule LiveBeatsWeb.FileController do
alias LiveBeats.MediaLibrary alias LiveBeats.MediaLibrary
def show(conn, %{"id" => filename_uuid, "token" => token}) do def show(conn, %{"id" => filename_uuid, "token" => token}) do
case Phoenix.Token.verify(conn, "file", token, max_age: :timer.minutes(10)) do case Phoenix.Token.verify(conn, "file", token, max_age: :timer.minutes(1)) do
{:ok, ^filename_uuid} -> do_send_file(conn, MediaLibrary.local_filepath(filename_uuid)) {:ok, ^filename_uuid} -> do_send_file(conn, MediaLibrary.local_filepath(filename_uuid))
{:ok, _} -> send_resp(conn, :unauthorized, "") {:ok, _} -> send_resp(conn, :unauthorized, "")
{:error, _} -> send_resp(conn, :unauthorized, "") {:error, _} -> send_resp(conn, :unauthorized, "")

View file

@ -1,6 +1,10 @@
defmodule LiveBeatsWeb.RedirectController do defmodule LiveBeatsWeb.RedirectController do
use LiveBeatsWeb, :controller use LiveBeatsWeb, :controller
import LiveBeatsWeb.UserAuth, only: [fetch_current_user: 2]
plug :fetch_current_user
def redirect_authenticated(conn, _) do def redirect_authenticated(conn, _) do
if conn.assigns.current_user do if conn.assigns.current_user do
LiveBeatsWeb.UserAuth.redirect_if_user_is_authenticated(conn, []) LiveBeatsWeb.UserAuth.redirect_if_user_is_authenticated(conn, [])

View file

@ -9,7 +9,7 @@ defmodule LiveBeatsWeb.UserAuth do
def on_mount(:current_user, _params, session, socket) do def on_mount(:current_user, _params, session, socket) do
case session do case session do
%{"user_id" => user_id} -> %{"user_id" => user_id} ->
{:cont, LiveView.assign_new(socket, :current_user, fn -> Accounts.get_user!(user_id) end)} {:cont, LiveView.assign_new(socket, :current_user, fn -> Accounts.get_user(user_id) end)}
%{} -> %{} ->
{:cont, LiveView.assign(socket, :current_user, nil)} {:cont, LiveView.assign(socket, :current_user, nil)}
@ -19,14 +19,21 @@ defmodule LiveBeatsWeb.UserAuth do
def on_mount(:ensure_authenticated, _params, session, socket) do def on_mount(:ensure_authenticated, _params, session, socket) do
case session do case session do
%{"user_id" => user_id} -> %{"user_id" => user_id} ->
{:cont, LiveView.assign_new(socket, :current_user, fn -> Accounts.get_user!(user_id) end)} new_socket = LiveView.assign_new(socket, :current_user, fn -> Accounts.get_user!(user_id) end)
%Accounts.User{} = new_socket.assigns.current_user
{:cont, new_socket}
%{} -> %{} ->
{:halt, {:halt, redirect_require_login(socket)}
socket
|> LiveView.put_flash(:error, "Please sign in")
|> LiveView.redirect(to: Routes.sign_in_path(socket, :index))}
end end
rescue
Ecto.NoResultsError -> {:halt, redirect_require_login(socket)}
end
defp redirect_require_login(socket) do
socket
|> LiveView.put_flash(:error, "Please sign in")
|> LiveView.redirect(to: Routes.sign_in_path(socket, :index))
end end
@doc """ @doc """
@ -78,7 +85,7 @@ defmodule LiveBeatsWeb.UserAuth do
""" """
def fetch_current_user(conn, _opts) do def fetch_current_user(conn, _opts) do
user_id = get_session(conn, :user_id) user_id = get_session(conn, :user_id)
user = user_id && Accounts.get_user!(user_id) user = user_id && Accounts.get_user(user_id)
assign(conn, :current_user, user) assign(conn, :current_user, user)
end end

View file

@ -13,7 +13,7 @@ defmodule LiveBeatsWeb.SongLive.Index do
<%= @profile.tagline %> <%= if @owns_profile? do %>(you)<% end %> <%= @profile.tagline %> <%= if @owns_profile? do %>(you)<% end %>
</div> </div>
<.link href={@profile.external_homepage_url} _target="blank" class="block text-sm text-gray-600"> <.link href={@profile.external_homepage_url} _target="blank" class="block text-sm text-gray-600">
<.icon name={:code}/> <span class=""><%= url_text(@profile.external_homepage_url) %></span> <.icon name={:code}/> <span class=""><%= url_text(@profile.external_homepage_url) %></span>
</.link> </.link>
</div> </div>
@ -40,7 +40,6 @@ defmodule LiveBeatsWeb.SongLive.Index do
</.title_bar> </.title_bar>
<Presence.listening_now presences={@presences}> <Presence.listening_now presences={@presences}>
<:abbrev let={user}><%= String.first(user.username) %></:abbrev>
<:title let={user}><%= user.username %></:title> <:title let={user}><%= user.username %></:title>
</Presence.listening_now> </Presence.listening_now>
@ -231,8 +230,8 @@ defmodule LiveBeatsWeb.SongLive.Index do
end end
defp assign_presences(socket) do defp assign_presences(socket) do
# TODO users = Accounts.lists_users_by_active_profile(socket.assigns.profile.user_id, limit: 10)
assign(socket, presences: Accounts.list_users(limit: 10)) assign(socket, presences: users)
end end
defp url_text(nil), do: "" defp url_text(nil), do: ""

View file

@ -2,7 +2,7 @@ defmodule LiveBeatsWeb.Router do
use LiveBeatsWeb, :router use LiveBeatsWeb, :router
import LiveBeatsWeb.UserAuth, import LiveBeatsWeb.UserAuth,
only: [fetch_current_user: 2, redirect_if_user_is_authenticated: 2] only: [redirect_if_user_is_authenticated: 2]
pipeline :browser do pipeline :browser do
plug :accepts, ["html"] plug :accepts, ["html"]
@ -11,7 +11,6 @@ defmodule LiveBeatsWeb.Router do
plug :put_root_layout, {LiveBeatsWeb.LayoutView, :root} plug :put_root_layout, {LiveBeatsWeb.LayoutView, :root}
plug :protect_from_forgery plug :protect_from_forgery
plug :put_secure_browser_headers plug :put_secure_browser_headers
plug :fetch_current_user
end end
pipeline :api do pipeline :api do

View file

@ -113,23 +113,25 @@
</div> </div>
</form> </form>
</div> </div>
<div class="flex items-center"> <%= if @current_user do %>
<!-- Profile dropdown TODO --> <div class="flex items-center">
<div @keydown.escape.stop="open = false" @click.away="open = false" class="ml-3 relative"> <!-- Profile dropdown TODO -->
<div> <div class="ml-3 relative">
<button type="button" <div>
class="max-w-xs bg-white flex items-center text-sm rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500" <button type="button"
id="user-menu-button" @click="open = true" class="max-w-xs bg-white flex items-center text-sm rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500"
aria-expanded="false" aria-haspopup="true" id="user-menu-button" @click="open = true"
> aria-expanded="false" aria-haspopup="true"
<span class="sr-only">Open user menu</span> >
<img class="h-8 w-8 rounded-full" <span class="sr-only">Open user menu</span>
src={@current_user.avatar_url} <img class="h-8 w-8 rounded-full"
alt=""> src={@current_user.avatar_url}
</button> alt="">
</button>
</div>
</div> </div>
</div> </div>
</div> <% end %>
</div> </div>
</div> </div>