Procházet zdrojové kódy

Add and use basic async query

theenglishway (time) před 4 roky
rodič
revize
d88b864200
2 změnil soubory, kde provedl 45 přidání a 2 odebrání
  1. 10 0
      lib/vaccins/search.ex
  2. 35 2
      lib/vaccins_web/live/index.ex

+ 10 - 0
lib/vaccins/search.ex

@@ -13,4 +13,14 @@ defmodule Vaccins.Search do
   end
 
   def do_all_queries(list) when is_list(list), do: list |> Enum.map(&do_query/1)
+
+  def async_trigger_query(q, target \\ nil)
+  def async_trigger_query(q, nil), do: async_trigger_query(q, self())
+
+  def async_trigger_query(q, target) when not is_nil(target) do
+    ref = make_ref()
+
+    with {:ok, _} <- Task.start(fn -> send(target, {:query_result, ref, q |> do_query}) end),
+         do: ref
+  end
 end

+ 35 - 2
lib/vaccins_web/live/index.ex

@@ -1,10 +1,39 @@
 defmodule VaccinsWeb.IndexLive do
   use VaccinsWeb, :live_view
-  alias Vaccins.Queries
+  alias Vaccins.{Queries, Search}
 
   @impl true
   def mount(_params, _session, socket) do
-    {:ok, socket |> assign(valid_queries: Queries.valid_queries())}
+    queries = Queries.valid_queries()
+
+    {:ok,
+     socket
+     |> assign(
+       valid_queries: queries,
+       pending: %{},
+       availabilities: queries |> Map.new(&{&1.id, []})
+     )}
+  end
+
+  @impl true
+  def handle_event(
+        "trigger_query",
+        %{"id" => query_id},
+        socket = %{assigns: %{valid_queries: valid, pending: pending}}
+      ) do
+    query = valid |> Enum.find(&(&1.id == query_id))
+    ref = Search.async_trigger_query(query)
+    {:noreply, socket |> assign(pending: pending |> Map.put(ref, query_id))}
+  end
+
+  @impl true
+  def handle_info(
+        {:query_result, ref, res},
+        socket = %{assigns: %{valid_queries: valid, pending: pending}}
+      ) do
+    query = pending |> Map.get(ref) |> IO.inspect()
+    res |> IO.inspect()
+    {:noreply, socket |> assign(pending: pending |> Map.delete(ref))}
   end
 
   defp render_query(q) do
@@ -14,6 +43,10 @@ defmodule VaccinsWeb.IndexLive do
         <dd><%= q.id %></dd>
         <dt>booking page</dt>
         <dd><%= link q.booking_page, to: q.booking_page %></dd>
+        <dt>Availabilities</dt>
+        <dd></dd>
+        <dt>test availability</dt>
+        <dd><button phx-click="trigger_query" phx-value-id="<%= q.id %>">Trigger</button></dd>
       </dl>
     """
   end