Fix geospatial runtime configuration
Geospatial configuration was only evaluated at compile-time, not at runtime Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
parent
ad913eb131
commit
35e641bcff
|
@ -6,15 +6,11 @@ defmodule Mobilizon.Service.Geospatial.Addok do
|
||||||
alias Mobilizon.Addresses.Address
|
alias Mobilizon.Addresses.Address
|
||||||
alias Mobilizon.Service.Geospatial.Provider
|
alias Mobilizon.Service.Geospatial.Provider
|
||||||
alias Mobilizon.Service.HTTP.GeospatialClient
|
alias Mobilizon.Service.HTTP.GeospatialClient
|
||||||
|
import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1]
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
@behaviour Provider
|
@behaviour Provider
|
||||||
|
|
||||||
@endpoint Application.get_env(:mobilizon, __MODULE__) |> get_in([:endpoint])
|
|
||||||
@default_country Application.get_env(:mobilizon, __MODULE__) |> get_in([:default_country]) ||
|
|
||||||
"France"
|
|
||||||
|
|
||||||
@impl Provider
|
@impl Provider
|
||||||
@doc """
|
@doc """
|
||||||
Addok implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
Addok implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
||||||
|
@ -40,7 +36,7 @@ defmodule Mobilizon.Service.Geospatial.Addok do
|
||||||
@spec build_url(atom(), map(), list()) :: String.t()
|
@spec build_url(atom(), map(), list()) :: String.t()
|
||||||
defp build_url(method, args, options) do
|
defp build_url(method, args, options) do
|
||||||
limit = Keyword.get(options, :limit, 10)
|
limit = Keyword.get(options, :limit, 10)
|
||||||
endpoint = Keyword.get(options, :endpoint, @endpoint)
|
endpoint = Keyword.get(options, :endpoint, endpoint(__MODULE__))
|
||||||
|
|
||||||
case method do
|
case method do
|
||||||
:geocode ->
|
:geocode ->
|
||||||
|
@ -71,7 +67,7 @@ defmodule Mobilizon.Service.Geospatial.Addok do
|
||||||
features
|
features
|
||||||
|> Enum.map(fn %{"geometry" => geometry, "properties" => properties} ->
|
|> Enum.map(fn %{"geometry" => geometry, "properties" => properties} ->
|
||||||
%Address{
|
%Address{
|
||||||
country: Map.get(properties, "country", @default_country),
|
country: Map.get(properties, "country", default_country()),
|
||||||
locality: Map.get(properties, "city"),
|
locality: Map.get(properties, "city"),
|
||||||
region: Map.get(properties, "context"),
|
region: Map.get(properties, "context"),
|
||||||
description: Map.get(properties, "name") || street_address(properties),
|
description: Map.get(properties, "name") || street_address(properties),
|
||||||
|
@ -105,4 +101,9 @@ defmodule Mobilizon.Service.Geospatial.Addok do
|
||||||
do: "#{url}&type=municipality"
|
do: "#{url}&type=municipality"
|
||||||
|
|
||||||
defp do_add_parameter(url, :type, _type), do: url
|
defp do_add_parameter(url, :type, _type), do: url
|
||||||
|
|
||||||
|
defp default_country do
|
||||||
|
Application.get_env(:mobilizon, __MODULE__) |> get_in([:default_country]) ||
|
||||||
|
"France"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,11 +13,6 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do
|
||||||
|
|
||||||
@behaviour Provider
|
@behaviour Provider
|
||||||
|
|
||||||
@api_key Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key])
|
|
||||||
|
|
||||||
@fetch_place_details (Application.get_env(:mobilizon, __MODULE__)
|
|
||||||
|> get_in([:fetch_place_details])) in [true, "true", "True"]
|
|
||||||
|
|
||||||
@components [
|
@components [
|
||||||
"street_number",
|
"street_number",
|
||||||
"route",
|
"route",
|
||||||
|
@ -77,7 +72,7 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do
|
||||||
defp build_url(method, args, options) do
|
defp build_url(method, args, options) do
|
||||||
limit = Keyword.get(options, :limit, 10)
|
limit = Keyword.get(options, :limit, 10)
|
||||||
lang = Keyword.get(options, :lang, "en")
|
lang = Keyword.get(options, :lang, "en")
|
||||||
api_key = Keyword.get(options, :api_key, @api_key)
|
api_key = Keyword.get(options, :api_key, api_key())
|
||||||
if is_nil(api_key), do: raise(ArgumentError, message: @api_key_missing_message)
|
if is_nil(api_key), do: raise(ArgumentError, message: @api_key_missing_message)
|
||||||
|
|
||||||
url = "#{@geocode_endpoint}?limit=#{limit}&key=#{api_key}&language=#{lang}"
|
url = "#{@geocode_endpoint}?limit=#{limit}&key=#{api_key}&language=#{lang}"
|
||||||
|
@ -118,7 +113,7 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do
|
||||||
end)
|
end)
|
||||||
|
|
||||||
description =
|
description =
|
||||||
if Keyword.get(options, :fetch_place_details, @fetch_place_details) == true do
|
if Keyword.get(options, :fetch_place_details, fetch_place_details()) == true do
|
||||||
do_fetch_place_details(place_id, options) || description
|
do_fetch_place_details(place_id, options) || description
|
||||||
else
|
else
|
||||||
description
|
description
|
||||||
|
@ -185,4 +180,13 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do
|
||||||
do: "#{url}&components=administrative_area"
|
do: "#{url}&components=administrative_area"
|
||||||
|
|
||||||
defp do_add_parameter(url, :type, _), do: url
|
defp do_add_parameter(url, :type, _), do: url
|
||||||
|
|
||||||
|
defp api_key do
|
||||||
|
Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key])
|
||||||
|
end
|
||||||
|
|
||||||
|
defp fetch_place_details do
|
||||||
|
(Application.get_env(:mobilizon, __MODULE__)
|
||||||
|
|> get_in([:fetch_place_details])) in [true, "true", "True"]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,8 +17,6 @@ defmodule Mobilizon.Service.Geospatial.MapQuest do
|
||||||
|
|
||||||
@behaviour Provider
|
@behaviour Provider
|
||||||
|
|
||||||
@api_key Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key])
|
|
||||||
|
|
||||||
@api_key_missing_message "API Key required to use MapQuest"
|
@api_key_missing_message "API Key required to use MapQuest"
|
||||||
|
|
||||||
@impl Provider
|
@impl Provider
|
||||||
|
@ -27,7 +25,7 @@ defmodule Mobilizon.Service.Geospatial.MapQuest do
|
||||||
"""
|
"""
|
||||||
@spec geocode(String.t(), keyword()) :: list(Address.t())
|
@spec geocode(String.t(), keyword()) :: list(Address.t())
|
||||||
def geocode(lon, lat, options \\ []) do
|
def geocode(lon, lat, options \\ []) do
|
||||||
api_key = Keyword.get(options, :api_key, @api_key)
|
api_key = Keyword.get(options, :api_key, api_key())
|
||||||
limit = Keyword.get(options, :limit, 10)
|
limit = Keyword.get(options, :limit, 10)
|
||||||
open_data = Keyword.get(options, :open_data, true)
|
open_data = Keyword.get(options, :open_data, true)
|
||||||
|
|
||||||
|
@ -56,7 +54,7 @@ defmodule Mobilizon.Service.Geospatial.MapQuest do
|
||||||
@spec search(String.t(), keyword()) :: list(Address.t())
|
@spec search(String.t(), keyword()) :: list(Address.t())
|
||||||
def search(q, options \\ []) do
|
def search(q, options \\ []) do
|
||||||
limit = Keyword.get(options, :limit, 10)
|
limit = Keyword.get(options, :limit, 10)
|
||||||
api_key = Keyword.get(options, :api_key, @api_key)
|
api_key = Keyword.get(options, :api_key, api_key())
|
||||||
|
|
||||||
open_data = Keyword.get(options, :open_data, true)
|
open_data = Keyword.get(options, :open_data, true)
|
||||||
|
|
||||||
|
@ -114,4 +112,8 @@ defmodule Mobilizon.Service.Geospatial.MapQuest do
|
||||||
street: Map.get(address, "street")
|
street: Map.get(address, "street")
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp api_key do
|
||||||
|
Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,13 +10,11 @@ defmodule Mobilizon.Service.Geospatial.Mimirsbrunn do
|
||||||
alias Mobilizon.Addresses.Address
|
alias Mobilizon.Addresses.Address
|
||||||
alias Mobilizon.Service.Geospatial.Provider
|
alias Mobilizon.Service.Geospatial.Provider
|
||||||
alias Mobilizon.Service.HTTP.GeospatialClient
|
alias Mobilizon.Service.HTTP.GeospatialClient
|
||||||
|
import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1]
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
@behaviour Provider
|
@behaviour Provider
|
||||||
|
|
||||||
@endpoint Application.get_env(:mobilizon, __MODULE__) |> get_in([:endpoint])
|
|
||||||
|
|
||||||
@impl Provider
|
@impl Provider
|
||||||
@doc """
|
@doc """
|
||||||
Mimirsbrunn implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
Mimirsbrunn implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
||||||
|
@ -43,7 +41,7 @@ defmodule Mobilizon.Service.Geospatial.Mimirsbrunn do
|
||||||
defp build_url(method, args, options) do
|
defp build_url(method, args, options) do
|
||||||
limit = Keyword.get(options, :limit, 10)
|
limit = Keyword.get(options, :limit, 10)
|
||||||
lang = Keyword.get(options, :lang, "en")
|
lang = Keyword.get(options, :lang, "en")
|
||||||
endpoint = Keyword.get(options, :endpoint, @endpoint)
|
endpoint = Keyword.get(options, :endpoint, endpoint(__MODULE__))
|
||||||
|
|
||||||
case method do
|
case method do
|
||||||
:search ->
|
:search ->
|
||||||
|
|
|
@ -6,14 +6,11 @@ defmodule Mobilizon.Service.Geospatial.Nominatim do
|
||||||
alias Mobilizon.Addresses.Address
|
alias Mobilizon.Addresses.Address
|
||||||
alias Mobilizon.Service.Geospatial.Provider
|
alias Mobilizon.Service.Geospatial.Provider
|
||||||
alias Mobilizon.Service.HTTP.GeospatialClient
|
alias Mobilizon.Service.HTTP.GeospatialClient
|
||||||
|
import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1]
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
@behaviour Provider
|
@behaviour Provider
|
||||||
|
|
||||||
@endpoint Application.get_env(:mobilizon, __MODULE__) |> get_in([:endpoint])
|
|
||||||
@api_key Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key])
|
|
||||||
|
|
||||||
@impl Provider
|
@impl Provider
|
||||||
@doc """
|
@doc """
|
||||||
Nominatim implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
Nominatim implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
||||||
|
@ -40,7 +37,7 @@ defmodule Mobilizon.Service.Geospatial.Nominatim do
|
||||||
defp build_url(method, args, options) do
|
defp build_url(method, args, options) do
|
||||||
limit = Keyword.get(options, :limit, 10)
|
limit = Keyword.get(options, :limit, 10)
|
||||||
lang = Keyword.get(options, :lang, "en")
|
lang = Keyword.get(options, :lang, "en")
|
||||||
endpoint = Keyword.get(options, :endpoint, @endpoint)
|
endpoint = Keyword.get(options, :endpoint, endpoint(__MODULE__))
|
||||||
|
|
||||||
url =
|
url =
|
||||||
case method do
|
case method do
|
||||||
|
@ -58,7 +55,7 @@ defmodule Mobilizon.Service.Geospatial.Nominatim do
|
||||||
|
|
||||||
url
|
url
|
||||||
|> add_parameter(options, :country_code)
|
|> add_parameter(options, :country_code)
|
||||||
|> add_parameter(options, :api_key, @api_key)
|
|> add_parameter(options, :api_key, api_key())
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec fetch_features(String.t()) :: list(Address.t())
|
@spec fetch_features(String.t()) :: list(Address.t())
|
||||||
|
@ -161,4 +158,8 @@ defmodule Mobilizon.Service.Geospatial.Nominatim do
|
||||||
@spec do_add_parameter(String.t(), atom(), any()) :: String.t()
|
@spec do_add_parameter(String.t(), atom(), any()) :: String.t()
|
||||||
defp do_add_parameter(url, :api_key, api_key),
|
defp do_add_parameter(url, :api_key, api_key),
|
||||||
do: "#{url}&key=#{api_key}"
|
do: "#{url}&key=#{api_key}"
|
||||||
|
|
||||||
|
defp api_key do
|
||||||
|
Application.get_env(:mobilizon, __MODULE__) |> get_in([:api_key])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,12 +8,11 @@ defmodule Mobilizon.Service.Geospatial.Pelias do
|
||||||
alias Mobilizon.Addresses.Address
|
alias Mobilizon.Addresses.Address
|
||||||
alias Mobilizon.Service.Geospatial.Provider
|
alias Mobilizon.Service.Geospatial.Provider
|
||||||
alias Mobilizon.Service.HTTP.GeospatialClient
|
alias Mobilizon.Service.HTTP.GeospatialClient
|
||||||
|
import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1]
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
@behaviour Provider
|
@behaviour Provider
|
||||||
|
|
||||||
@endpoint Application.get_env(:mobilizon, __MODULE__) |> get_in([:endpoint])
|
|
||||||
|
|
||||||
@impl Provider
|
@impl Provider
|
||||||
@doc """
|
@doc """
|
||||||
Pelias implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
Pelias implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
||||||
|
@ -40,7 +39,7 @@ defmodule Mobilizon.Service.Geospatial.Pelias do
|
||||||
defp build_url(method, args, options) do
|
defp build_url(method, args, options) do
|
||||||
limit = Keyword.get(options, :limit, 10)
|
limit = Keyword.get(options, :limit, 10)
|
||||||
lang = Keyword.get(options, :lang, "en")
|
lang = Keyword.get(options, :lang, "en")
|
||||||
endpoint = Keyword.get(options, :endpoint, @endpoint)
|
endpoint = Keyword.get(options, :endpoint, endpoint(__MODULE__))
|
||||||
|
|
||||||
url =
|
url =
|
||||||
case method do
|
case method do
|
||||||
|
|
|
@ -6,13 +6,11 @@ defmodule Mobilizon.Service.Geospatial.Photon do
|
||||||
alias Mobilizon.Addresses.Address
|
alias Mobilizon.Addresses.Address
|
||||||
alias Mobilizon.Service.Geospatial.Provider
|
alias Mobilizon.Service.Geospatial.Provider
|
||||||
alias Mobilizon.Service.HTTP.GeospatialClient
|
alias Mobilizon.Service.HTTP.GeospatialClient
|
||||||
|
import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1]
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
@behaviour Provider
|
@behaviour Provider
|
||||||
|
|
||||||
@endpoint Application.get_env(:mobilizon, __MODULE__) |> get_in([:endpoint])
|
|
||||||
|
|
||||||
@impl Provider
|
@impl Provider
|
||||||
@doc """
|
@doc """
|
||||||
Photon implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
Photon implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
||||||
|
@ -42,7 +40,7 @@ defmodule Mobilizon.Service.Geospatial.Photon do
|
||||||
limit = Keyword.get(options, :limit, 10)
|
limit = Keyword.get(options, :limit, 10)
|
||||||
lang = Keyword.get(options, :lang, "en")
|
lang = Keyword.get(options, :lang, "en")
|
||||||
coords = Keyword.get(options, :coords, nil)
|
coords = Keyword.get(options, :coords, nil)
|
||||||
endpoint = Keyword.get(options, :endpoint, @endpoint)
|
endpoint = Keyword.get(options, :endpoint, endpoint(__MODULE__))
|
||||||
|
|
||||||
case method do
|
case method do
|
||||||
:search ->
|
:search ->
|
||||||
|
|
|
@ -80,4 +80,9 @@ defmodule Mobilizon.Service.Geospatial.Provider do
|
||||||
|
|
||||||
@spec coordinates(any) :: nil
|
@spec coordinates(any) :: nil
|
||||||
def coordinates(_, _), do: nil
|
def coordinates(_, _), do: nil
|
||||||
|
|
||||||
|
@spec endpoint(atom()) :: String.t()
|
||||||
|
def endpoint(provider) do
|
||||||
|
Application.get_env(:mobilizon, provider) |> get_in([:endpoint])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue