From b3eae2ca17792b7c6d285dfb7b8af8041d5a8a0f Mon Sep 17 00:00:00 2001 From: Afonso Santos <113265283+Afonso-santos@users.noreply.github.com> Date: Wed, 27 Sep 2023 15:00:32 +0100 Subject: [PATCH 1/2] refactor: upgrade ninja and skill controllers to 1.7 (#194) --- .../admin/{ => ninja}/ninja_controller.ex | 6 +- .../admin/ninja/ninja_json.ex} | 10 ++-- .../controllers/{ => file}/file_controller.ex | 0 .../controllers/{ => file}/file_json.ex | 0 .../{ => ninja}/ninja_controller.ex | 24 ++++---- .../controllers/ninja/ninja_json.ex | 57 +++++++++++++++++++ .../{ => skill}/skill_controller.ex | 30 +++++----- .../controllers/skill/skill_json.ex | 21 +++++++ lib/bokken_web/views/skill_view.ex | 25 -------- test/bokken/accounts_test.exs | 7 ++- .../controllers/ninja_json_test.exs | 41 +++++++++++++ .../controllers/skill_json_test.exs | 38 +++++++++++++ 12 files changed, 197 insertions(+), 62 deletions(-) rename lib/bokken_web/controllers/admin/{ => ninja}/ninja_controller.ex (78%) rename lib/bokken_web/{views/admin/ninja_view.ex => controllers/admin/ninja/ninja_json.ex} (74%) rename lib/bokken_web/controllers/{ => file}/file_controller.ex (100%) rename lib/bokken_web/controllers/{ => file}/file_json.ex (100%) rename lib/bokken_web/controllers/{ => ninja}/ninja_controller.ex (82%) create mode 100644 lib/bokken_web/controllers/ninja/ninja_json.ex rename lib/bokken_web/controllers/{ => skill}/skill_controller.ex (83%) create mode 100644 lib/bokken_web/controllers/skill/skill_json.ex delete mode 100644 lib/bokken_web/views/skill_view.ex create mode 100644 test/bokken_web/controllers/ninja_json_test.exs create mode 100644 test/bokken_web/controllers/skill_json_test.exs diff --git a/lib/bokken_web/controllers/admin/ninja_controller.ex b/lib/bokken_web/controllers/admin/ninja/ninja_controller.ex similarity index 78% rename from lib/bokken_web/controllers/admin/ninja_controller.ex rename to lib/bokken_web/controllers/admin/ninja/ninja_controller.ex index ccbde594..71bfe9ae 100644 --- a/lib/bokken_web/controllers/admin/ninja_controller.ex +++ b/lib/bokken_web/controllers/admin/ninja/ninja_controller.ex @@ -1,5 +1,5 @@ defmodule BokkenWeb.Admin.NinjaController do - use BokkenWeb, controller: "1.6" + use BokkenWeb, :controller alias Bokken.Accounts alias Bokken.Accounts.Ninja @@ -8,14 +8,14 @@ defmodule BokkenWeb.Admin.NinjaController do def index(conn, _params) do ninjas = Accounts.list_ninjas([:guardian]) - render(conn, "index.json", ninjas: ninjas) + render(conn, :index, ninjas: ninjas) end def update(conn, %{"id" => id, "ninja" => ninja_params}) when is_organizer(conn) do ninja = Accounts.get_ninja!(id, [:guardian]) with {:ok, %Ninja{} = ninja} <- Accounts.update_ninja(ninja, ninja_params) do - render(conn, "ninja.json", ninja: ninja) + render(conn, :ninja, ninja: ninja) end end end diff --git a/lib/bokken_web/views/admin/ninja_view.ex b/lib/bokken_web/controllers/admin/ninja/ninja_json.ex similarity index 74% rename from lib/bokken_web/views/admin/ninja_view.ex rename to lib/bokken_web/controllers/admin/ninja/ninja_json.ex index 49e61ee1..76c5d902 100644 --- a/lib/bokken_web/views/admin/ninja_view.ex +++ b/lib/bokken_web/controllers/admin/ninja/ninja_json.ex @@ -1,13 +1,11 @@ -defmodule BokkenWeb.Admin.NinjaView do - use BokkenWeb, :view - +defmodule BokkenWeb.Admin.NinjaJSON do alias Bokken.Uploaders.Avatar - def render("index.json", %{ninjas: ninjas}) do - %{data: render_many(ninjas, __MODULE__, "ninja.json")} + def index(%{ninjas: ninjas}) do + %{data: for(ninja <- ninjas, do: data(ninja))} end - def render("ninja.json", %{ninja: ninja}) do + def data(%{ninja: ninja}) do %{ id: ninja.id, photo: Avatar.url({ninja.photo, ninja}, :thumb), diff --git a/lib/bokken_web/controllers/file_controller.ex b/lib/bokken_web/controllers/file/file_controller.ex similarity index 100% rename from lib/bokken_web/controllers/file_controller.ex rename to lib/bokken_web/controllers/file/file_controller.ex diff --git a/lib/bokken_web/controllers/file_json.ex b/lib/bokken_web/controllers/file/file_json.ex similarity index 100% rename from lib/bokken_web/controllers/file_json.ex rename to lib/bokken_web/controllers/file/file_json.ex diff --git a/lib/bokken_web/controllers/ninja_controller.ex b/lib/bokken_web/controllers/ninja/ninja_controller.ex similarity index 82% rename from lib/bokken_web/controllers/ninja_controller.ex rename to lib/bokken_web/controllers/ninja/ninja_controller.ex index 38711130..e6e3bd78 100644 --- a/lib/bokken_web/controllers/ninja_controller.ex +++ b/lib/bokken_web/controllers/ninja/ninja_controller.ex @@ -1,5 +1,5 @@ defmodule BokkenWeb.NinjaController do - use BokkenWeb, controller: "1.6" + use BokkenWeb, :controller alias Bokken.Accounts alias Bokken.Accounts.Ninja @@ -14,20 +14,20 @@ 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.json", ninjas: ninjas) + render(conn, :index, ninjas: ninjas) 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.json", ninjas: guardian.ninjas) + render(conn, :index, ninjas: guardian.ninjas) 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.json", ninjas: event.ninjas) + render(conn, :index, ninjas: event.ninjas) end end @@ -38,8 +38,8 @@ defmodule BokkenWeb.NinjaController do conn |> put_status(:created) - |> put_resp_header("location", Routes.team_path(conn, :show, ninja)) - |> render("show.json", ninja: ninja) + |> put_resp_header("location", ~p"/api/teams/#{ninja}") + |> render(:show, ninja: ninja) end end @@ -51,19 +51,19 @@ defmodule BokkenWeb.NinjaController do Accounts.create_ninja(Map.put(ninja_params, "guardian_id", guardian_id)) do conn |> put_status(:created) - |> put_resp_header("location", Routes.ninja_path(conn, :show, ninja)) - |> render("show.json", ninja: ninja) + |> put_resp_header("location", ~p"/api/ninjas/#{ninja}") + |> render(:show, ninja: ninja) end end def show(conn, %{"id" => id}) do ninja = Accounts.get_ninja!(id, [:skills]) - render(conn, "show.json", ninja: ninja) + render(conn, :show, ninja: ninja) end def show(conn, %{"discord_id" => discord_id}) do with {:ok, %Ninja{} = ninja} <- Accounts.get_ninja_by_discord(discord_id) do - render(conn, "show.json", ninja: ninja) + render(conn, :show, ninja: ninja) end end @@ -72,14 +72,14 @@ defmodule BokkenWeb.NinjaController do ninja = Accounts.get_ninja!(id) with {:ok, %Ninja{} = ninja} <- Accounts.update_ninja(ninja, ninja_params) do - render(conn, "show.json", ninja: ninja) + render(conn, :show, ninja: ninja) 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.json", ninja: ninja) + render(conn, :show, ninja: ninja) end end diff --git a/lib/bokken_web/controllers/ninja/ninja_json.ex b/lib/bokken_web/controllers/ninja/ninja_json.ex new file mode 100644 index 00000000..80dcb9b4 --- /dev/null +++ b/lib/bokken_web/controllers/ninja/ninja_json.ex @@ -0,0 +1,57 @@ +defmodule BokkenWeb.NinjaJSON do + alias Bokken.Uploaders.Avatar + alias BokkenWeb.SkillJSON + + def index(%{ninjas: ninjas}) do + %{data: for(ninja <- ninjas, do: data(ninja))} + end + + def show(%{ninja: ninja}) do + %{data: data(ninja)} + 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 + %{ + id: ninja.id, + photo: Avatar.url({ninja.photo, ninja}, :thumb), + 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 + } + |> Map.merge(skills(ninja)) + end + + defp personal(ninja, current_user) + when current_user.role == :organizer or current_user.id == ninja.id do + %{ + birthday: ninja.birthday + } + end + + defp personal(_ninja, _current_user), do: %{} + + defp sensitive(ninja, current_user) when current_user.role in [:organizer, :mentor] do + %{ + notes: ninja.notes + } + end + + defp sensitive(_ninja, _current_user), do: %{} + + defp skills(ninja) do + if Ecto.assoc_loaded?(ninja.skills) do + %{skills: for(skill <- ninja.skills, do: SkillJSON.data(skill))} + else + %{} + end + end +end diff --git a/lib/bokken_web/controllers/skill_controller.ex b/lib/bokken_web/controllers/skill/skill_controller.ex similarity index 83% rename from lib/bokken_web/controllers/skill_controller.ex rename to lib/bokken_web/controllers/skill/skill_controller.ex index bf72b4c5..56411069 100644 --- a/lib/bokken_web/controllers/skill_controller.ex +++ b/lib/bokken_web/controllers/skill/skill_controller.ex @@ -1,5 +1,5 @@ defmodule BokkenWeb.SkillController do - use BokkenWeb, controller: "1.6" + use BokkenWeb, :controller alias Bokken.Accounts alias Bokken.Curriculum @@ -9,24 +9,24 @@ defmodule BokkenWeb.SkillController do def index(conn, %{"ninja_id" => _ninja_id} = params) do skills = Curriculum.list_ninja_skills(params) - render(conn, "index.json", skills: skills) + render(conn, :index, skills: skills) end def index(conn, %{"mentor_id" => _mentor_id} = params) do skills = Curriculum.list_mentor_skills(params) - render(conn, "index.json", skills: skills) + render(conn, :index, skills: skills) end def index(conn, _params) do skills = Curriculum.list_skills() - render(conn, "index.json", skills: skills) + render(conn, :index, skills: skills) end def create(conn, %{"skill" => skill_params}) when is_organizer(conn) do with {:ok, %Skill{} = skill} <- Curriculum.create_skill(skill_params) do conn |> put_status(:created) - |> render("show.json", skill: skill) + |> render(:show, skill: skill) end end @@ -39,7 +39,7 @@ defmodule BokkenWeb.SkillController do with {:ok, %NinjaSkill{} = ninja_skill} <- Curriculum.create_ninja_skill(ninja_skill_attrs) do conn |> put_status(:created) - |> render("show.json", skill: skill(ninja_skill)) + |> render(:show, skill: skill(ninja_skill)) end end @@ -54,12 +54,12 @@ defmodule BokkenWeb.SkillController do with {:ok, %NinjaSkill{} = ninja_skill} <- Curriculum.create_ninja_skill(ninja_skill_attrs) do conn |> put_status(:created) - |> render("show.json", skill: skill(ninja_skill)) + |> render(:show, skill: skill(ninja_skill)) end else conn |> put_status(:unauthorized) - |> render("error.json", reason: "You're not the ninja's guardian") + |> render(:error, reason: "You're not the ninja's guardian") end end @@ -73,20 +73,20 @@ defmodule BokkenWeb.SkillController do Curriculum.create_mentor_skill(mentor_skill_attrs) do conn |> put_status(:created) - |> render("show.json", skill: skill(mentor_skill)) + |> render(:show, skill: skill(mentor_skill)) end end def show(conn, %{"id" => id}) do skill = Curriculum.get_skill!(id) - render(conn, "show.json", skill: skill) + render(conn, :show, skill: skill) end def update(conn, %{"id" => id, "skill" => skill_params}) when is_organizer(conn) do skill = Curriculum.get_skill!(id) with {:ok, %Skill{} = skill} <- Curriculum.update_skill(skill, skill_params) do - render(conn, "show.json", skill: skill) + render(conn, :show, skill: skill) end end @@ -113,7 +113,7 @@ defmodule BokkenWeb.SkillController do else conn |> put_status(:not_found) - |> render("error.json", reason: "You don't have that skill") + |> render(:error, reason: "You don't have that skill") end end @@ -132,7 +132,7 @@ defmodule BokkenWeb.SkillController do else conn |> put_status(:not_found) - |> render("error.json", reason: "You don't have that skill") + |> render(:error, reason: "You don't have that skill") end end @@ -150,12 +150,12 @@ defmodule BokkenWeb.SkillController do else conn |> put_status(:not_found) - |> render("error.json", reason: "Ninja doesn't have that skill") + |> render(:error, reason: "Ninja doesn't have that skill") end else conn |> put_status(:unauthorized) - |> render("error.json", reason: "You're not the ninja's guardian") + |> render(:error, reason: "You're not the ninja's guardian") end end diff --git a/lib/bokken_web/controllers/skill/skill_json.ex b/lib/bokken_web/controllers/skill/skill_json.ex new file mode 100644 index 00000000..c0527a0a --- /dev/null +++ b/lib/bokken_web/controllers/skill/skill_json.ex @@ -0,0 +1,21 @@ +defmodule BokkenWeb.SkillJSON do + def index(%{skills: skills}) do + %{data: for(skill <- skills, do: data(%{skill: skill}))} + end + + def show(%{skill: skill}) do + %{data: data(%{skill: skill})} + end + + def error(%{reason: reason}) do + %{error: reason} + end + + def data(%{skill: skill}) do + %{ + id: skill.id, + name: skill.name, + description: skill.description + } + end +end diff --git a/lib/bokken_web/views/skill_view.ex b/lib/bokken_web/views/skill_view.ex deleted file mode 100644 index 66d21371..00000000 --- a/lib/bokken_web/views/skill_view.ex +++ /dev/null @@ -1,25 +0,0 @@ -defmodule BokkenWeb.SkillView do - use BokkenWeb, :view - - alias BokkenWeb.SkillView - - def render("index.json", %{skills: skills}) do - %{data: render_many(skills, SkillView, "skill.json")} - end - - def render("show.json", %{skill: skill}) do - %{data: render_one(skill, SkillView, "skill.json")} - end - - def render("error.json", %{reason: reason}) do - %{error: reason} - end - - def render("skill.json", %{skill: skill}) do - %{ - id: skill.id, - name: skill.name, - description: skill.description - } - end -end diff --git a/test/bokken/accounts_test.exs b/test/bokken/accounts_test.exs index 3954e83a..fe0a5c53 100644 --- a/test/bokken/accounts_test.exs +++ b/test/bokken/accounts_test.exs @@ -27,7 +27,12 @@ defmodule Bokken.AccountsTest do user = insert(:user) attrs = - params_for(:guardian, user_id: user.id, user: user, city: "Braga", mobile: "+351915096743") + params_for(:guardian, + user_id: user.id, + user: user, + city: "Braga", + mobile: "+351915096743" + ) assert {:ok, %Guardian{} = guardian} = Accounts.create_guardian(attrs) assert guardian.city == "Braga" diff --git a/test/bokken_web/controllers/ninja_json_test.exs b/test/bokken_web/controllers/ninja_json_test.exs new file mode 100644 index 00000000..2ae7e248 --- /dev/null +++ b/test/bokken_web/controllers/ninja_json_test.exs @@ -0,0 +1,41 @@ +defmodule Bokken.NinjaJSONTest do + use Bokken.DataCase + + import Bokken.Factory + 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, + guardian_id: ninja.guardian_id + } + end + + test "show" do + ninja = build(:ninja) + rendered_ninja = NinjaJSON.show(%{ninja: ninja}) + + assert rendered_ninja == %{ + data: NinjaJSON.data(ninja) + } + end + + test "index" do + ninjas = build_list(5, :ninja) + rendered_ninjas = NinjaJSON.index(%{ninjas: ninjas}) + + assert rendered_ninjas == %{ + data: Enum.map(ninjas, &NinjaJSON.data(&1)) + } + end +end diff --git a/test/bokken_web/controllers/skill_json_test.exs b/test/bokken_web/controllers/skill_json_test.exs new file mode 100644 index 00000000..494c5355 --- /dev/null +++ b/test/bokken_web/controllers/skill_json_test.exs @@ -0,0 +1,38 @@ +defmodule Bokken.SkillJSONTest do + use Bokken.DataCase + + import Bokken.Factory + + alias BokkenWeb.SkillJSON + + test "data" do + skill = build(:skill) + rendered_skill = SkillJSON.data(%{skill: skill}) + + assert rendered_skill == %{ + id: skill.id, + name: skill.name, + description: skill.description + } + end + + test "show" do + skill = build(:skill) + rendered_skill = SkillJSON.show(%{skill: skill}) + + assert rendered_skill == %{ + data: SkillJSON.data(%{skill: skill}) + } + end + + test "index" do + skills = build_list(5, :skill) + rendered_skills = SkillJSON.index(%{skills: skills}) + + expected_data = Enum.map(skills, &SkillJSON.data(%{skill: &1})) + + assert rendered_skills == %{ + data: expected_data + } + end +end From 89ca96af2ba7bdee74a5762e8d37ed3ad17cce2a Mon Sep 17 00:00:00 2001 From: Rui Lopes Date: Wed, 27 Sep 2023 17:21:11 +0100 Subject: [PATCH 2/2] refactor: remove image pushing to docker hub (#197) --- bin/release | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/bin/release b/bin/release index 96e350e8..b4a414c9 100755 --- a/bin/release +++ b/bin/release @@ -43,7 +43,7 @@ function build_image() { local version local env - env=${1:-stg} + env=${1:-prod} load_env_file ".env.${env}" @@ -56,10 +56,6 @@ function build_image() { docker image prune --force } -function push_image() { - docker push coderdojobraga/bokken --all-tags -} - if [[ "${1:-NOFORCE}" != "--force" ]]; then if [[ $(git branch --show-current) != 'main' ]]; then log_error "You're trying to release from git branch $(git branch --show-current) instead of main." \ @@ -78,4 +74,4 @@ else fi build_image "${1:-prod}" -push_image +