feat(service): add hat geocoder

Closes #1414
This commit is contained in:
setop 2024-03-17 23:08:09 +01:00
parent 0dcd9569f8
commit 3cbf5e5daa
1 changed files with 44 additions and 0 deletions

View File

@ -0,0 +1,44 @@
defmodule Mobilizon.Service.Geospatial.Hat do
@moduledoc """
Hat backend.
"""
alias Mobilizon.Addresses.Address
alias Mobilizon.Service.Geospatial.Addok
alias Mobilizon.Service.Geospatial.Nominatim
alias Mobilizon.Service.Geospatial.Provider
import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1]
require Logger
@behaviour Provider
@impl Provider
@doc """
Hat implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
"""
@spec geocode(String.t(), keyword()) :: list(Address.t())
def geocode(lon, lat, options \\ []) do
tasks = [
Task.async(fn -> Addok.geocode(lon, lat, options) end),
Task.async(fn -> Nominatim.geocode(lon, lat, options) end)
]
[addrlist1, addrlist2] = Task.await_many(tasks, 12_000)
addrlist2 ++ addrlist1
end
@impl Provider
@doc """
Hat implementation for `c:Mobilizon.Service.Geospatial.Provider.search/2`.
"""
@spec search(String.t(), keyword()) :: list(Address.t())
def search(q, options \\ []) do
tasks = [
Task.async(fn -> Addok.search(q, options) end),
Task.async(fn -> Nominatim.search(q, options) end)
]
[addrlist1, addrlist2] = Task.await_many(tasks, 12_000)
addrlist2 ++ addrlist1
end
end