diff --git a/friends/lib/friends/accounts.ex b/friends/lib/friends/accounts.ex
index e0046ad..9465ef0 100644
--- a/friends/lib/friends/accounts.ex
+++ b/friends/lib/friends/accounts.ex
@@ -96,13 +96,19 @@ defmodule Friends.Accounts do
"""
def assign_profile(%User{} = user) do
case user.email |> Friends.Friend.get_by_email do
- nil -> nil
+ nil ->
+ nil
friend ->
- friend
+ new_friend = friend
|> Friends.Friend.changeset(%{
- user_id: user.id
- })
+ user_id: user.id})
|> Friends.Repo.update!()
+ |> Friends.Friend.load_user
+
+ %{
+ friend: new_friend,
+ user: new_friend.user |> Friends.Accounts.User.load_profile
+ }
end
end
diff --git a/friends/lib/friends/friend.ex b/friends/lib/friends/friend.ex
index d8f40df..138828d 100644
--- a/friends/lib/friends/friend.ex
+++ b/friends/lib/friends/friend.ex
@@ -56,7 +56,7 @@ defmodule Friends.Friend do
end
def new(params \\ %{}) do
- %Friend{id: "new"}
+ %Friend{id: :new}
|> struct(params)
end
@@ -100,19 +100,23 @@ defmodule Friends.Friend do
}
end
+ def commit(friend) do
+ friend
+ |> @repo.insert!
+ |> load_user
+ end
+
def create_or_update(params) do
case params.id do
:new ->
- friend = create(params)
- friend
- |> @repo.insert!
- |> load_user
+ params
+ |> create()
+ |> commit()
_number ->
- friend = update(params)
- friend
- |> @repo.insert!
- |> load_user
- end
+ params
+ |> update()
+ |> commit()
+ end
end
def get_relationships(friend) do
@@ -148,9 +152,20 @@ defmodule Friends.Friend do
end
end
+ def assign_user(%Friend{} = friend) do
+ case friend.email |> Friends.Accounts.get_user_by_email do
+ nil ->
+ nil
+ user ->
+ user |> Friends.Accounts.assign_profile
+ end
+ end
+
def load_user(%Friends.Friend{user: %Ecto.Association.NotLoaded{}} = model) do
model
|> @repo.preload(:user)
end
+ def load_user(%Friends.Friend{} = friend), do: friend
+
end
diff --git a/friends/lib/friends_web/controllers/page_controller.ex b/friends/lib/friends_web/controllers/page_controller.ex
index c0ec44d..d24f1da 100644
--- a/friends/lib/friends_web/controllers/page_controller.ex
+++ b/friends/lib/friends_web/controllers/page_controller.ex
@@ -7,10 +7,16 @@ defmodule FriendsWeb.PageController do
def index(conn, _params) do
new_friend = Friend.new() |> Friend.changeset()
- conn
- |> assign(:new_friend, new_friend)
- |> assign(:all_friends, Friend.all())
- |> assign(:users, User |> Repo.all())
- |> render("index.html")
+ 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))
+ else
+ # Otherwise, show the landing page
+ conn
+ |> assign(:new_friend, new_friend)
+ |> assign(:all_friends, Friend.all())
+ |> assign(:users, User |> Repo.all())
+ |> render("index.html")
+ end
end
end
diff --git a/friends/lib/friends_web/controllers/user_auth.ex b/friends/lib/friends_web/controllers/user_auth.ex
index 2e332cb..3965abb 100644
--- a/friends/lib/friends_web/controllers/user_auth.ex
+++ b/friends/lib/friends_web/controllers/user_auth.ex
@@ -138,10 +138,11 @@ defmodule FriendsWeb.UserAuth do
case profile do
nil ->
# No profile linked
- conn |> create_or_link_profile(current_user)
+ conn
+ |> create_or_link_profile(current_user)
_profile ->
# Profile already linked
- conn
+ conn |> put_session(:linked, true)
end
else
# Not logged in
@@ -158,8 +159,12 @@ defmodule FriendsWeb.UserAuth do
|> halt()
# Or make a new one
profile ->
- user |> Friends.Accounts.assign_profile
+ user
+ |> Friends.Accounts.assign_profile
+
conn
+ |> put_session(:linked, true)
+
end
end
diff --git a/friends/lib/friends_web/templates/user_registration/new.html.heex b/friends/lib/friends_web/templates/user_registration/new.html.heex
index bd79fcd..b92b033 100644
--- a/friends/lib/friends_web/templates/user_registration/new.html.heex
+++ b/friends/lib/friends_web/templates/user_registration/new.html.heex
@@ -3,7 +3,7 @@
<.form let={f} for={@changeset} action={Routes.user_registration_path(@conn, :create)}>
<%= if @changeset.action do %>
-
Oops, something went wrong! Please check the errors below.
+ Oops, something went wrong! Please check the errors below.
<% end %>
@@ -15,6 +15,7 @@
-
<%= label f, :password, class: "w-1/3" %>
<%= password_input f, :password, required: true %>
+ <%= error_tag f, :password %>
-
<%= submit "Register", class: "btn btn-primary" %>
diff --git a/friends/test/friends/accounts_test.exs b/friends/test/friends/accounts_test.exs
index a839391..f61944a 100644
--- a/friends/test/friends/accounts_test.exs
+++ b/friends/test/friends/accounts_test.exs
@@ -3,7 +3,7 @@ defmodule Friends.AccountsTest do
alias Friends.Accounts
- import Friends.AccountsFixtures
+ import Friends.{AccountsFixtures, FriendsFixtures}
alias Friends.Accounts.{User, UserToken}
describe "get_user_by_email/1" do
@@ -502,4 +502,29 @@ defmodule Friends.AccountsTest do
refute inspect(%User{password: "123456"}) =~ "password: \"123456\""
end
end
+
+ describe "assign_profile/1" do
+ setup do
+ user = user_fixture()
+ %{
+ user: user,
+ friend: friend_fixture(%{email: user.email})
+ }
+ end
+
+ test "links a friend to a user", %{user: user, friend: friend} do
+ assert user.profile == nil
+ assert friend.user == nil
+
+ %{
+ friend: new_friend,
+ user: new_user
+ } = user |> Friends.Accounts.assign_profile
+
+ assert new_user.profile.id == friend.id
+ assert new_friend.user.id == user.id
+
+ end
+ end
+
end
diff --git a/friends/test/friends/friend_test.exs b/friends/test/friends/friend_test.exs
index 6be3588..407f316 100644
--- a/friends/test/friends/friend_test.exs
+++ b/friends/test/friends/friend_test.exs
@@ -3,7 +3,32 @@ defmodule Friends.FriendTest do
# alias Friends.Accounts
-# import Friends.AccountsFixtures
+ import Friends.{AccountsFixtures,FriendsFixtures}
# alias Friends.Accounts.{User, UserToken}
+
+ describe "assign_user/1" do
+ setup do
+ friend = friend_fixture()
+ %{
+ friend: friend,
+ user: user_fixture(%{email: friend.email})
+ }
+ end
+ test "links a user to a friend", %{user: user, friend: friend} do
+ assert user.profile == nil
+ assert friend.user == nil
+
+ %{
+ friend: new_friend,
+ user: new_user
+ } = friend |> Friends.Friend.assign_user
+
+ assert new_user.profile.id == friend.id
+ assert new_friend.user.id == user.id
+
+ end
+end
+
+
end
diff --git a/friends/test/friends_web/controllers/friend_controller_test.exs b/friends/test/friends_web/controllers/friend_controller_test.exs
new file mode 100644
index 0000000..722a990
--- /dev/null
+++ b/friends/test/friends_web/controllers/friend_controller_test.exs
@@ -0,0 +1,35 @@
+defmodule FriendsWeb.FriendControllerTest do
+ use FriendsWeb.ConnCase, async: true
+ import Friends.{AccountsFixtures,FriendsFixtures}
+
+ alias FriendsWeb.Router.Helpers, as: Routes
+
+
+ setup do
+ %{
+ user: user,
+ friend: friend
+ } =
+ friend_fixture(
+ %{email: user_fixture().email}
+ ) |> Friends.Friend.assign_user
+ end
+
+ describe "GET '/friends'" do
+
+ test "shows the friends dashboard", %{conn: conn, friend: friend} do
+ conn = get(conn, "/friends")
+ assert html_response(conn, 200) =~ friend.name
+ assert html_response(conn, 200) =~ "Log in"
+ end
+
+ test "shows '(you)' if logged in", %{conn: conn, friend: friend, user: user} do
+ conn = conn |> log_in_user(user) |> get("/friends")
+ assert html_response(conn, 200) =~ friend.name
+ assert html_response(conn, 200) =~ "(you)"
+ assert html_response(conn, 200) =~ "Log out"
+ end
+
+ end
+
+end
diff --git a/friends/test/friends_web/controllers/page_controller_test.exs b/friends/test/friends_web/controllers/page_controller_test.exs
index ccf7c44..d85c125 100644
--- a/friends/test/friends_web/controllers/page_controller_test.exs
+++ b/friends/test/friends_web/controllers/page_controller_test.exs
@@ -17,15 +17,15 @@ defmodule FriendsWeb.PageControllerTest do
end
test "redirects to the new profile flow if logged in but has no profile", %{conn: conn, user: user} do
- friend = friend_fixture(%{email: "random_email@invalid.biz"})
+ _friend = friend_fixture(%{email: "random_email@invalid.biz"})
conn = conn |> log_in_user(user) |> get("/")
assert redirected_to(conn) == Routes.profile_form_path(conn, :new)
end
test "redirects to the friends dashboard if logged in & has a profile", %{conn: conn, user: user} do
- friend = friend_fixture(%{email: user.email})
+ _friend = friend_fixture(%{email: user.email})
conn = conn |> log_in_user(user) |> get("/")
- assert html_response(conn, 200) =~ "Log out"
+ assert redirected_to(conn) == Routes.friend_path(conn, :index)
end
end
diff --git a/friends/test/support/fixtures/friends_fixtures.ex b/friends/test/support/fixtures/friends_fixtures.ex
index 0bae673..c399335 100644
--- a/friends/test/support/fixtures/friends_fixtures.ex
+++ b/friends/test/support/fixtures/friends_fixtures.ex
@@ -3,9 +3,15 @@ defmodule Friends.FriendsFixtures do
This module defines test helpers for creating
entities via the `Friends.Friend` context.
"""
+ def random_string(length) do
+ :crypto.strong_rand_bytes(length)
+ |> String.replace("-", "")
+ |> Base.url_encode64
+ |> binary_part(0, length)
+ end
def unique_friend_email, do: "user#{System.unique_integer()}@example.com"
- def valid_friend_name, do: "Firsty-First Oldfashioned Toomany-Middlenames McLastname"
+ def valid_friend_name, do: "#{random_string(5)} Mc#{random_string(5)}"
def valid_friend_phone, do: "+1 (917) 624 2939" |> Helpers.format_phone
def valid_friend_birthdate, do: ~D"1990-05-05"