|
|
@@ -30,7 +30,36 @@ defmodule Vaccins.LocationStore do
|
|
|
end
|
|
|
end
|
|
|
|
|
|
+ defmodule LocationRaw do
|
|
|
+ use Ecto.Schema
|
|
|
+ import Ecto.Changeset
|
|
|
+ @primary_key {:id, :id, autogenerate: false}
|
|
|
+
|
|
|
+ embedded_schema do
|
|
|
+ field(:name, :string)
|
|
|
+ field(:booking_page, :string)
|
|
|
+ field(:raw_query, :string)
|
|
|
+ end
|
|
|
+
|
|
|
+ @doc false
|
|
|
+ def changeset(location \\ %__MODULE__{}, attrs),
|
|
|
+ do:
|
|
|
+ location
|
|
|
+ |> cast(attrs, [:name, :booking_page, :raw_query])
|
|
|
+ |> validate_required([:name, :booking_page, :raw_query])
|
|
|
+
|
|
|
+ def to_query_params(%__MODULE__{raw_query: raw}) do
|
|
|
+ raw
|
|
|
+ |> URI.parse()
|
|
|
+ |> Map.get(:query)
|
|
|
+ |> URI.decode_query()
|
|
|
+ |> Map.new(fn {k, v} -> {k |> String.to_atom(), v} end)
|
|
|
+ |> Map.take([:agenda_ids, :limit, :practice_ids, :visit_motive_ids])
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
require Ex2ms
|
|
|
+ import Ecto.Changeset
|
|
|
alias Vaccins.Queries.Doctolib
|
|
|
@name Vaccins.LocationStore
|
|
|
|
|
|
@@ -48,4 +77,18 @@ defmodule Vaccins.LocationStore do
|
|
|
end
|
|
|
|
|
|
def build_location(l = %Location{}), do: l |> Location.set_id() |> Location.build_query()
|
|
|
+
|
|
|
+ def add_location(params) do
|
|
|
+ with {:ok, raw_location} <- params |> LocationRaw.changeset() |> apply_action(:insert),
|
|
|
+ processed <-
|
|
|
+ %Location{
|
|
|
+ name: raw_location.name,
|
|
|
+ booking_page: raw_location.booking_page,
|
|
|
+ availability_query_params: raw_location |> LocationRaw.to_query_params(),
|
|
|
+ provider: Doctolib
|
|
|
+ }
|
|
|
+ |> build_location,
|
|
|
+ true <- :dets.insert_new(@name, {processed.id, processed}),
|
|
|
+ do: :ok
|
|
|
+ end
|
|
|
end
|