diff --git a/friends/lib/friends/friend.ex b/friends/lib/friends/friend.ex index 69fe5e3..e88f868 100644 --- a/friends/lib/friends/friend.ex +++ b/friends/lib/friends/friend.ex @@ -12,6 +12,7 @@ defmodule Friends.Friend do field(:nickname, :string) field(:born, :date) field(:phone, :string) + field(:address, :string) field(:email, :string) field(:slug, :string) field(:memories, {:array, :string}) @@ -89,15 +90,15 @@ defmodule Friends.Friend do def create(params) do %Friend{} - |> Friend.changeset(%{params | id: nil}) - |> Map.put(:action, :insert) + |> Friend.changeset(%{params | id: nil}) + |> Map.put(:action, :insert) end def update(params) do - {:ok, Friend.get_by_id(params.id |> String.to_integer()) - |> Friend.changeset(params) - |> Map.put(:action, :update) - } + {:ok, + Friend.get_by_id(params.id |> String.to_integer()) + |> Friend.changeset(params) + |> Map.put(:action, :update)} end def commit(changeset) do @@ -107,18 +108,19 @@ defmodule Friends.Friend do |> load_preloads end - def generate_slug(%Ecto.Changeset{} = changeset) do slug = changeset.changes.name |> to_slug - changeset |> changeset(%{ + changeset + |> changeset(%{ slug: slug }) end def generate_slug(%Friend{} = friend) do %{ - friend | slug: friend.name |> to_slug + friend + | slug: friend.name |> to_slug } end @@ -128,11 +130,12 @@ defmodule Friends.Friend do params |> create() |> commit() + _number -> params |> update() |> commit() - end + end end def get_relationships(friend) do @@ -154,15 +157,16 @@ defmodule Friends.Friend do end def can_be_edited_by(friend, user) do - friend.id == user.profile.id + if user |> is_nil(), do: false, else: friend.id == user.profile.id end def assign_user(%Friend{} = friend) do - case friend.email |> Friends.Accounts.get_user_by_email do + case friend.email |> Friends.Accounts.get_user_by_email() do nil -> nil + user -> - user |> Friends.Accounts.assign_profile + user |> Friends.Accounts.assign_profile() end end @@ -170,24 +174,31 @@ defmodule Friends.Friend do model |> @repo.preload(:user) end + def load_user(%Friends.Friend{} = friend), do: friend - def load_relationships(%Friends.Friend{ - relationships: %Ecto.Association.NotLoaded{}, - reverse_relationships: %Ecto.Association.NotLoaded{} - } = model) do + def load_relationships( + %Friends.Friend{ + relationships: %Ecto.Association.NotLoaded{}, + reverse_relationships: %Ecto.Association.NotLoaded{} + } = model + ) do model |> @repo.preload([:relationships, :reverse_relationships]) end + def load_relationships(%Friends.Friend{} = friend), do: friend - def load_preloads(%Friends.Friend{ - relationships: %Ecto.Association.NotLoaded{}, - reverse_relationships: %Ecto.Association.NotLoaded{}, - user: %Ecto.Association.NotLoaded{}} = model) do + def load_preloads( + %Friends.Friend{ + relationships: %Ecto.Association.NotLoaded{}, + reverse_relationships: %Ecto.Association.NotLoaded{}, + user: %Ecto.Association.NotLoaded{} + } = model + ) do model - |> @repo.preload([:user,:relationships, :reverse_relationships]) + |> @repo.preload([:user, :relationships, :reverse_relationships]) end - def load_preloads(%Friends.Friend{} = friend), do: friend + def load_preloads(%Friends.Friend{} = friend), do: friend end diff --git a/friends/lib/friends_web/controllers/friend_controller.ex b/friends/lib/friends_web/controllers/friends_controller.ex similarity index 69% rename from friends/lib/friends_web/controllers/friend_controller.ex rename to friends/lib/friends_web/controllers/friends_controller.ex index 8709ee7..8ed8cdf 100644 --- a/friends/lib/friends_web/controllers/friend_controller.ex +++ b/friends/lib/friends_web/controllers/friends_controller.ex @@ -1,13 +1,12 @@ -defmodule FriendsWeb.FriendController do +defmodule FriendsWeb.FriendsController do use FriendsWeb, :controller alias Friends.{Friend, Relationship} alias Friends.Accounts.User import Helpers def index(conn, _params) do - conn - |> assign(:all_friends, Friend.all) + |> assign(:all_friends, Friend.all()) |> render("index.html") end end diff --git a/friends/lib/friends_web/controllers/page_controller.ex b/friends/lib/friends_web/controllers/page_controller.ex index d24f1da..8bcd260 100644 --- a/friends/lib/friends_web/controllers/page_controller.ex +++ b/friends/lib/friends_web/controllers/page_controller.ex @@ -7,15 +7,14 @@ defmodule FriendsWeb.PageController do def index(conn, _params) do new_friend = Friend.new() |> Friend.changeset() - if(conn|> get_session(:linked)) do + if(conn |> get_session(:linked)) do # If logged in and linked, redirect to friend_path :index - conn |> redirect(to: FriendsWeb.Router.Helpers.friend_path(conn, :index)) + conn |> redirect(to: FriendsWeb.Router.Helpers.friends_path(conn, :index)) else # Otherwise, show the landing page conn |> assign(:new_friend, new_friend) - |> assign(:all_friends, Friend.all()) - |> assign(:users, User |> Repo.all()) + |> assign(:friends, Friend.all()) |> render("index.html") end end diff --git a/friends/lib/friends_web/controllers/user_auth.ex b/friends/lib/friends_web/controllers/user_auth.ex index 3965abb..4da5ac7 100644 --- a/friends/lib/friends_web/controllers/user_auth.ex +++ b/friends/lib/friends_web/controllers/user_auth.ex @@ -128,18 +128,21 @@ defmodule FriendsWeb.UserAuth do end @doc """ - Used when a user is signed in and should therefore have a profile linked. + Used to detect or link a profile to a user. """ def capture_profile(conn, _opts) do current_user = conn.assigns[:current_user] + if current_user do # There's a user, but is there a profile? profile = current_user |> Map.get(:profile) + case profile do nil -> # No profile linked conn |> create_or_link_profile(current_user) + _profile -> # Profile already linked conn |> put_session(:linked, true) @@ -151,31 +154,31 @@ defmodule FriendsWeb.UserAuth do end defp create_or_link_profile(conn, user) do - case user.email |> Friends.Friend.get_by_email do + case user.email |> Friends.Friend.get_by_email() do # Find a profile and link it nil -> conn - |> redirect(to: Routes.profile_form_path(conn, :new)) + |> put_flash(:info, "You're logged in but we still need to make you a profile!") + |> redirect(to: Routes.friends_edit_path(conn, :overview, :new)) |> halt() + # Or make a new one - profile -> + _profile -> user - |> Friends.Accounts.assign_profile + |> Friends.Accounts.assign_profile() conn |> put_session(:linked, true) - end end - @doc """ Used for routes that require the user to be authenticated. If you want to enforce the user email is confirmed before they use the application at all, here would be a good place. """ - def require_authenticated_user(conn, _opts) do + def require_authenticated_user(conn, _opts \\ nil) do if conn.assigns[:current_user] do conn else diff --git a/friends/lib/friends_web/live/components/components.ex b/friends/lib/friends_web/live/components/components.ex index ce9a01a..ce896b9 100644 --- a/friends/lib/friends_web/live/components/components.ex +++ b/friends/lib/friends_web/live/components/components.ex @@ -4,7 +4,30 @@ defmodule FriendsWeb.FriendsLive.Components do import Helpers alias Friends.Friend - def show_page("overview", assigns) do + def header(assigns) do + ~H""" +
+

<%= @friend.name %>

+
+ """ + end + + def menu(assigns) do + ~H""" + + """ + end + + def show_page(:main, assigns), do: show_page(:overview, %{assigns | live_action: :overview}) + + def show_page(:overview, assigns) do ~H""" - <%= if @friend |> Friend.can_be_edited_by(@current_user) do %> -
- <.link patch={"/friend/#{@friend.slug}/#{@page_view}/edit"} class="btn btn-block md:btn-wide text-white">edit -
- <% end %> """ end - def show_page("calendar", assigns) do + def show_page(:timeline, assigns) do ~H""" -
+
<%= for event <- @friend |> Friends.Friend.get_events do %>