location_store.ex 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. defmodule Vaccins.LocationStore do
  2. defmodule Location do
  3. alias __MODULE__, as: Location
  4. defstruct [
  5. :id,
  6. :name,
  7. :availability_query,
  8. :booking_page,
  9. :provider,
  10. availability_query_params: []
  11. ]
  12. def set_id(l = %Location{name: name}), do: %{l | id: name |> String.to_atom()}
  13. def build_query(l = %Location{availability_query_params: params, provider: provider})
  14. when params != [],
  15. do: %{l | availability_query: params |> provider.new}
  16. def query_availability(
  17. l = %Location{id: id, availability_query: q, booking_page: bp, provider: provider}
  18. ) do
  19. with url <- q |> provider.to_url() |> URI.to_string(),
  20. {:ok, result} <- url |> Vaccins.Scraper.get_json() do
  21. case result |> provider.analyze_result() do
  22. {:ok, slots} -> {id, slots, bp}
  23. {:error, reason} when reason in [:no_availability] -> {id, reason}
  24. end
  25. end
  26. end
  27. end
  28. alias Vaccins.Queries.Doctolib
  29. def get_locations(),
  30. do:
  31. [
  32. %Location{
  33. name: "Centre de Vaccination - Salle Olympe de Gouges",
  34. provider: Doctolib,
  35. availability_query_params: [
  36. visit_motive_ids: 2_549_915,
  37. agenda_ids:
  38. "434477-434486-434466-434472-440075-440077-440078-415625-434490-462178-462452-433984-462177-433604-433601-415628-440074-433997-434489-440076",
  39. practice_ids: 164_922,
  40. limit: 7
  41. ],
  42. booking_page:
  43. "https://partners.doctolib.fr/centre-de-sante/fontenay-sous-bois/centre-de-vaccination-covid-19-fontenay-sous-bois?pid=practice-180541"
  44. },
  45. %Location{
  46. name: "Centre de Vaccination - Paris 20e",
  47. provider: Doctolib,
  48. availability_query_params: [
  49. visit_motive_ids: 2_549_915,
  50. agenda_ids:
  51. "463167-415613-463168-415615-429620-434343-463166-463170-463171-447048-440655-434052-440654-462614-462613-433994-434337-434338",
  52. practice_ids: 166_459,
  53. limit: 3
  54. ],
  55. booking_page:
  56. "https://www.doctolib.fr/centre-de-sante/paris/centre-de-vaccination-covid-19-ville-de-paris?pid=practice-166459"
  57. },
  58. %Location{
  59. name: "Hotel de ville de Fontenay-sous-Bois",
  60. provider: Doctolib,
  61. availability_query_params: [
  62. visit_motive_ids: 2_743_304,
  63. agenda_ids: "449169-449170-466472",
  64. practice_ids: 180_541,
  65. limit: 15
  66. ],
  67. booking_page:
  68. "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"
  69. }
  70. ]
  71. |> Enum.map(&(&1 |> Location.set_id() |> Location.build_query()))
  72. end