- harden ammo context
- add user_id to ammo types
This commit is contained in:
		| @@ -4,32 +4,38 @@ defmodule CanneryWeb.AmmoGroupLive.FormComponent do | ||||
|   """ | ||||
|  | ||||
|   use CanneryWeb, :live_component | ||||
|  | ||||
|   alias Cannery.{Ammo, Containers} | ||||
|   alias Cannery.{Ammo.AmmoType, Containers.Container} | ||||
|   alias Ecto.Changeset | ||||
|  | ||||
|   @impl true | ||||
|   def update(%{ammo_group: ammo_group} = assigns, socket) do | ||||
|     socket = socket |> assign(assigns) | ||||
|   def update(%{ammo_group: _ammo_group} = assigns, socket) do | ||||
|     socket |> assign(assigns) |> update() | ||||
|   end | ||||
|  | ||||
|   def update(%{assigns: %{ammo_group: ammo_group, current_user: current_user}} = socket) do | ||||
|     changeset = Ammo.change_ammo_group(ammo_group) | ||||
|     containers = Containers.list_containers(socket.assigns.current_user) | ||||
|     ammo_types = Ammo.list_ammo_types() | ||||
|  | ||||
|     containers = Containers.list_containers(current_user) | ||||
|     ammo_types = Ammo.list_ammo_types(current_user) | ||||
|     {:ok, socket |> assign(changeset: changeset, containers: containers, ammo_types: ammo_types)} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_event("validate", %{"ammo_group" => ammo_group_params}, socket) do | ||||
|     ammo_group_params = ammo_group_params |> Map.put("user_id", socket.assigns.current_user.id) | ||||
|     changeset = socket.assigns.ammo_group |> Ammo.change_ammo_group(ammo_group_params) | ||||
|     {:noreply, socket |> assign(:changeset, changeset)} | ||||
|   def handle_event( | ||||
|         "validate", | ||||
|         %{"ammo_group" => ammo_group_params}, | ||||
|         %{assigns: %{ammo_group: ammo_group}} = socket | ||||
|       ) do | ||||
|     socket = socket |> assign(:changeset, ammo_group |> Ammo.change_ammo_group(ammo_group_params)) | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   def handle_event("save", %{"ammo_group" => ammo_group_params}, socket) do | ||||
|     ammo_group_params = ammo_group_params |> Map.put("user_id", socket.assigns.current_user.id) | ||||
|     save_ammo_group(socket, socket.assigns.action, ammo_group_params) | ||||
|   def handle_event( | ||||
|         "save", | ||||
|         %{"ammo_group" => ammo_group_params}, | ||||
|         %{assigns: %{action: action}} = socket | ||||
|       ) do | ||||
|     save_ammo_group(socket, action, ammo_group_params) | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
| @@ -99,41 +105,50 @@ defmodule CanneryWeb.AmmoGroupLive.FormComponent do | ||||
|   # HTML Helpers | ||||
|   @spec container_options([Container.t()]) :: [{String.t(), Container.id()}] | ||||
|   defp container_options(containers) do | ||||
|     containers |> Enum.map(fn container -> {container.name, container.id} end) | ||||
|     containers |> Enum.map(fn %{id: id, name: name} -> {name, id} end) | ||||
|   end | ||||
|  | ||||
|   @spec ammo_type_options([AmmoType.t()]) :: [{String.t(), AmmoType.id()}] | ||||
|   defp ammo_type_options(ammo_types) do | ||||
|     ammo_types |> Enum.map(fn ammo_type -> {ammo_type.name, ammo_type.id} end) | ||||
|     ammo_types |> Enum.map(fn %{id: id, name: name} -> {name, id} end) | ||||
|   end | ||||
|  | ||||
|   # Save Helpers | ||||
|  | ||||
|   defp save_ammo_group(socket, :edit, ammo_group_params) do | ||||
|     socket.assigns.ammo_group | ||||
|     |> Ammo.update_ammo_group(ammo_group_params) | ||||
|     |> case do | ||||
|       {:ok, _ammo_group} -> | ||||
|         {:noreply, | ||||
|          socket | ||||
|          |> put_flash(:info, dgettext("prompts", "Ammo group updated successfully")) | ||||
|          |> push_redirect(to: socket.assigns.return_to)} | ||||
|   defp save_ammo_group( | ||||
|          %{assigns: %{ammo_group: ammo_group, current_user: current_user, return_to: return_to}} = | ||||
|            socket, | ||||
|          :edit, | ||||
|          ammo_group_params | ||||
|        ) do | ||||
|     socket = | ||||
|       case Ammo.update_ammo_group(ammo_group, ammo_group_params, current_user) do | ||||
|         {:ok, _ammo_group} -> | ||||
|           prompt = dgettext("prompts", "Ammo group updated successfully") | ||||
|           socket |> put_flash(:info, prompt) |> push_redirect(to: return_to) | ||||
|  | ||||
|       {:error, %Changeset{} = changeset} -> | ||||
|         {:noreply, socket |> assign(:changeset, changeset)} | ||||
|     end | ||||
|         {:error, %Changeset{} = changeset} -> | ||||
|           socket |> assign(:changeset, changeset) | ||||
|       end | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   defp save_ammo_group(socket, :new, ammo_group_params) do | ||||
|     case Ammo.create_ammo_group(ammo_group_params) do | ||||
|       {:ok, _ammo_group} -> | ||||
|         {:noreply, | ||||
|          socket | ||||
|          |> put_flash(:info, dgettext("prompts", "Ammo group created successfully")) | ||||
|          |> push_redirect(to: socket.assigns.return_to)} | ||||
|   defp save_ammo_group( | ||||
|          %{assigns: %{current_user: current_user, return_to: return_to}} = socket, | ||||
|          :new, | ||||
|          ammo_group_params | ||||
|        ) do | ||||
|     socket = | ||||
|       case Ammo.create_ammo_group(ammo_group_params, current_user) do | ||||
|         {:ok, _ammo_group} -> | ||||
|           prompt = dgettext("prompts", "Ammo group created successfully") | ||||
|           socket |> put_flash(:info, prompt) |> push_redirect(to: return_to) | ||||
|  | ||||
|       {:error, %Changeset{} = changeset} -> | ||||
|         {:noreply, socket |> assign(changeset: changeset)} | ||||
|     end | ||||
|         {:error, %Changeset{} = changeset} -> | ||||
|           socket |> assign(changeset: changeset) | ||||
|       end | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -4,7 +4,6 @@ defmodule CanneryWeb.AmmoGroupLive.Index do | ||||
|   """ | ||||
|  | ||||
|   use CanneryWeb, :live_view | ||||
|  | ||||
|   alias Cannery.Ammo | ||||
|   alias Cannery.Ammo.AmmoGroup | ||||
|  | ||||
| @@ -14,14 +13,14 @@ defmodule CanneryWeb.AmmoGroupLive.Index do | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_params(params, _url, socket) do | ||||
|     {:noreply, apply_action(socket, socket.assigns.live_action, params)} | ||||
|   def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do | ||||
|     {:noreply, apply_action(socket, live_action, params)} | ||||
|   end | ||||
|  | ||||
|   defp apply_action(socket, :edit, %{"id" => id}) do | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do | ||||
|     socket | ||||
|     |> assign(:page_title, gettext("Edit Ammo group")) | ||||
|     |> assign(:ammo_group, Ammo.get_ammo_group!(id)) | ||||
|     |> assign(:ammo_group, Ammo.get_ammo_group!(id, current_user)) | ||||
|   end | ||||
|  | ||||
|   defp apply_action(socket, :new, _params) do | ||||
| @@ -31,19 +30,19 @@ defmodule CanneryWeb.AmmoGroupLive.Index do | ||||
|   end | ||||
|  | ||||
|   defp apply_action(socket, :index, _params) do | ||||
|     socket | ||||
|     |> assign(:page_title, gettext("Listing Ammo groups")) | ||||
|     |> assign(:ammo_group, nil) | ||||
|     socket |> assign(:page_title, gettext("Listing Ammo groups")) |> assign(:ammo_group, nil) | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_event("delete", %{"id" => id}, socket) do | ||||
|     Ammo.get_ammo_group!(id) |> Ammo.delete_ammo_group!() | ||||
|     {:noreply, socket |> display_ammo_groups()} | ||||
|   def handle_event("delete", %{"id" => id}, %{assigns: %{current_user: current_user}} = socket) do | ||||
|     Ammo.get_ammo_group!(id, current_user) |> Ammo.delete_ammo_group!(current_user) | ||||
|  | ||||
|     prompt = dgettext("prompts", "Ammo group deleted succesfully") | ||||
|  | ||||
|     {:noreply, socket |> put_flash(:info, prompt) |> display_ammo_groups()} | ||||
|   end | ||||
|  | ||||
|   defp display_ammo_groups(%{assigns: %{current_user: current_user}} = socket) do | ||||
|     ammo_groups = Ammo.list_ammo_groups(current_user) | ||||
|     socket |> assign(:ammo_groups, ammo_groups) | ||||
|     socket |> assign(:ammo_groups, Ammo.list_ammo_groups(current_user)) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -9,27 +9,31 @@ defmodule CanneryWeb.AmmoGroupLive.Show do | ||||
|  | ||||
|   @impl true | ||||
|   def mount(_params, session, socket) do | ||||
|     socket = socket |> assign_defaults(session) | ||||
|  | ||||
|     {:ok, socket} | ||||
|     {:ok, socket |> assign_defaults(session)} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_params(%{"id" => id}, _, socket) do | ||||
|     socket = | ||||
|       socket | ||||
|       |> assign( | ||||
|         page_title: page_title(socket.assigns.live_action), | ||||
|         ammo_group: Ammo.get_ammo_group!(id) |> Repo.preload([:container, :ammo_type]) | ||||
|       ) | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   def handle_params( | ||||
|         %{"id" => id}, | ||||
|         _, | ||||
|         %{assigns: %{live_action: live_action, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     ammo_group = Ammo.get_ammo_group!(id, current_user) |> Repo.preload([:container, :ammo_type]) | ||||
|     {:noreply, socket |> assign(page_title: page_title(live_action), ammo_group: ammo_group)} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_event("delete", _, socket) do | ||||
|     socket.assigns.ammo_group |> Ammo.delete_ammo_group!() | ||||
|     {:noreply, socket |> push_redirect(to: Routes.ammo_group_index_path(socket, :index))} | ||||
|   def handle_event( | ||||
|         "delete", | ||||
|         _, | ||||
|         %{assigns: %{ammo_group: ammo_group, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     ammo_group |> Ammo.delete_ammo_group!(current_user) | ||||
|  | ||||
|     prompt = dgettext("prompts", "Ammo group deleted succesfully") | ||||
|     redirect_to = Routes.ammo_group_index_path(socket, :index) | ||||
|  | ||||
|     {:noreply, socket |> put_flash(:info, prompt) |> push_redirect(to: redirect_to)} | ||||
|   end | ||||
|  | ||||
|   defp page_title(:show), do: gettext("Show Ammo group") | ||||
|   | ||||
| @@ -4,28 +4,29 @@ defmodule CanneryWeb.AmmoTypeLive.FormComponent do | ||||
|   """ | ||||
|  | ||||
|   use CanneryWeb, :live_component | ||||
|  | ||||
|   alias Cannery.Ammo | ||||
|   alias Ecto.Changeset | ||||
|  | ||||
|   @impl true | ||||
|   def update(%{ammo_type: ammo_type} = assigns, socket) do | ||||
|     changeset = Ammo.change_ammo_type(ammo_type) | ||||
|  | ||||
|     {:ok, | ||||
|      socket | ||||
|      |> assign(assigns) | ||||
|      |> assign(:changeset, changeset)} | ||||
|     {:ok, socket |> assign(assigns) |> assign(:changeset, Ammo.change_ammo_type(ammo_type))} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_event("validate", %{"ammo_type" => ammo_type_params}, socket) do | ||||
|     changeset = socket.assigns.ammo_type |> Ammo.change_ammo_type(ammo_type_params) | ||||
|     {:noreply, socket |> assign(:changeset, changeset)} | ||||
|   def handle_event( | ||||
|         "validate", | ||||
|         %{"ammo_type" => ammo_type_params}, | ||||
|         %{assigns: %{ammo_type: ammo_type}} = socket | ||||
|       ) do | ||||
|     {:noreply, socket |> assign(:changeset, ammo_type |> Ammo.change_ammo_type(ammo_type_params))} | ||||
|   end | ||||
|  | ||||
|   def handle_event("save", %{"ammo_type" => ammo_type_params}, socket) do | ||||
|     save_ammo_type(socket, socket.assigns.action, ammo_type_params) | ||||
|   def handle_event( | ||||
|         "save", | ||||
|         %{"ammo_type" => ammo_type_params}, | ||||
|         %{assigns: %{action: action}} = socket | ||||
|       ) do | ||||
|     save_ammo_type(socket, action, ammo_type_params) | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
| @@ -161,29 +162,36 @@ defmodule CanneryWeb.AmmoTypeLive.FormComponent do | ||||
|     """ | ||||
|   end | ||||
|  | ||||
|   defp save_ammo_type(socket, :edit, ammo_type_params) do | ||||
|     case Ammo.update_ammo_type(socket.assigns.ammo_type, ammo_type_params) do | ||||
|       {:ok, _ammo_type} -> | ||||
|         {:noreply, | ||||
|          socket | ||||
|          |> put_flash(:info, dgettext("prompts", "Ammo type updated successfully")) | ||||
|          |> push_redirect(to: socket.assigns.return_to)} | ||||
|   defp save_ammo_type( | ||||
|          %{assigns: %{ammo_type: ammo_type, current_user: current_user, return_to: return_to}} = | ||||
|            socket, | ||||
|          :edit, | ||||
|          ammo_type_params | ||||
|        ) do | ||||
|     socket = | ||||
|       case Ammo.update_ammo_type(ammo_type, ammo_type_params, current_user) do | ||||
|         {:ok, %{name: ammo_type_name}} -> | ||||
|           prompt = dgettext("prompts", "%{name} updated successfully", name: ammo_type_name) | ||||
|           socket |> put_flash(:info, prompt) |> push_redirect(to: return_to) | ||||
|  | ||||
|       {:error, %Changeset{} = changeset} -> | ||||
|         {:noreply, socket |> assign(:changeset, changeset)} | ||||
|     end | ||||
|         {:error, %Changeset{} = changeset} -> | ||||
|           socket |> assign(:changeset, changeset) | ||||
|       end | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   defp save_ammo_type(socket, :new, ammo_type_params) do | ||||
|     case Ammo.create_ammo_type(ammo_type_params) do | ||||
|       {:ok, _ammo_type} -> | ||||
|         {:noreply, | ||||
|          socket | ||||
|          |> put_flash(:info, dgettext("prompts", "Ammo type created successfully")) | ||||
|          |> push_redirect(to: socket.assigns.return_to)} | ||||
|   defp save_ammo_type(%{assigns: %{return_to: return_to}} = socket, :new, ammo_type_params) do | ||||
|     socket = | ||||
|       case Ammo.create_ammo_type(ammo_type_params) do | ||||
|         {:ok, %{name: ammo_type_name}} -> | ||||
|           prompt = dgettext("prompts", "%{name} created successfully", name: ammo_type_name) | ||||
|           socket |> put_flash(:info, prompt) |> push_redirect(to: return_to) | ||||
|  | ||||
|       {:error, %Changeset{} = changeset} -> | ||||
|         {:noreply, socket |> assign(changeset: changeset)} | ||||
|     end | ||||
|         {:error, %Changeset{} = changeset} -> | ||||
|           socket |> assign(changeset: changeset) | ||||
|       end | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -10,18 +10,18 @@ defmodule CanneryWeb.AmmoTypeLive.Index do | ||||
|  | ||||
|   @impl true | ||||
|   def mount(_params, session, socket) do | ||||
|     {:ok, socket |> assign_defaults(session) |> assign(:ammo_types, list_ammo_types())} | ||||
|     {:ok, socket |> assign_defaults(session) |> list_ammo_types()} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_params(params, _url, socket) do | ||||
|     {:noreply, apply_action(socket, socket.assigns.live_action, params)} | ||||
|   def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do | ||||
|     {:noreply, apply_action(socket, live_action, params)} | ||||
|   end | ||||
|  | ||||
|   defp apply_action(socket, :edit, %{"id" => id}) do | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do | ||||
|     socket | ||||
|     |> assign(:page_title, gettext("Edit Ammo type")) | ||||
|     |> assign(:ammo_type, Ammo.get_ammo_type!(id)) | ||||
|     |> assign(:ammo_type, Ammo.get_ammo_type!(id, current_user)) | ||||
|   end | ||||
|  | ||||
|   defp apply_action(socket, :new, _params) do | ||||
| @@ -31,20 +31,19 @@ defmodule CanneryWeb.AmmoTypeLive.Index do | ||||
|   end | ||||
|  | ||||
|   defp apply_action(socket, :index, _params) do | ||||
|     socket | ||||
|     |> assign(:page_title, gettext("Listing Ammo types")) | ||||
|     |> assign(:ammo_type, nil) | ||||
|     socket |> assign(:page_title, gettext("Listing Ammo types")) |> assign(:ammo_type, nil) | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_event("delete", %{"id" => id}, socket) do | ||||
|     ammo_type = Ammo.get_ammo_type!(id) | ||||
|     {:ok, _} = Ammo.delete_ammo_type(ammo_type) | ||||
|   def handle_event("delete", %{"id" => id}, %{assigns: %{current_user: current_user}} = socket) do | ||||
|     %{name: name} = Ammo.get_ammo_type!(id, current_user) |> Ammo.delete_ammo_type!(current_user) | ||||
|  | ||||
|     {:noreply, socket |> assign(:ammo_types, list_ammo_types())} | ||||
|     prompt = dgettext("prompts", "%{name} deleted succesfully", name: name) | ||||
|  | ||||
|     {:noreply, socket |> put_flash(:info, prompt) |> list_ammo_types()} | ||||
|   end | ||||
|  | ||||
|   defp list_ammo_types do | ||||
|     Ammo.list_ammo_types() | ||||
|   defp list_ammo_types(%{assigns: %{current_user: current_user}} = socket) do | ||||
|     socket |> assign(:ammo_types, Ammo.list_ammo_types(current_user)) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -14,25 +14,32 @@ defmodule CanneryWeb.AmmoTypeLive.Show do | ||||
|  | ||||
|   @impl true | ||||
|   def handle_params(%{"id" => id}, _, %{assigns: %{current_user: current_user}} = socket) do | ||||
|     ammo_type = Ammo.get_ammo_type!(id) | ||||
|     ammo_groups = ammo_type |> Ammo.list_ammo_groups_for_type(current_user) | ||||
|     ammo_type = Ammo.get_ammo_type!(id, current_user) | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
|       |> assign( | ||||
|         page_title: page_title(socket.assigns.live_action), | ||||
|         ammo_type: ammo_type, | ||||
|         ammo_groups: ammo_groups, | ||||
|         avg_cost_per_round: ammo_type |> Ammo.get_average_cost_for_ammo_type!() | ||||
|         ammo_groups: ammo_type |> Ammo.list_ammo_groups_for_type(current_user), | ||||
|         avg_cost_per_round: ammo_type |> Ammo.get_average_cost_for_ammo_type!(current_user) | ||||
|       ) | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_event("delete", _, socket) do | ||||
|     socket.assigns.ammo_type |> Ammo.delete_ammo_type!() | ||||
|     {:noreply, socket |> push_redirect(to: Routes.ammo_type_index_path(socket, :index))} | ||||
|   def handle_event( | ||||
|         "delete", | ||||
|         _, | ||||
|         %{assigns: %{ammo_type: ammo_type, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     %{name: ammo_type_name} = ammo_type |> Ammo.delete_ammo_type!(current_user) | ||||
|  | ||||
|     prompt = dgettext("prompts", "%{name} deleted succesfully", name: ammo_type_name) | ||||
|     redirect_to = Routes.ammo_type_index_path(socket, :index) | ||||
|  | ||||
|     {:noreply, socket |> put_flash(:info, prompt) |> push_redirect(to: redirect_to)} | ||||
|   end | ||||
|  | ||||
|   defp page_title(:show), do: gettext("Show Ammo type") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user