| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- defmodule Vaccins.Queries do
- defmodule Query do
- @callback to_url(any) :: String.t()
- end
- defmodule Doctolib do
- @behaviour Query
- alias __MODULE__, as: Doctolib
- defstruct [
- :start_date,
- :visit_motive_ids,
- :agenda_ids,
- :practice_ids,
- :limit,
- insurance_sector: "public",
- destroy_temporary: true,
- _converter: Doctolib
- ]
- def new(kw_list),
- do:
- struct(Doctolib, kw_list)
- |> Map.replace(:start_date, Date.utc_today() |> Date.to_string())
- def motives(), do: %{premiere_injection_pfizer: 2_743_305}
- def practices(), do: %{fontenay: 180_541}
- def to_url(q = %__MODULE__{}) do
- query_string = q |> Map.from_struct() |> URI.encode_query()
- %URI{
- authority: "partners.doctolib.fr",
- fragment: nil,
- host: "partners.doctolib.fr",
- path: "/availabilities.json",
- port: 443,
- query: query_string,
- scheme: "https",
- userinfo: nil
- }
- end
- def analyze_result(%{total: 0}), do: {:error, :no_availability}
- def analyze_result(%{total: t, availabilities: avail_list}) when t > 0 do
- {:ok,
- avail_list
- |> Enum.reject(&(&1.slots |> Enum.empty?()))
- |> Enum.map(& &1.slots)
- |> Enum.concat()
- |> Enum.map(&(&1 |> Map.take([:start_date, :end_date])))}
- end
- end
- def valid_queries(),
- do: [
- %{
- id: "Centre de Vaccination - Salle Olympe de Gouges",
- availability_query:
- Doctolib.new(
- 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"
- },
- %{
- id: "Centre de Vaccination - Paris 20e",
- availability_query:
- Doctolib.new(
- 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"
- },
- %{
- id: "Hotel de ville de Fontenay-sous-Bois",
- availability_query:
- Doctolib.new(
- 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"
- }
- ]
- end
|