Introduce Mimirsbrunn geocoder and improve addresses & maps

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2019-11-08 19:37:14 +01:00
parent 0e7cf89492
commit c599a47d58
36 changed files with 940 additions and 267 deletions

View File

@@ -3,7 +3,6 @@ defmodule MobilizonWeb.Resolvers.Address do
Handles the comment-related GraphQL calls
"""
require Logger
alias Mobilizon.Addresses
alias Mobilizon.Addresses.Address
alias Mobilizon.Service.Geospatial
@@ -11,26 +10,18 @@ defmodule MobilizonWeb.Resolvers.Address do
Search an address
"""
@spec search(map(), map(), map()) :: {:ok, list(Address.t())}
def search(_parent, %{query: query, page: _page, limit: _limit}, %{context: %{ip: ip}}) do
country = ip |> Geolix.lookup() |> Map.get(:country, nil)
def search(_parent, %{query: query, locale: locale, page: _page, limit: _limit}, %{
context: %{ip: ip}
}) do
geolix = Geolix.lookup(ip)
local_addresses = Task.async(fn -> Addresses.search_addresses(query, country: country) end)
country_code =
case geolix do
%{country: %{iso_code: country_code}} -> String.downcase(country_code)
_ -> nil
end
remote_addresses = Task.async(fn -> Geospatial.service().search(query) end)
addresses = Task.await(local_addresses) ++ Task.await(remote_addresses)
# If we have results with same origin_id than those locally saved, don't return them
addresses =
Enum.reduce(addresses, %{}, fn address, addresses ->
if Map.has_key?(addresses, address.origin_id) && !is_nil(address.url) do
addresses
else
Map.put(addresses, address.origin_id, address)
end
end)
addresses = Map.values(addresses)
addresses = Geospatial.service().search(query, lang: locale, country_code: country_code)
{:ok, addresses}
end
@@ -39,15 +30,12 @@ defmodule MobilizonWeb.Resolvers.Address do
Reverse geocode some coordinates
"""
@spec reverse_geocode(map(), map(), map()) :: {:ok, list(Address.t())}
def reverse_geocode(_parent, %{longitude: longitude, latitude: latitude}, %{context: %{ip: ip}}) do
country = ip |> Geolix.lookup() |> Map.get(:country, nil)
local_addresses =
Task.async(fn -> Addresses.reverse_geocode(longitude, latitude, country: country) end)
remote_addresses = Task.async(fn -> Geospatial.service().geocode(longitude, latitude) end)
addresses = Task.await(local_addresses) ++ Task.await(remote_addresses)
def reverse_geocode(
_parent,
%{longitude: longitude, latitude: latitude, zoom: zoom, locale: locale},
_context
) do
addresses = Geospatial.service().geocode(longitude, latitude, lang: locale, zoom: zoom)
{:ok, addresses}
end

View File

@@ -4,16 +4,35 @@ defmodule MobilizonWeb.Resolvers.Config do
"""
alias Mobilizon.Config
alias Geolix.Adapter.MMDB2.Record.{Country, Location}
@doc """
Gets config.
"""
def get_config(_parent, _params, _context) do
def get_config(_parent, _params, %{
context: %{ip: ip}
}) do
geolix = Geolix.lookup(ip)
country_code =
case geolix.city do
%{country: %Country{iso_code: country_code}} -> String.downcase(country_code)
_ -> nil
end
location =
case geolix.city do
%{location: %Location{} = location} -> Map.from_struct(location)
_ -> nil
end
{:ok,
%{
name: Config.instance_name(),
registrations_open: Config.instance_registrations_open?(),
description: Config.instance_description()
description: Config.instance_description(),
location: location,
country_code: country_code
}}
end
end

View File

@@ -13,6 +13,7 @@ defmodule MobilizonWeb.Schema.AddressType do
field(:region, :string)
field(:country, :string)
field(:description, :string)
field(:type, :string)
field(:url, :string)
field(:id, :id)
field(:origin_id, :string)
@@ -38,6 +39,7 @@ defmodule MobilizonWeb.Schema.AddressType do
field(:country, :string)
field(:description, :string)
field(:url, :string)
field(:type, :string)
field(:id, :id)
field(:origin_id, :string)
end
@@ -46,6 +48,7 @@ defmodule MobilizonWeb.Schema.AddressType do
@desc "Search for an address"
field :search_address, type: list_of(:address) do
arg(:query, non_null(:string))
arg(:locale, :string, default_value: "en")
arg(:page, :integer, default_value: 1)
arg(:limit, :integer, default_value: 10)
@@ -56,6 +59,8 @@ defmodule MobilizonWeb.Schema.AddressType do
field :reverse_geocode, type: list_of(:address) do
arg(:longitude, non_null(:float))
arg(:latitude, non_null(:float))
arg(:zoom, :integer, default_value: 15)
arg(:locale, :string, default_value: "en")
resolve(&Resolvers.Address.reverse_geocode/3)
end

View File

@@ -13,6 +13,14 @@ defmodule MobilizonWeb.Schema.ConfigType do
field(:description, :string)
field(:registrations_open, :boolean)
field(:country_code, :string)
field(:location, :lonlat)
end
object :lonlat do
field(:longitude, :float)
field(:latitude, :float)
field(:accuracy_radius, :integer)
end
object :config_queries do