From 0444df5c0b6d950c9e07baeba68abc813d8a8097 Mon Sep 17 00:00:00 2001 From: daniel_sp Date: Thu, 14 Dec 2023 13:56:17 +0000 Subject: [PATCH 1/5] fix: ninja birthday not being rendered --- lib/bokken_web/controllers/ninja/ninja_json.ex | 1 + test/bokken_web/controllers/ninja_json_test.exs | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/bokken_web/controllers/ninja/ninja_json.ex b/lib/bokken_web/controllers/ninja/ninja_json.ex index 80dcb9b4..5a55911b 100644 --- a/lib/bokken_web/controllers/ninja/ninja_json.ex +++ b/lib/bokken_web/controllers/ninja/ninja_json.ex @@ -25,6 +25,7 @@ defmodule BokkenWeb.NinjaJSON do belt: ninja.belt, socials: ninja.socials, since: ninja.inserted_at, + birthday: ninja.birthday, guardian_id: ninja.guardian_id } |> Map.merge(skills(ninja)) diff --git a/test/bokken_web/controllers/ninja_json_test.exs b/test/bokken_web/controllers/ninja_json_test.exs index 2ae7e248..fed9449a 100644 --- a/test/bokken_web/controllers/ninja_json_test.exs +++ b/test/bokken_web/controllers/ninja_json_test.exs @@ -17,6 +17,7 @@ defmodule Bokken.NinjaJSONTest do belt: ninja.belt, socials: ninja.socials, since: ninja.inserted_at, + birthday: ninja.birthday, guardian_id: ninja.guardian_id } end From 38e04277224059900e85f8184786a35088a104a4 Mon Sep 17 00:00:00 2001 From: daniel_sp Date: Sat, 16 Dec 2023 12:20:09 +0000 Subject: [PATCH 2/5] refactor ninja view --- .../controllers/ninja/ninja_controller.ex | 22 +++-- .../controllers/ninja/ninja_json.ex | 21 ++--- lib/bokken_web/views/auth_view.ex | 2 +- lib/bokken_web/views/enrollment_view.ex | 2 +- lib/bokken_web/views/lecture_view.ex | 2 +- .../controllers/ninja_json_test.exs | 91 +++++++++++++------ 6 files changed, 87 insertions(+), 53 deletions(-) diff --git a/lib/bokken_web/controllers/ninja/ninja_controller.ex b/lib/bokken_web/controllers/ninja/ninja_controller.ex index e6e3bd78..23b86550 100644 --- a/lib/bokken_web/controllers/ninja/ninja_controller.ex +++ b/lib/bokken_web/controllers/ninja/ninja_controller.ex @@ -14,20 +14,24 @@ defmodule BokkenWeb.NinjaController do when is_map_key(params, "badge_id") when is_map_key(params, "event_id") do ninjas = Accounts.list_ninjas() - render(conn, :index, ninjas: ninjas) + render(conn, :index, %{ninjas: ninjas, current_user: conn.assigns.current_user}) end def index(conn, _params) when is_guardian(conn) or is_organizer(conn) do guardian_id = conn.assigns.current_user.guardian.id guardian = Accounts.get_guardian!(guardian_id, [:ninjas]) - render(conn, :index, ninjas: guardian.ninjas) + + render(conn, :index, %{ + ninjas: guardian.ninjas, + current_user: conn.assigns.current_user + }) end def create(conn, %{"event_id" => event_id, "ninja_id" => ninja_id}) when is_guardian(conn) or is_organizer(conn) do with {:ok, %Event{} = event, %Lecture{} = _lecture} <- Accounts.register_ninja_in_event(event_id, ninja_id) do - render(conn, :index, ninjas: event.ninjas) + render(conn, :index, %{ninjas: event.ninjas, current_user: conn.assigns.current_user}) end end @@ -39,7 +43,7 @@ defmodule BokkenWeb.NinjaController do conn |> put_status(:created) |> put_resp_header("location", ~p"/api/teams/#{ninja}") - |> render(:show, ninja: ninja) + |> render(:show, %{ninja: ninja, current_user: conn.assigns.current_user}) end end @@ -52,18 +56,18 @@ defmodule BokkenWeb.NinjaController do conn |> put_status(:created) |> put_resp_header("location", ~p"/api/ninjas/#{ninja}") - |> render(:show, ninja: ninja) + |> render(:show, %{ninja: ninja, current_user: conn.assigns.current_user}) end end def show(conn, %{"id" => id}) do ninja = Accounts.get_ninja!(id, [:skills]) - render(conn, :show, ninja: ninja) + render(conn, :show, %{ninja: ninja, current_user: conn.assigns.current_user}) end def show(conn, %{"discord_id" => discord_id}) do with {:ok, %Ninja{} = ninja} <- Accounts.get_ninja_by_discord(discord_id) do - render(conn, :show, ninja: ninja) + render(conn, :show, %{ninja: ninja, current_user: conn.assigns.current_user}) end end @@ -72,14 +76,14 @@ defmodule BokkenWeb.NinjaController do ninja = Accounts.get_ninja!(id) with {:ok, %Ninja{} = ninja} <- Accounts.update_ninja(ninja, ninja_params) do - render(conn, :show, ninja: ninja) + render(conn, :show, %{ninja: ninja, current_user: conn.assigns.current_user}) end end def update(conn, %{"discord_id" => discord_id, "ninja" => ninja_params}) do with {:ok, %Ninja{} = ninja} <- Accounts.get_ninja_by_discord(discord_id), {:ok, %Ninja{} = ninja} <- Accounts.update_ninja(ninja, ninja_params) do - render(conn, :show, ninja: ninja) + render(conn, :show, %{ninja: ninja, current_user: conn.assigns.current_user}) end end diff --git a/lib/bokken_web/controllers/ninja/ninja_json.ex b/lib/bokken_web/controllers/ninja/ninja_json.ex index 5a55911b..933181a1 100644 --- a/lib/bokken_web/controllers/ninja/ninja_json.ex +++ b/lib/bokken_web/controllers/ninja/ninja_json.ex @@ -2,21 +2,15 @@ defmodule BokkenWeb.NinjaJSON do alias Bokken.Uploaders.Avatar alias BokkenWeb.SkillJSON - def index(%{ninjas: ninjas}) do - %{data: for(ninja <- ninjas, do: data(ninja))} + def index(%{ninjas: ninjas, current_user: current_user}) do + %{data: for(ninja <- ninjas, do: data(ninja, current_user))} end - def show(%{ninja: ninja}) do - %{data: data(ninja)} + def show(%{ninja: ninja, current_user: current_user}) do + %{data: data(ninja, current_user)} end - def ninja(%{ninja: ninja, current_user: current_user}) do - data(ninja) - |> Map.merge(personal(ninja, current_user)) - |> Map.merge(sensitive(ninja, current_user)) - end - - def data(ninja) do + def data(ninja, current_user) do %{ id: ninja.id, photo: Avatar.url({ninja.photo, ninja}, :thumb), @@ -25,14 +19,15 @@ defmodule BokkenWeb.NinjaJSON do belt: ninja.belt, socials: ninja.socials, since: ninja.inserted_at, - birthday: ninja.birthday, guardian_id: ninja.guardian_id } + |> Map.merge(personal(ninja, current_user)) + |> Map.merge(sensitive(ninja, current_user)) |> Map.merge(skills(ninja)) end defp personal(ninja, current_user) - when current_user.role == :organizer or current_user.id == ninja.id do + when current_user.role in [:organizer, :guardian] or current_user.id == ninja.id do %{ birthday: ninja.birthday } diff --git a/lib/bokken_web/views/auth_view.ex b/lib/bokken_web/views/auth_view.ex index 56b7d32e..5a3ee124 100644 --- a/lib/bokken_web/views/auth_view.ex +++ b/lib/bokken_web/views/auth_view.ex @@ -24,7 +24,7 @@ defmodule BokkenWeb.AuthView do end def render("me.json", %{user: %{role: :ninja, ninja: ninja} = user}) do - NinjaJSON.ninja(%{ninja: ninja, current_user: user}) + NinjaJSON.data(ninja, user) |> Map.merge(render_one(user, AuthView, "user.json")) |> Map.put(:ninja_id, ninja.id) end diff --git a/lib/bokken_web/views/enrollment_view.ex b/lib/bokken_web/views/enrollment_view.ex index 919492ed..a328b447 100644 --- a/lib/bokken_web/views/enrollment_view.ex +++ b/lib/bokken_web/views/enrollment_view.ex @@ -39,7 +39,7 @@ defmodule BokkenWeb.EnrollmentView do defp ninja(enrollment, current_user) do if Ecto.assoc_loaded?(enrollment.ninja) do - %{ninja: NinjaJSON.ninja(%{ninja: enrollment.ninja, current_user: current_user})} + %{ninja: NinjaJSON.show(%{ninja: enrollment.ninja, current_user: current_user})} else %{ninja_id: enrollment.ninja_id} end diff --git a/lib/bokken_web/views/lecture_view.ex b/lib/bokken_web/views/lecture_view.ex index a2324756..3522b071 100644 --- a/lib/bokken_web/views/lecture_view.ex +++ b/lib/bokken_web/views/lecture_view.ex @@ -35,7 +35,7 @@ defmodule BokkenWeb.LectureView do defp ninja(lecture, current_user) do if Ecto.assoc_loaded?(lecture.ninja) do - %{ninja: NinjaJSON.ninja(%{ninja: lecture.ninja, current_user: current_user})} + %{ninja: NinjaJSON.show(%{ninja: lecture.ninja, current_user: current_user})} else %{ninja_id: lecture.ninja_id} end diff --git a/test/bokken_web/controllers/ninja_json_test.exs b/test/bokken_web/controllers/ninja_json_test.exs index fed9449a..9bc51376 100644 --- a/test/bokken_web/controllers/ninja_json_test.exs +++ b/test/bokken_web/controllers/ninja_json_test.exs @@ -5,38 +5,73 @@ defmodule Bokken.NinjaJSONTest do alias Bokken.Uploaders.Avatar alias BokkenWeb.NinjaJSON - test "data" do - ninja = build(:ninja) - rendered_ninja = NinjaJSON.data(ninja) - - assert rendered_ninja == %{ - id: ninja.id, - photo: Avatar.url({ninja.photo, ninja}), - first_name: ninja.first_name, - last_name: ninja.last_name, - belt: ninja.belt, - socials: ninja.socials, - since: ninja.inserted_at, - birthday: ninja.birthday, - guardian_id: ninja.guardian_id - } - end + describe "login as guardian" do + setup do + user = build(:user, role: :guardian) + guardian = build(:guardian, user: user) + ninja = build(:ninja, guardian: guardian) + {:ok, ninja: ninja, current_user: user} + end + + test "show", %{ninja: ninja, current_user: user} do + rendered_ninja = NinjaJSON.show(%{ninja: ninja, current_user: user}) + + assert rendered_ninja == + %{ + data: %{ + id: ninja.id, + photo: Avatar.url({ninja.photo, ninja}), + first_name: ninja.first_name, + last_name: ninja.last_name, + belt: ninja.belt, + socials: ninja.socials, + since: ninja.inserted_at, + birthday: ninja.birthday, + guardian_id: ninja.guardian_id + } + } + end - test "show" do - ninja = build(:ninja) - rendered_ninja = NinjaJSON.show(%{ninja: ninja}) + test "index", %{ninja: ninja, current_user: user} do + ninjas = build_list(5, :ninja, guardian: ninja.guardian) + rendered_ninjas = NinjaJSON.index(%{ninjas: ninjas, current_user: user}) - assert rendered_ninja == %{ - data: NinjaJSON.data(ninja) - } + assert 5 == Enum.count(rendered_ninjas[:data]) + end end - test "index" do - ninjas = build_list(5, :ninja) - rendered_ninjas = NinjaJSON.index(%{ninjas: ninjas}) + describe "login as mentor" do + setup do + user = build(:user, role: :mentor) + ninja = build(:ninja) + {:ok, ninja: ninja, current_user: user} + end + + test "show", %{ninja: ninja, current_user: user} do + rendered_ninja = NinjaJSON.show(%{ninja: ninja, current_user: user}) + + assert rendered_ninja == + %{ + data: %{ + id: ninja.id, + photo: Avatar.url({ninja.photo, ninja}), + first_name: ninja.first_name, + last_name: ninja.last_name, + belt: ninja.belt, + socials: ninja.socials, + since: ninja.inserted_at, + birthday: ninja.birthday, + notes: nil, + guardian_id: ninja.guardian_id + } + } + end + + test "index", %{ninja: ninja, current_user: user} do + ninjas = build_list(5, :ninja, guardian: ninja.guardian) + rendered_ninjas = NinjaJSON.index(%{ninjas: ninjas, current_user: user}) - assert rendered_ninjas == %{ - data: Enum.map(ninjas, &NinjaJSON.data(&1)) - } + assert 5 == Enum.count(rendered_ninjas[:data]) + end end end From e46c5db0b4e06be414d3e37ce7360887dd86babe Mon Sep 17 00:00:00 2001 From: daniel_sp Date: Mon, 8 Jan 2024 15:23:52 +0000 Subject: [PATCH 3/5] fix: ninja rendering bug --- .../controllers/ninja/ninja_controller.ex | 9 +++++---- .../controllers/ninja/ninja_json.ex | 4 +++- .../controllers/ninja_json_test.exs | 20 +++++++++---------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/lib/bokken_web/controllers/ninja/ninja_controller.ex b/lib/bokken_web/controllers/ninja/ninja_controller.ex index 23b86550..be7cd3c9 100644 --- a/lib/bokken_web/controllers/ninja/ninja_controller.ex +++ b/lib/bokken_web/controllers/ninja/ninja_controller.ex @@ -17,13 +17,14 @@ defmodule BokkenWeb.NinjaController do render(conn, :index, %{ninjas: ninjas, current_user: conn.assigns.current_user}) end - def index(conn, _params) when is_guardian(conn) or is_organizer(conn) do - guardian_id = conn.assigns.current_user.guardian.id + def index(conn, _params) when is_guardian(conn) do + current_user = Accounts.get_user!(conn.assigns.current_user.id, [:guardian]) + guardian_id = current_user.guardian.id guardian = Accounts.get_guardian!(guardian_id, [:ninjas]) render(conn, :index, %{ ninjas: guardian.ninjas, - current_user: conn.assigns.current_user + current_user: current_user }) end @@ -61,7 +62,7 @@ defmodule BokkenWeb.NinjaController do end def show(conn, %{"id" => id}) do - ninja = Accounts.get_ninja!(id, [:skills]) + ninja = Accounts.get_ninja!(id, [:skills, :guardian]) render(conn, :show, %{ninja: ninja, current_user: conn.assigns.current_user}) end diff --git a/lib/bokken_web/controllers/ninja/ninja_json.ex b/lib/bokken_web/controllers/ninja/ninja_json.ex index 933181a1..90bcdf47 100644 --- a/lib/bokken_web/controllers/ninja/ninja_json.ex +++ b/lib/bokken_web/controllers/ninja/ninja_json.ex @@ -27,7 +27,9 @@ defmodule BokkenWeb.NinjaJSON do end defp personal(ninja, current_user) - when current_user.role in [:organizer, :guardian] or current_user.id == ninja.id do + when current_user.role == :organizer or + current_user.guardian.id == ninja.guardian.id or + current_user.id == ninja.id do %{ birthday: ninja.birthday } diff --git a/test/bokken_web/controllers/ninja_json_test.exs b/test/bokken_web/controllers/ninja_json_test.exs index 9bc51376..7e86e155 100644 --- a/test/bokken_web/controllers/ninja_json_test.exs +++ b/test/bokken_web/controllers/ninja_json_test.exs @@ -5,11 +5,12 @@ defmodule Bokken.NinjaJSONTest do alias Bokken.Uploaders.Avatar alias BokkenWeb.NinjaJSON - describe "login as guardian" do + describe "render as guardian" do setup do - user = build(:user, role: :guardian) - guardian = build(:guardian, user: user) - ninja = build(:ninja, guardian: guardian) + guardian = insert(:guardian) + user = insert(:user, role: :guardian, guardian: guardian) + ninja = insert(:ninja, guardian: guardian) + {:ok, ninja: ninja, current_user: user} end @@ -33,17 +34,17 @@ defmodule Bokken.NinjaJSONTest do end test "index", %{ninja: ninja, current_user: user} do - ninjas = build_list(5, :ninja, guardian: ninja.guardian) + ninjas = insert_list(5, :ninja, guardian: ninja.guardian) rendered_ninjas = NinjaJSON.index(%{ninjas: ninjas, current_user: user}) assert 5 == Enum.count(rendered_ninjas[:data]) end end - describe "login as mentor" do + describe "render as mentor" do setup do - user = build(:user, role: :mentor) - ninja = build(:ninja) + user = insert(:user, role: :mentor) + ninja = insert(:ninja) {:ok, ninja: ninja, current_user: user} end @@ -60,7 +61,6 @@ defmodule Bokken.NinjaJSONTest do belt: ninja.belt, socials: ninja.socials, since: ninja.inserted_at, - birthday: ninja.birthday, notes: nil, guardian_id: ninja.guardian_id } @@ -68,7 +68,7 @@ defmodule Bokken.NinjaJSONTest do end test "index", %{ninja: ninja, current_user: user} do - ninjas = build_list(5, :ninja, guardian: ninja.guardian) + ninjas = insert_list(5, :ninja, guardian: ninja.guardian) rendered_ninjas = NinjaJSON.index(%{ninjas: ninjas, current_user: user}) assert 5 == Enum.count(rendered_ninjas[:data]) From 52510f8bdb58db77397e9e5718e6c72cb127da3d Mon Sep 17 00:00:00 2001 From: daniel_sp Date: Thu, 11 Jan 2024 18:03:51 +0000 Subject: [PATCH 4/5] feat: complement ninja_json_test --- lib/bokken/guards.ex | 14 ++++ .../controllers/ninja/ninja_json.ex | 6 +- .../controllers/ninja_json_test.exs | 69 +++++++++++++++++++ 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/lib/bokken/guards.ex b/lib/bokken/guards.ex index 189eff5f..57477e27 100644 --- a/lib/bokken/guards.ex +++ b/lib/bokken/guards.ex @@ -18,6 +18,20 @@ defmodule Bokken.Guards do defguard is_guardian(conn) when conn.assigns.current_user.role === :guardian defguard is_registered(conn) when conn.assigns.current_user.registered + @doc """ + Defines the way to proceed in specific roles situations. + + ## Examples + + defguard is_ninja_guardian(user, ninja) when user.role == :guardian and user.guardian.id == ninja.guardian.id + Means to return True when a user is the ninja's guardian. + + """ + defguard is_ninja_guardian(user, ninja) + when user.role == :guardian and user.guardian.id == ninja.guardian.id + + defguard is_ninja_user(user, ninja) when user.role == :ninja and user.id == ninja.user_id + @doc """ Defines the way to proceed in specific error situations. diff --git a/lib/bokken_web/controllers/ninja/ninja_json.ex b/lib/bokken_web/controllers/ninja/ninja_json.ex index 90bcdf47..f1eaea38 100644 --- a/lib/bokken_web/controllers/ninja/ninja_json.ex +++ b/lib/bokken_web/controllers/ninja/ninja_json.ex @@ -2,6 +2,8 @@ defmodule BokkenWeb.NinjaJSON do alias Bokken.Uploaders.Avatar alias BokkenWeb.SkillJSON + import Bokken.Guards, only: [is_ninja_guardian: 2, is_ninja_user: 2] + def index(%{ninjas: ninjas, current_user: current_user}) do %{data: for(ninja <- ninjas, do: data(ninja, current_user))} end @@ -28,8 +30,8 @@ defmodule BokkenWeb.NinjaJSON do defp personal(ninja, current_user) when current_user.role == :organizer or - current_user.guardian.id == ninja.guardian.id or - current_user.id == ninja.id do + is_ninja_guardian(current_user, ninja) or + is_ninja_user(current_user, ninja) do %{ birthday: ninja.birthday } diff --git a/test/bokken_web/controllers/ninja_json_test.exs b/test/bokken_web/controllers/ninja_json_test.exs index 7e86e155..8afd90c8 100644 --- a/test/bokken_web/controllers/ninja_json_test.exs +++ b/test/bokken_web/controllers/ninja_json_test.exs @@ -41,6 +41,41 @@ defmodule Bokken.NinjaJSONTest do end end + describe "render as not ninja's guardian" do + setup do + guardian = insert(:guardian) + user = insert(:user, role: :guardian) + ninja = insert(:ninja, guardian: guardian) + + {:ok, ninja: ninja, current_user: user} + end + + test "show", %{ninja: ninja, current_user: user} do + rendered_ninja = NinjaJSON.show(%{ninja: ninja, current_user: user}) + + assert rendered_ninja == + %{ + data: %{ + id: ninja.id, + photo: Avatar.url({ninja.photo, ninja}), + first_name: ninja.first_name, + last_name: ninja.last_name, + belt: ninja.belt, + socials: ninja.socials, + since: ninja.inserted_at, + guardian_id: ninja.guardian_id + } + } + end + + test "index", %{ninja: ninja, current_user: user} do + ninjas = insert_list(5, :ninja, guardian: ninja.guardian) + rendered_ninjas = NinjaJSON.index(%{ninjas: ninjas, current_user: user}) + + assert 5 == Enum.count(rendered_ninjas[:data]) + end + end + describe "render as mentor" do setup do user = insert(:user, role: :mentor) @@ -74,4 +109,38 @@ defmodule Bokken.NinjaJSONTest do assert 5 == Enum.count(rendered_ninjas[:data]) end end + + describe "render as ninja" do + setup do + user = insert(:user, role: :ninja) + ninja = insert(:ninja, user: user) + {:ok, ninja: ninja, current_user: user} + end + + test "show", %{ninja: ninja, current_user: user} do + rendered_ninja = NinjaJSON.show(%{ninja: ninja, current_user: user}) + + assert rendered_ninja == + %{ + data: %{ + id: ninja.id, + photo: Avatar.url({ninja.photo, ninja}), + first_name: ninja.first_name, + last_name: ninja.last_name, + belt: ninja.belt, + socials: ninja.socials, + since: ninja.inserted_at, + birthday: ninja.birthday, + guardian_id: ninja.guardian_id + } + } + end + + test "index", %{ninja: ninja, current_user: user} do + ninjas = insert_list(5, :ninja, guardian: ninja.guardian) + rendered_ninjas = NinjaJSON.index(%{ninjas: ninjas, current_user: user}) + + assert 5 == Enum.count(rendered_ninjas[:data]) + end + end end From 4e102a177791d7161cb620c99608ecf99cd0e3e1 Mon Sep 17 00:00:00 2001 From: daniel_sp Date: Thu, 11 Jan 2024 18:22:37 +0000 Subject: [PATCH 5/5] fix: change view functions to NinjaJSON.data --- lib/bokken_web/views/enrollment_view.ex | 2 +- lib/bokken_web/views/lecture_view.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/bokken_web/views/enrollment_view.ex b/lib/bokken_web/views/enrollment_view.ex index a328b447..b571ee28 100644 --- a/lib/bokken_web/views/enrollment_view.ex +++ b/lib/bokken_web/views/enrollment_view.ex @@ -39,7 +39,7 @@ defmodule BokkenWeb.EnrollmentView do defp ninja(enrollment, current_user) do if Ecto.assoc_loaded?(enrollment.ninja) do - %{ninja: NinjaJSON.show(%{ninja: enrollment.ninja, current_user: current_user})} + %{ninja: NinjaJSON.data(enrollment.ninja, current_user)} else %{ninja_id: enrollment.ninja_id} end diff --git a/lib/bokken_web/views/lecture_view.ex b/lib/bokken_web/views/lecture_view.ex index 3522b071..82123371 100644 --- a/lib/bokken_web/views/lecture_view.ex +++ b/lib/bokken_web/views/lecture_view.ex @@ -35,7 +35,7 @@ defmodule BokkenWeb.LectureView do defp ninja(lecture, current_user) do if Ecto.assoc_loaded?(lecture.ninja) do - %{ninja: NinjaJSON.show(%{ninja: lecture.ninja, current_user: current_user})} + %{ninja: NinjaJSON.data(lecture.ninja, current_user)} else %{ninja_id: lecture.ninja_id} end