forked from shibao/cannery
		
	improve Containers.list_containers
This commit is contained in:
		| @@ -11,6 +11,9 @@ defmodule Cannery.Containers do | ||||
|  | ||||
|   @container_preloads [:tags] | ||||
|  | ||||
|   @type list_containers_option :: {:search, String.t() | nil} | ||||
|   @type list_containers_options :: [list_containers_option()] | ||||
|  | ||||
|   @doc """ | ||||
|   Returns the list of containers. | ||||
|  | ||||
| @@ -19,30 +22,31 @@ defmodule Cannery.Containers do | ||||
|       iex> list_containers(%User{id: 123}) | ||||
|       [%Container{}, ...] | ||||
|  | ||||
|       iex> list_containers("cool", %User{id: 123}) | ||||
|       iex> list_containers(%User{id: 123}, search: "cool") | ||||
|       [%Container{name: "my cool container"}, ...] | ||||
|  | ||||
|   """ | ||||
|   @spec list_containers(User.t()) :: [Container.t()] | ||||
|   @spec list_containers(search :: nil | String.t(), User.t()) :: [Container.t()] | ||||
|   def list_containers(search \\ nil, %User{id: user_id}) do | ||||
|   @spec list_containers(User.t(), list_containers_options()) :: [Container.t()] | ||||
|   def list_containers(%User{id: user_id}, opts \\ []) do | ||||
|     from(c in Container, | ||||
|       as: :c, | ||||
|       left_join: t in assoc(c, :tags), | ||||
|       on: c.user_id == t.user_id, | ||||
|       as: :t, | ||||
|       where: c.user_id == ^user_id, | ||||
|       order_by: c.name, | ||||
|       distinct: c.id, | ||||
|       preload: ^@container_preloads | ||||
|     ) | ||||
|     |> list_containers_search(search) | ||||
|     |> list_containers_search(Keyword.get(opts, :search)) | ||||
|     |> Repo.all() | ||||
|   end | ||||
|  | ||||
|   defp list_containers_search(query, nil), do: query | ||||
|   defp list_containers_search(query, ""), do: query | ||||
|   @spec list_containers_search(Queryable.t(), search :: String.t() | nil) :: Queryable.t() | ||||
|   defp list_containers_search(query, search) when search in ["", nil], | ||||
|     do: query |> order_by([c: c], c.name) | ||||
|  | ||||
|   defp list_containers_search(query, search) do | ||||
|   defp list_containers_search(query, search) when search |> is_binary() do | ||||
|     trimmed_search = String.trim(search) | ||||
|  | ||||
|     query | ||||
|   | ||||
| @@ -113,6 +113,6 @@ defmodule CanneryWeb.ContainerLive.Index do | ||||
|   end | ||||
|  | ||||
|   defp display_containers(%{assigns: %{search: search, current_user: current_user}} = socket) do | ||||
|     socket |> assign(:containers, Containers.list_containers(search, current_user)) | ||||
|     socket |> assign(:containers, Containers.list_containers(current_user, search: search)) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -23,7 +23,7 @@ msgstr "" | ||||
| ## Run "mix gettext.extract" to bring this file up to | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery/containers.ex:220 | ||||
| #: lib/cannery/containers.ex:224 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container must be empty before deleting" | ||||
| msgstr "Behälter muss vor dem Löschen leer sein" | ||||
|   | ||||
| @@ -10,7 +10,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Language: en\n" | ||||
|  | ||||
| #: lib/cannery/containers.ex:220 | ||||
| #: lib/cannery/containers.ex:224 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container must be empty before deleting" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery/containers.ex:220 | ||||
| #: lib/cannery/containers.ex:224 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container must be empty before deleting" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -23,7 +23,7 @@ msgstr "" | ||||
| ## Run "mix gettext.extract" to bring this file up to | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery/containers.ex:220 | ||||
| #: lib/cannery/containers.ex:224 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container must be empty before deleting" | ||||
| msgstr "El contenedor debe estar vacío antes de ser borrado" | ||||
|   | ||||
| @@ -23,7 +23,7 @@ msgstr "" | ||||
| # # Run "mix gettext.extract" to bring this file up to | ||||
| # # date. Leave "msgstr"s empty as changing them here has no | ||||
| # # effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery/containers.ex:220 | ||||
| #: lib/cannery/containers.ex:224 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container must be empty before deleting" | ||||
| msgstr "Le conteneur doit être vide pour être supprimé" | ||||
|   | ||||
| @@ -24,7 +24,7 @@ msgstr "" | ||||
| ## Run "mix gettext.extract" to bring this file up to | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery/containers.ex:220 | ||||
| #: lib/cannery/containers.ex:224 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container must be empty before deleting" | ||||
| msgstr "Caithfidh an coimeádán a bheidh follamh roimh scriosadh" | ||||
|   | ||||
| @@ -77,16 +77,16 @@ defmodule Cannery.ContainersTest do | ||||
|       _shouldnt_return = container_fixture(%{name: "another person's container"}, user_fixture()) | ||||
|  | ||||
|       # attributes | ||||
|       assert Containers.list_containers("cool", current_user) == [container_a] | ||||
|       assert Containers.list_containers("fascinating", current_user) == [container_b] | ||||
|       assert Containers.list_containers("secret", current_user) == [container_c] | ||||
|       assert Containers.list_containers("box", current_user) == [container_d] | ||||
|       assert Containers.list_containers(current_user, search: "cool") == [container_a] | ||||
|       assert Containers.list_containers(current_user, search: "fascinating") == [container_b] | ||||
|       assert Containers.list_containers(current_user, search: "secret") == [container_c] | ||||
|       assert Containers.list_containers(current_user, search: "box") == [container_d] | ||||
|  | ||||
|       # tags | ||||
|       assert Containers.list_containers("stupendous", current_user) == [container_c] | ||||
|       assert Containers.list_containers("amazing", current_user) == [container_d] | ||||
|       assert Containers.list_containers(current_user, search: "stupendous") == [container_c] | ||||
|       assert Containers.list_containers(current_user, search: "amazing") == [container_d] | ||||
|  | ||||
|       assert Containers.list_containers("asajslkdflskdf", current_user) == [] | ||||
|       assert Containers.list_containers(current_user, search: "asajslkdflskdf") == [] | ||||
|     end | ||||
|  | ||||
|     test "get_container!/2 returns the container with given id", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user