move helpers to shops.ex, update controller
controller now uses helpers from shops.ex (same as live), and no longer has edit/delete/create functionality
This commit is contained in:
		
							parent
							
								
									9e1118868a
								
							
						
					
					
						commit
						c30f6068db
					
				@ -127,4 +127,50 @@ defmodule PokemonCouture.Shops do
 | 
			
		||||
    |> Ecto.Changeset.put_assoc(:users, List.delete(clothes.users, user))
 | 
			
		||||
    |> Repo.update!()
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  Creates a a shop map.
 | 
			
		||||
  %{location -> %{type -> [clothes_of_loc_and_type]}}
 | 
			
		||||
  """
 | 
			
		||||
  def create_shop_map() do
 | 
			
		||||
    Enum.reduce(list_clothes_with_owners(), %{}, &sort_clothes_to_map/2)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp sort_clothes_to_map(clothes, map) do
 | 
			
		||||
    case map[clothes.location] do
 | 
			
		||||
      nil ->
 | 
			
		||||
        Map.put(map, clothes.location, %{clothes.type => [clothes]})
 | 
			
		||||
      map_of_clothes when is_map(map_of_clothes) ->
 | 
			
		||||
        map_of_clothes = case map_of_clothes[clothes.type] do
 | 
			
		||||
          nil ->
 | 
			
		||||
            Map.put(map_of_clothes, clothes.type, [clothes])
 | 
			
		||||
          list_of_clothes when is_list(list_of_clothes) ->
 | 
			
		||||
            Map.put(map_of_clothes, clothes.type, [clothes | list_of_clothes])
 | 
			
		||||
        end
 | 
			
		||||
        Map.put(map, clothes.location, map_of_clothes)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp assign_clothespiece_to_map(clothes, map) do
 | 
			
		||||
    case map[clothes.name] do
 | 
			
		||||
      nil ->
 | 
			
		||||
        Map.put(map, clothes.name, [clothes])
 | 
			
		||||
      list_of_clothes when is_list(list_of_clothes) ->
 | 
			
		||||
        Map.put(map, clothes.name, [clothes | list_of_clothes])
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  Sorts inner maps created with create_shop_map(),
 | 
			
		||||
  putting each in a different map by clothes name, then sorting by game name.
 | 
			
		||||
  Resulting big map: %{location -> %{type -> %{name -> sorted_list_of_clothes}}}
 | 
			
		||||
  """
 | 
			
		||||
  def inner_map_creator({type, list}, acc) do
 | 
			
		||||
    clothes_map = Enum.reduce(list, %{}, &assign_clothespiece_to_map/2)
 | 
			
		||||
    clothes_map = for {shop, map} <- clothes_map
 | 
			
		||||
                   do {shop, Enum.sort_by(map, fn %Clothes{game: game} -> game end)}
 | 
			
		||||
                  end
 | 
			
		||||
    Map.put(acc, type, clothes_map)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -3,71 +3,16 @@ defmodule PokemonCoutureWeb.ClothesController do
 | 
			
		||||
 | 
			
		||||
  alias PokemonCouture.Shops
 | 
			
		||||
 | 
			
		||||
  def create_shop_map(clothes, map) do # helper function for index
 | 
			
		||||
    case map[clothes.location] do
 | 
			
		||||
      nil ->
 | 
			
		||||
        Map.put(map, clothes.location, [clothes])
 | 
			
		||||
      list_of_clothes when is_list(list_of_clothes) ->
 | 
			
		||||
        Map.put(map, clothes.location, list_of_clothes ++ [clothes])
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def index(conn, _params) do
 | 
			
		||||
    clothes = Shops.list_clothes()
 | 
			
		||||
    clothes_map =
 | 
			
		||||
      clothes
 | 
			
		||||
      |> Enum.reduce(%{}, &create_shop_map/2)
 | 
			
		||||
    render(conn, "index.html", clothes: clothes, clothes_map: clothes_map)
 | 
			
		||||
    clothes_map = Shops.create_shop_map()
 | 
			
		||||
    clothes_map = for {shop, map} <- clothes_map
 | 
			
		||||
                    do {shop, Enum.reduce(map, %{}, &Shops.inner_map_creator/2)}
 | 
			
		||||
                  end
 | 
			
		||||
    render(conn, "index.html", clothes_map: clothes_map)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # def new(conn, _params) do
 | 
			
		||||
  #   changeset = Shops.change_clothes(%Clothes{})
 | 
			
		||||
  #   render(conn, "new.html", changeset: changeset)
 | 
			
		||||
  # end
 | 
			
		||||
 | 
			
		||||
  # def create(conn, %{"clothes" => clothes_params}) do
 | 
			
		||||
  #   case Shops.create_clothes(clothes_params) do
 | 
			
		||||
  #     {:ok, clothes} ->
 | 
			
		||||
  #       conn
 | 
			
		||||
  #       |> put_flash(:info, "Clothes created successfully.")
 | 
			
		||||
  #       |> redirect(to: Routes.clothes_path(conn, :show, clothes))
 | 
			
		||||
 | 
			
		||||
  #     {:error, %Ecto.Changeset{} = changeset} ->
 | 
			
		||||
  #       render(conn, "new.html", changeset: changeset)
 | 
			
		||||
  #   end
 | 
			
		||||
  # end
 | 
			
		||||
 | 
			
		||||
  def show(conn, %{"id" => id}) do
 | 
			
		||||
    clothes = Shops.get_clothes!(id)
 | 
			
		||||
    render(conn, "show.html", clothes: clothes)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def edit(conn, %{"id" => id}) do
 | 
			
		||||
    clothes = Shops.get_clothes!(id)
 | 
			
		||||
    changeset = Shops.change_clothes(clothes)
 | 
			
		||||
    render(conn, "edit.html", clothes: clothes, changeset: changeset)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def update(conn, %{"id" => id, "clothes" => clothes_params}) do
 | 
			
		||||
    clothes = Shops.get_clothes!(id)
 | 
			
		||||
 | 
			
		||||
    case Shops.update_clothes(clothes, clothes_params) do
 | 
			
		||||
      {:ok, clothes} ->
 | 
			
		||||
        conn
 | 
			
		||||
        |> put_flash(:info, "Clothes updated successfully.")
 | 
			
		||||
        |> redirect(to: Routes.clothes_path(conn, :show, clothes))
 | 
			
		||||
 | 
			
		||||
      {:error, %Ecto.Changeset{} = changeset} ->
 | 
			
		||||
        render(conn, "edit.html", clothes: clothes, changeset: changeset)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def delete(conn, %{"id" => id}) do
 | 
			
		||||
    clothes = Shops.get_clothes!(id)
 | 
			
		||||
    {:ok, _clothes} = Shops.delete_clothes(clothes)
 | 
			
		||||
 | 
			
		||||
    conn
 | 
			
		||||
    |> put_flash(:info, "Clothes deleted successfully.")
 | 
			
		||||
    |> redirect(to: Routes.clothes_path(conn, :index))
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -3,45 +3,12 @@ defmodule PokemonCoutureWeb.ClothesTrackerLive do
 | 
			
		||||
 | 
			
		||||
  alias PokemonCouture.Shops
 | 
			
		||||
  alias PokemonCouture.Accounts
 | 
			
		||||
  alias PokemonCouture.Shops.Clothes
 | 
			
		||||
 | 
			
		||||
  def create_shop_map(clothes, map) do
 | 
			
		||||
    case map[clothes.location] do
 | 
			
		||||
      nil ->
 | 
			
		||||
        Map.put(map, clothes.location, %{clothes.type => [clothes]})
 | 
			
		||||
      map_of_clothes when is_map(map_of_clothes) ->
 | 
			
		||||
        map_of_clothes = case map_of_clothes[clothes.type] do
 | 
			
		||||
          nil ->
 | 
			
		||||
            Map.put(map_of_clothes, clothes.type, [clothes])
 | 
			
		||||
          list_of_clothes when is_list(list_of_clothes) ->
 | 
			
		||||
            Map.put(map_of_clothes, clothes.type, [clothes | list_of_clothes])
 | 
			
		||||
        end
 | 
			
		||||
        Map.put(map, clothes.location, map_of_clothes)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def assign_clothespiece_to_map(clothes, map) do
 | 
			
		||||
    case map[clothes.name] do
 | 
			
		||||
      nil ->
 | 
			
		||||
        Map.put(map, clothes.name, [clothes])
 | 
			
		||||
      list_of_clothes when is_list(list_of_clothes) ->
 | 
			
		||||
        Map.put(map, clothes.name, [clothes | list_of_clothes])
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def inner_map_creator({type, list}, acc) do
 | 
			
		||||
    clothes_map = Enum.reduce(list, %{}, &assign_clothespiece_to_map/2)
 | 
			
		||||
    clothes_map = for {shop, map} <- clothes_map
 | 
			
		||||
                   do {shop, Enum.sort_by(map, fn %Clothes{game: game} -> game end)}
 | 
			
		||||
                  end
 | 
			
		||||
    Map.put(acc, type, clothes_map)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def mount(_params, %{"user_token" => user_token} = _session, socket) do
 | 
			
		||||
    user = Accounts.get_user_by_session_token(user_token)
 | 
			
		||||
    clothes_map = Enum.reduce(Shops.list_clothes_with_owners(), %{}, &create_shop_map/2)
 | 
			
		||||
    clothes_map = Shops.create_shop_map()
 | 
			
		||||
    clothes_map = for {shop, map} <- clothes_map
 | 
			
		||||
                    do {shop, Enum.reduce(map, %{}, &inner_map_creator/2)}
 | 
			
		||||
                    do {shop, Enum.reduce(map, %{}, &Shops.inner_map_creator/2)}
 | 
			
		||||
                  end
 | 
			
		||||
    socket =
 | 
			
		||||
      socket
 | 
			
		||||
 | 
			
		||||
@ -1,5 +0,0 @@
 | 
			
		||||
<h1>Edit Clothes</h1>
 | 
			
		||||
 | 
			
		||||
<%= render "form.html", Map.put(assigns, :action, Routes.clothes_path(@conn, :update, @clothes)) %>
 | 
			
		||||
 | 
			
		||||
<span><%= link "Back", to: Routes.clothes_path(@conn, :index) %></span>
 | 
			
		||||
@ -1,29 +1,32 @@
 | 
			
		||||
<h1>Listing Clothes</h1>
 | 
			
		||||
<%= for {shop, list_of_clothes} <- @clothes_map do %>
 | 
			
		||||
<%= for {shop, map_of_clothes_by_type} <- @clothes_map do %>
 | 
			
		||||
  <h2> <%= shop %></h2>
 | 
			
		||||
  <table>
 | 
			
		||||
    <thead>
 | 
			
		||||
      <tr>
 | 
			
		||||
        <th>Name</th>
 | 
			
		||||
        <th>Color</th>
 | 
			
		||||
        <th>Game</th>
 | 
			
		||||
        <th></th>
 | 
			
		||||
      </tr>
 | 
			
		||||
    </thead>
 | 
			
		||||
    <tbody>
 | 
			
		||||
  <%= for clothes <- list_of_clothes do %>
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><%= clothes.name %></td>
 | 
			
		||||
        <td><%= clothes.color %></td>
 | 
			
		||||
        <td><%= clothes.game %></td>
 | 
			
		||||
  <%= for {type, map_of_clothes_by_name} <- map_of_clothes_by_type do %>
 | 
			
		||||
    <h3> <%= type %></h3>
 | 
			
		||||
    <table>
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <th>Name</th>
 | 
			
		||||
          <th>Color</th>
 | 
			
		||||
          <th>Game</th>
 | 
			
		||||
          <th></th>
 | 
			
		||||
        </tr>
 | 
			
		||||
      </thead>
 | 
			
		||||
      <tbody>
 | 
			
		||||
    <%= for {_name, list_of_clothes} <- map_of_clothes_by_name do %>
 | 
			
		||||
      <%= for clothes <- list_of_clothes do %>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td><%= clothes.name %></td>
 | 
			
		||||
          <td><%= clothes.color %></td>
 | 
			
		||||
          <td><%= clothes.game %></td>
 | 
			
		||||
 | 
			
		||||
        <td>
 | 
			
		||||
          <span><%= link "Show", to: Routes.clothes_path(@conn, :show, clothes) %></span>
 | 
			
		||||
          <span><%= link "Edit", to: Routes.clothes_path(@conn, :edit, clothes) %></span>
 | 
			
		||||
          <span><%= link "Delete", to: Routes.clothes_path(@conn, :delete, clothes), method: :delete, data: [confirm: "Are you sure?"] %></span>
 | 
			
		||||
        </td>
 | 
			
		||||
      </tr>
 | 
			
		||||
          <td>
 | 
			
		||||
            <span><%= link "Show", to: Routes.clothes_path(@conn, :show, clothes) %></span>
 | 
			
		||||
          </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
      <% end %>
 | 
			
		||||
    <% end %>
 | 
			
		||||
      </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
  <% end %>
 | 
			
		||||
    </tbody>
 | 
			
		||||
  </table>
 | 
			
		||||
<% end %>
 | 
			
		||||
 | 
			
		||||
@ -1,5 +0,0 @@
 | 
			
		||||
<h1>New Clothes</h1>
 | 
			
		||||
 | 
			
		||||
<%= render "form.html", Map.put(assigns, :action, Routes.clothes_path(@conn, :create)) %>
 | 
			
		||||
 | 
			
		||||
<span><%= link "Back", to: Routes.clothes_path(@conn, :index) %></span>
 | 
			
		||||
@ -7,12 +7,15 @@
 | 
			
		||||
    <%= @clothes.name %>
 | 
			
		||||
  </li>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  <li>
 | 
			
		||||
    <strong>Color:</strong>
 | 
			
		||||
    <%= @clothes.color %>
 | 
			
		||||
  </li>
 | 
			
		||||
 | 
			
		||||
  <li>
 | 
			
		||||
    <strong>Type:</strong>
 | 
			
		||||
    <%= @clothes.type %>
 | 
			
		||||
  </li>
 | 
			
		||||
 | 
			
		||||
  <li>
 | 
			
		||||
    <strong>Location:</strong>
 | 
			
		||||
@ -25,6 +28,4 @@
 | 
			
		||||
  </li>
 | 
			
		||||
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
<span><%= link "Edit", to: Routes.clothes_path(@conn, :edit, @clothes) %></span>
 | 
			
		||||
<span><%= link "Back", to: Routes.clothes_path(@conn, :index) %></span>
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user