Introduce Mimirsbrunn geocoder and improve addresses & maps
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user