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
|
||||
|
||||
Reference in New Issue
Block a user