queries.ex 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. defmodule Vaccins.Queries do
  2. defmodule Query do
  3. @callback to_url(any) :: String.t()
  4. end
  5. defmodule Doctolib do
  6. @behaviour Query
  7. alias __MODULE__, as: Doctolib
  8. defstruct [
  9. :start_date,
  10. :visit_motive_ids,
  11. :agenda_ids,
  12. :practice_ids,
  13. :limit,
  14. insurance_sector: "public",
  15. destroy_temporary: true,
  16. _converter: Doctolib
  17. ]
  18. def new(kw_list),
  19. do:
  20. struct(Doctolib, kw_list)
  21. |> Map.replace(:start_date, Date.utc_today() |> Date.to_string())
  22. def motives(), do: %{premiere_injection_pfizer: 2_743_305}
  23. def practices(), do: %{fontenay: 180_541}
  24. def to_url(q = %__MODULE__{}) do
  25. query_string = q |> Map.from_struct() |> URI.encode_query()
  26. %URI{
  27. authority: "partners.doctolib.fr",
  28. fragment: nil,
  29. host: "partners.doctolib.fr",
  30. path: "/availabilities.json",
  31. port: 443,
  32. query: query_string,
  33. scheme: "https",
  34. userinfo: nil
  35. }
  36. end
  37. def analyze_result(%{total: 0}), do: {:error, :no_availability}
  38. def analyze_result(%{total: t, availabilities: avail_list}) when t > 0 do
  39. {:ok,
  40. avail_list
  41. |> Enum.reject(&(&1.slots |> Enum.empty?()))
  42. |> Enum.map(& &1.slots)
  43. |> Enum.concat()
  44. |> Enum.map(&(&1 |> Map.take([:start_date, :end_date])))}
  45. end
  46. end
  47. def valid_queries(),
  48. do: [
  49. %{
  50. id: "Centre de Vaccination - Salle Olympe de Gouges",
  51. availability_query:
  52. Doctolib.new(
  53. visit_motive_ids: 2_549_915,
  54. agenda_ids:
  55. "434477-434486-434466-434472-440075-440077-440078-415625-434490-462178-462452-433984-462177-433604-433601-415628-440074-433997-434489-440076",
  56. practice_ids: 164_922,
  57. limit: 7
  58. ),
  59. booking_page:
  60. "https://partners.doctolib.fr/centre-de-sante/fontenay-sous-bois/centre-de-vaccination-covid-19-fontenay-sous-bois?pid=practice-180541"
  61. },
  62. %{
  63. id: "Centre de Vaccination - Paris 20e",
  64. availability_query:
  65. Doctolib.new(
  66. visit_motive_ids: 2_549_915,
  67. agenda_ids:
  68. "463167-415613-463168-415615-429620-434343-463166-463170-463171-447048-440655-434052-440654-462614-462613-433994-434337-434338",
  69. practice_ids: 166_459,
  70. limit: 3
  71. ),
  72. booking_page:
  73. "https://www.doctolib.fr/centre-de-sante/paris/centre-de-vaccination-covid-19-ville-de-paris?pid=practice-166459"
  74. },
  75. %{
  76. id: "Hotel de ville de Fontenay-sous-Bois",
  77. availability_query:
  78. Doctolib.new(
  79. visit_motive_ids: 2_743_304,
  80. agenda_ids: "449169-449170-466472",
  81. practice_ids: 180_541,
  82. limit: 15
  83. ),
  84. booking_page:
  85. "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"
  86. }
  87. ]
  88. end