Explorar o código

Create location_store module

theenglishway (time) %!s(int64=4) %!d(string=hai) anos
pai
achega
5dfb60dea8

+ 78 - 0
lib/vaccins/location_store.ex

@@ -0,0 +1,78 @@
+defmodule Vaccins.LocationStore do
+  defmodule Location do
+    alias __MODULE__, as: Location
+
+    defstruct [
+      :id,
+      :name,
+      :availability_query,
+      :booking_page,
+      :provider,
+      availability_query_params: []
+    ]
+
+    def set_id(l = %Location{name: name}), do: %{l | id: name |> String.to_atom()}
+
+    def build_query(l = %Location{availability_query_params: params, provider: provider})
+        when params != [],
+        do: %{l | availability_query: params |> provider.new}
+
+    def query_availability(
+          l = %Location{id: id, availability_query: q, booking_page: bp, provider: provider}
+        ) do
+      with url <- q |> provider.to_url() |> URI.to_string(),
+           {:ok, result} <- url |> Vaccins.Scraper.get_json() do
+        case result |> provider.analyze_result() do
+          {:ok, slots} -> {id, slots, bp}
+          {:error, reason} when reason in [:no_availability] -> {id, reason}
+        end
+      end
+    end
+  end
+
+  alias Vaccins.Queries.Doctolib
+
+  def get_locations(),
+    do:
+      [
+        %Location{
+          name: "Centre de Vaccination - Salle Olympe de Gouges",
+          provider: Doctolib,
+          availability_query_params: [
+            visit_motive_ids: 2_549_915,
+            agenda_ids:
+              "434477-434486-434466-434472-440075-440077-440078-415625-434490-462178-462452-433984-462177-433604-433601-415628-440074-433997-434489-440076",
+            practice_ids: 164_922,
+            limit: 7
+          ],
+          booking_page:
+            "https://partners.doctolib.fr/centre-de-sante/fontenay-sous-bois/centre-de-vaccination-covid-19-fontenay-sous-bois?pid=practice-180541"
+        },
+        %Location{
+          name: "Centre de Vaccination - Paris 20e",
+          provider: Doctolib,
+          availability_query_params: [
+            visit_motive_ids: 2_549_915,
+            agenda_ids:
+              "463167-415613-463168-415615-429620-434343-463166-463170-463171-447048-440655-434052-440654-462614-462613-433994-434337-434338",
+            practice_ids: 166_459,
+            limit: 3
+          ],
+          booking_page:
+            "https://www.doctolib.fr/centre-de-sante/paris/centre-de-vaccination-covid-19-ville-de-paris?pid=practice-166459"
+        },
+        %Location{
+          name: "Hotel de ville de Fontenay-sous-Bois",
+          provider: Doctolib,
+          availability_query_params: [
+            visit_motive_ids: 2_743_304,
+            agenda_ids: "449169-449170-466472",
+            practice_ids: 180_541,
+            limit: 15
+          ],
+          booking_page:
+            "https://partners.doctolib.fr/centre-de-sante/fontenay-sous-bois/centre-de-vaccination-covid-19-fontenay-sous-bois?pid=practice-180541&enable_cookies_consent=1"
+        }
+      ]
+      |> Enum.map(&(&1 |> Location.set_id() |> Location.build_query()))
+end

+ 0 - 75
lib/vaccins/queries.ex

@@ -54,79 +54,4 @@ defmodule Vaccins.Queries do
        |> Enum.map(&(&1 |> Map.take([:start_date, :end_date])))}
     end
   end
-
-  defmodule Location do
-    alias __MODULE__, as: Location
-
-    defstruct [
-      :id,
-      :name,
-      :availability_query,
-      :booking_page,
-      :provider,
-      availability_query_params: []
-    ]
-
-    def set_id(l = %Location{name: name}), do: %{l | id: name |> String.to_atom()}
-
-    def build_query(l = %Location{availability_query_params: params, provider: provider})
-        when params != [],
-        do: %{l | availability_query: params |> provider.new}
-
-    def query_availability(
-          l = %Location{id: id, availability_query: q, booking_page: bp, provider: provider}
-        ) do
-      with url <- q |> provider.to_url() |> URI.to_string(),
-           {:ok, result} <- url |> Vaccins.Scraper.get_json() do
-        case result |> provider.analyze_result() do
-          {:ok, slots} -> {id, slots, bp}
-          {:error, reason} when reason in [:no_availability] -> {id, reason}
-        end
-      end
-    end
-  end
-
-  def get_locations(),
-    do:
-      [
-        %Location{
-          name: "Centre de Vaccination - Salle Olympe de Gouges",
-          provider: Doctolib,
-          availability_query_params: [
-            visit_motive_ids: 2_549_915,
-            agenda_ids:
-              "434477-434486-434466-434472-440075-440077-440078-415625-434490-462178-462452-433984-462177-433604-433601-415628-440074-433997-434489-440076",
-            practice_ids: 164_922,
-            limit: 7
-          ],
-          booking_page:
-            "https://partners.doctolib.fr/centre-de-sante/fontenay-sous-bois/centre-de-vaccination-covid-19-fontenay-sous-bois?pid=practice-180541"
-        },
-        %Location{
-          name: "Centre de Vaccination - Paris 20e",
-          provider: Doctolib,
-          availability_query_params: [
-            visit_motive_ids: 2_549_915,
-            agenda_ids:
-              "463167-415613-463168-415615-429620-434343-463166-463170-463171-447048-440655-434052-440654-462614-462613-433994-434337-434338",
-            practice_ids: 166_459,
-            limit: 3
-          ],
-          booking_page:
-            "https://www.doctolib.fr/centre-de-sante/paris/centre-de-vaccination-covid-19-ville-de-paris?pid=practice-166459"
-        },
-        %Location{
-          name: "Hotel de ville de Fontenay-sous-Bois",
-          provider: Doctolib,
-          availability_query_params: [
-            visit_motive_ids: 2_743_304,
-            agenda_ids: "449169-449170-466472",
-            practice_ids: 180_541,
-            limit: 15
-          ],
-          booking_page:
-            "https://partners.doctolib.fr/centre-de-sante/fontenay-sous-bois/centre-de-vaccination-covid-19-fontenay-sous-bois?pid=practice-180541&enable_cookies_consent=1"
-        }
-      ]
-      |> Enum.map(&(&1 |> Location.set_id() |> Location.build_query()))
 end

+ 1 - 1
lib/vaccins/search.ex

@@ -1,6 +1,6 @@
 defmodule Vaccins.Search do
   alias Vaccins.Scraper
-  alias Vaccins.Queries.Location
+  alias Vaccins.LocationStore.Location
 
   def async_trigger_query(q, target \\ nil)
   def async_trigger_query(q, nil), do: async_trigger_query(q, self())

+ 5 - 5
lib/vaccins_web/live/index.ex

@@ -1,17 +1,17 @@
 defmodule VaccinsWeb.IndexLive do
   use VaccinsWeb, :live_view
-  alias Vaccins.{Queries, Search}
+  alias Vaccins.{LocationStore, Search}
 
   @impl true
   def mount(_params, _session, socket) do
-    queries = Queries.get_locations()
+    locations = LocationStore.get_locations()
 
     {:ok,
      socket
      |> assign(
-       locations: queries,
+       locations: locations,
        pending: %{},
-       availabilities: queries |> Map.new(&{&1.id, []})
+       availabilities: locations |> Map.new(&{&1.id, []})
      )}
   end
 
@@ -21,7 +21,7 @@ defmodule VaccinsWeb.IndexLive do
         %{"id" => query_id},
         socket = %{assigns: %{locations: valid, pending: pending}}
       ) do
-    query = valid |> Enum.find(&(&1.id == query_id))
+    query = valid |> Enum.find(&(&1.id == query_id |> String.to_atom()))
     ref = Search.async_trigger_query(query)
     {:noreply, socket |> assign(pending: pending |> Map.put(ref, query_id))}
   end