Merge branch 'feature/event-maps' into 'master'
Feature/event maps See merge request framasoft/mobilizon!105
This commit is contained in:
@@ -8,14 +8,14 @@ defmodule Mobilizon.Addresses.Address do
|
||||
# alias Mobilizon.Actors.Actor
|
||||
|
||||
schema "addresses" do
|
||||
field(:addressCountry, :string)
|
||||
field(:addressLocality, :string)
|
||||
field(:addressRegion, :string)
|
||||
field(:country, :string)
|
||||
field(:locality, :string)
|
||||
field(:region, :string)
|
||||
field(:description, :string)
|
||||
field(:floor, :string)
|
||||
field(:geom, Geo.PostGIS.Geometry)
|
||||
field(:postalCode, :string)
|
||||
field(:streetAddress, :string)
|
||||
field(:postal_code, :string)
|
||||
field(:street, :string)
|
||||
has_one(:event, Event, foreign_key: :physical_address_id)
|
||||
# has_one(:group, Actor)
|
||||
|
||||
@@ -29,11 +29,11 @@ defmodule Mobilizon.Addresses.Address do
|
||||
:description,
|
||||
:floor,
|
||||
:geom,
|
||||
:addressCountry,
|
||||
:addressLocality,
|
||||
:addressRegion,
|
||||
:postalCode,
|
||||
:streetAddress
|
||||
:country,
|
||||
:locality,
|
||||
:region,
|
||||
:postal_code,
|
||||
:street
|
||||
])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,6 +11,16 @@ defmodule Mobilizon.Addresses do
|
||||
|
||||
@geom_types [:point]
|
||||
|
||||
@doc false
|
||||
def data() do
|
||||
Dataloader.Ecto.new(Repo, query: &query/2)
|
||||
end
|
||||
|
||||
@doc false
|
||||
def query(queryable, _params) do
|
||||
queryable
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns the list of addresses.
|
||||
|
||||
@@ -168,7 +178,7 @@ defmodule Mobilizon.Addresses do
|
||||
|
||||
query =
|
||||
if country = Keyword.get(options, :country, nil),
|
||||
do: from(a in query, where: ilike(a.addressCountry, ^"%#{country}%")),
|
||||
do: from(a in query, where: ilike(a.country, ^"%#{country}%")),
|
||||
else: query
|
||||
|
||||
Repo.all(query)
|
||||
@@ -198,7 +208,7 @@ defmodule Mobilizon.Addresses do
|
||||
|
||||
query =
|
||||
if country,
|
||||
do: from(a in query, where: ilike(a.addressCountry, ^"%#{country}%")),
|
||||
do: from(a in query, where: ilike(a.country, ^"%#{country}%")),
|
||||
else: query
|
||||
|
||||
Repo.all(query)
|
||||
|
||||
@@ -4,7 +4,7 @@ defmodule MobilizonWeb.Schema do
|
||||
"""
|
||||
use Absinthe.Schema
|
||||
|
||||
alias Mobilizon.{Actors, Events, Users}
|
||||
alias Mobilizon.{Actors, Events, Users, Addresses}
|
||||
alias Mobilizon.Actors.{Actor, Follower, Member}
|
||||
alias Mobilizon.Events.{Event, Comment, Participant}
|
||||
|
||||
@@ -107,6 +107,7 @@ defmodule MobilizonWeb.Schema do
|
||||
|> Dataloader.add_source(Actors, Actors.data())
|
||||
|> Dataloader.add_source(Users, Users.data())
|
||||
|> Dataloader.add_source(Events, Events.data())
|
||||
|> Dataloader.add_source(Addresses, Addresses.data())
|
||||
|
||||
Map.put(ctx, :loader, loader)
|
||||
end
|
||||
|
||||
@@ -5,49 +5,37 @@ defmodule MobilizonWeb.Schema.AddressType do
|
||||
use Absinthe.Schema.Notation
|
||||
alias MobilizonWeb.Resolvers
|
||||
|
||||
object :physical_address do
|
||||
field(:type, :address_type)
|
||||
field(:geom, :point)
|
||||
field(:floor, :string)
|
||||
field(:streetAddress, :string)
|
||||
field(:addressLocality, :string)
|
||||
field(:postalCode, :string)
|
||||
field(:addressRegion, :string)
|
||||
field(:addressCountry, :string)
|
||||
object :address do
|
||||
field(:geom, :point, description: "The geocoordinates for the point where this address is")
|
||||
field(:floor, :string, description: "The floor this event is at")
|
||||
field(:street, :string, description: "The address's street name (with number)")
|
||||
field(:locality, :string, description: "The address's locality")
|
||||
field(:postal_code, :string)
|
||||
field(:region, :string)
|
||||
field(:country, :string)
|
||||
field(:description, :string)
|
||||
field(:name, :string)
|
||||
end
|
||||
|
||||
object :phone_address do
|
||||
field(:type, :address_type)
|
||||
field(:phone, :string)
|
||||
field(:info, :string)
|
||||
end
|
||||
|
||||
object :online_address do
|
||||
field(:type, :address_type)
|
||||
field(:url, :string)
|
||||
field(:info, :string)
|
||||
end
|
||||
|
||||
@desc "The list of types an address can be"
|
||||
enum :address_type do
|
||||
value(:physical, description: "The address is physical, like a postal address")
|
||||
value(:url, description: "The address is on the Web, like an URL")
|
||||
value(:phone, description: "The address is a phone number for a conference")
|
||||
value(:other, description: "The address is something else")
|
||||
end
|
||||
|
||||
object :address_queries do
|
||||
@desc "Search for an address"
|
||||
field :search_address, type: list_of(:physical_address) do
|
||||
field :search_address, type: list_of(:address) do
|
||||
arg(:query, non_null(:string))
|
||||
|
||||
resolve(&Resolvers.Address.search/3)
|
||||
end
|
||||
|
||||
@desc "Reverse geocode coordinates"
|
||||
field :reverse_geocode, type: list_of(:physical_address) do
|
||||
field :reverse_geocode, type: list_of(:address) do
|
||||
arg(:longitude, non_null(:float))
|
||||
arg(:latitude, non_null(:float))
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ defmodule MobilizonWeb.Schema.EventType do
|
||||
Schema representation for Event
|
||||
"""
|
||||
use Absinthe.Schema.Notation
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.{Actors, Addresses}
|
||||
import Absinthe.Resolution.Helpers, only: [dataloader: 1]
|
||||
import_types(MobilizonWeb.Schema.AddressType)
|
||||
import_types(MobilizonWeb.Schema.Events.ParticipantType)
|
||||
@@ -27,7 +27,12 @@ defmodule MobilizonWeb.Schema.EventType do
|
||||
# TODO replace me with banner
|
||||
field(:large_image, :string, description: "A large picture for the event")
|
||||
field(:publish_at, :datetime, description: "When the event was published")
|
||||
field(:physical_address, :physical_address, description: "The type of the event's address")
|
||||
|
||||
field(:physical_address, :address,
|
||||
resolve: dataloader(Addresses),
|
||||
description: "The type of the event's address"
|
||||
)
|
||||
|
||||
field(:online_address, :online_address, description: "Online address of the event")
|
||||
field(:phone_address, :phone_address, description: "Phone address for the event")
|
||||
|
||||
|
||||
@@ -44,11 +44,11 @@ defmodule MobilizonWeb.JsonLD.ObjectView do
|
||||
"name" => address.description,
|
||||
"address" => %{
|
||||
"@type" => "PostalAddress",
|
||||
"streetAddress" => address.streetAddress,
|
||||
"addressLocality" => address.addressLocality,
|
||||
"postalCode" => address.postalCode,
|
||||
"addressRegion" => address.addressRegion,
|
||||
"addressCountry" => address.addressCountry
|
||||
"streetAddress" => address.street,
|
||||
"addressLocality" => address.locality,
|
||||
"postalCode" => address.postal_code,
|
||||
"addressRegion" => address.region,
|
||||
"addressCountry" => address.country
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
@@ -63,14 +63,14 @@ defmodule Mobilizon.Service.Geospatial.Addok do
|
||||
features
|
||||
|> Enum.map(fn %{"geometry" => geometry, "properties" => properties} ->
|
||||
%Address{
|
||||
addressCountry: Map.get(properties, "country"),
|
||||
addressLocality: Map.get(properties, "city"),
|
||||
addressRegion: Map.get(properties, "state"),
|
||||
country: Map.get(properties, "country"),
|
||||
locality: Map.get(properties, "city"),
|
||||
region: Map.get(properties, "state"),
|
||||
description: Map.get(properties, "name") || streetAddress(properties),
|
||||
floor: Map.get(properties, "floor"),
|
||||
geom: Map.get(geometry, "coordinates") |> Provider.coordinates(),
|
||||
postalCode: Map.get(properties, "postcode"),
|
||||
streetAddress: properties |> streetAddress()
|
||||
postal_code: Map.get(properties, "postcode"),
|
||||
street: properties |> streetAddress()
|
||||
}
|
||||
end)
|
||||
end
|
||||
|
||||
@@ -96,14 +96,14 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do
|
||||
end)
|
||||
|
||||
%Address{
|
||||
addressCountry: Map.get(components, "country"),
|
||||
addressLocality: Map.get(components, "locality"),
|
||||
addressRegion: Map.get(components, "administrative_area_level_1"),
|
||||
country: Map.get(components, "country"),
|
||||
locality: Map.get(components, "locality"),
|
||||
region: Map.get(components, "administrative_area_level_1"),
|
||||
description: description,
|
||||
floor: nil,
|
||||
geom: [lon, lat] |> Provider.coordinates(),
|
||||
postalCode: Map.get(components, "postal_code"),
|
||||
streetAddress: street_address(components)
|
||||
postal_code: Map.get(components, "postal_code"),
|
||||
street: street_address(components)
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
@@ -103,14 +103,14 @@ defmodule Mobilizon.Service.Geospatial.MapQuest do
|
||||
|
||||
defp produceAddress(address, lat, lng) do
|
||||
%Address{
|
||||
addressCountry: Map.get(address, "adminArea1"),
|
||||
addressLocality: Map.get(address, "adminArea5"),
|
||||
addressRegion: Map.get(address, "adminArea3"),
|
||||
country: Map.get(address, "adminArea1"),
|
||||
locality: Map.get(address, "adminArea5"),
|
||||
region: Map.get(address, "adminArea3"),
|
||||
description: Map.get(address, "street"),
|
||||
floor: Map.get(address, "floor"),
|
||||
geom: [lng, lat] |> Provider.coordinates(),
|
||||
postalCode: Map.get(address, "postalCode"),
|
||||
streetAddress: Map.get(address, "street")
|
||||
postal_code: Map.get(address, "postalCode"),
|
||||
street: Map.get(address, "street")
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -67,14 +67,14 @@ defmodule Mobilizon.Service.Geospatial.Nominatim do
|
||||
@spec process_data(map()) :: Address.t()
|
||||
defp process_data(%{"address" => address} = body) do
|
||||
%Address{
|
||||
addressCountry: Map.get(address, "country"),
|
||||
addressLocality: Map.get(address, "city"),
|
||||
addressRegion: Map.get(address, "state"),
|
||||
country: Map.get(address, "country"),
|
||||
locality: Map.get(address, "city"),
|
||||
region: Map.get(address, "state"),
|
||||
description: Map.get(body, "display_name"),
|
||||
floor: Map.get(address, "floor"),
|
||||
geom: [Map.get(body, "lon"), Map.get(body, "lat")] |> Provider.coordinates(),
|
||||
postalCode: Map.get(address, "postcode"),
|
||||
streetAddress: street_address(address)
|
||||
postal_code: Map.get(address, "postcode"),
|
||||
street: street_address(address)
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
@@ -65,14 +65,14 @@ defmodule Mobilizon.Service.Geospatial.Photon do
|
||||
features
|
||||
|> Enum.map(fn %{"geometry" => geometry, "properties" => properties} ->
|
||||
%Address{
|
||||
addressCountry: Map.get(properties, "country"),
|
||||
addressLocality: Map.get(properties, "city"),
|
||||
addressRegion: Map.get(properties, "state"),
|
||||
country: Map.get(properties, "country"),
|
||||
locality: Map.get(properties, "city"),
|
||||
region: Map.get(properties, "state"),
|
||||
description: Map.get(properties, "name") || streetAddress(properties),
|
||||
floor: Map.get(properties, "floor"),
|
||||
geom: Map.get(geometry, "coordinates") |> Provider.coordinates(),
|
||||
postalCode: Map.get(properties, "postcode"),
|
||||
streetAddress: properties |> streetAddress()
|
||||
postal_code: Map.get(properties, "postcode"),
|
||||
street: properties |> streetAddress()
|
||||
}
|
||||
end)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user