Add address input and refactor federation stuff
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -6,6 +6,20 @@ defmodule Mobilizon.Addresses.Address do
|
||||
alias Mobilizon.Addresses.Address
|
||||
alias Mobilizon.Events.Event
|
||||
# alias Mobilizon.Actors.Actor
|
||||
@attrs [
|
||||
:description,
|
||||
:floor,
|
||||
:geom,
|
||||
:country,
|
||||
:locality,
|
||||
:region,
|
||||
:postal_code,
|
||||
:street,
|
||||
:url
|
||||
]
|
||||
@required [
|
||||
:url
|
||||
]
|
||||
|
||||
schema "addresses" do
|
||||
field(:country, :string)
|
||||
@@ -16,8 +30,8 @@ defmodule Mobilizon.Addresses.Address do
|
||||
field(:geom, Geo.PostGIS.Geometry)
|
||||
field(:postal_code, :string)
|
||||
field(:street, :string)
|
||||
has_one(:event, Event, foreign_key: :physical_address_id)
|
||||
# has_one(:group, Actor)
|
||||
field(:url, :string)
|
||||
has_many(:event, Event, foreign_key: :physical_address_id)
|
||||
|
||||
timestamps()
|
||||
end
|
||||
@@ -25,15 +39,15 @@ defmodule Mobilizon.Addresses.Address do
|
||||
@doc false
|
||||
def changeset(%Address{} = address, attrs) do
|
||||
address
|
||||
|> cast(attrs, [
|
||||
:description,
|
||||
:floor,
|
||||
:geom,
|
||||
:country,
|
||||
:locality,
|
||||
:region,
|
||||
:postal_code,
|
||||
:street
|
||||
])
|
||||
|> cast(attrs, @attrs)
|
||||
|> set_url()
|
||||
|> validate_required(@required)
|
||||
end
|
||||
|
||||
defp set_url(%Ecto.Changeset{changes: changes} = changeset) do
|
||||
url =
|
||||
Map.get(changes, :url, MobilizonWeb.Endpoint.url() <> "/address/#{Ecto.UUID.generate()}")
|
||||
|
||||
put_change(changeset, :url, url)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -50,6 +50,21 @@ defmodule Mobilizon.Addresses do
|
||||
"""
|
||||
def get_address!(id), do: Repo.get!(Address, id)
|
||||
|
||||
@doc """
|
||||
Gets a single address by it's url
|
||||
|
||||
## Examples
|
||||
|
||||
iex> get_address_by_url("https://mobilizon.social/addresses/4572")
|
||||
%Address{}
|
||||
|
||||
iex> get_address_by_url("https://mobilizon.social/addresses/099")
|
||||
nil
|
||||
"""
|
||||
def get_address_by_url(url) do
|
||||
Repo.get_by(Address, url: url)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Creates a address.
|
||||
|
||||
@@ -163,7 +178,7 @@ defmodule Mobilizon.Addresses do
|
||||
We only look at the description for now, and eventually order by object distance
|
||||
"""
|
||||
@spec search_addresses(String.t(), list()) :: list(Address.t())
|
||||
def search_addresses(search, options) do
|
||||
def search_addresses(search, options \\ []) do
|
||||
limit = Keyword.get(options, :limit, 5)
|
||||
|
||||
query = from(a in Address, where: ilike(a.description, ^"%#{search}%"), limit: ^limit)
|
||||
@@ -181,7 +196,7 @@ defmodule Mobilizon.Addresses do
|
||||
do: from(a in query, where: ilike(a.country, ^"%#{country}%")),
|
||||
else: query
|
||||
|
||||
Repo.all(query)
|
||||
if Keyword.get(options, :single, false) == true, do: Repo.one(query), else: Repo.all(query)
|
||||
end
|
||||
|
||||
@doc """
|
||||
|
||||
@@ -84,9 +84,9 @@ defmodule Mobilizon.Events.Event do
|
||||
:online_address,
|
||||
:phone_address,
|
||||
:uuid,
|
||||
:picture_id
|
||||
:picture_id,
|
||||
:physical_address_id
|
||||
])
|
||||
|> cast_assoc(:physical_address)
|
||||
|> validate_required([
|
||||
:title,
|
||||
:begins_on,
|
||||
|
||||
@@ -382,7 +382,8 @@ defmodule Mobilizon.Events do
|
||||
|
||||
defp do_create_event(attrs) do
|
||||
with {:ok, %Event{} = event} <- %Event{} |> Event.changeset(attrs) |> Repo.insert(),
|
||||
%Event{} = event <- event |> Repo.preload([:tags, :organizer_actor]),
|
||||
%Event{} = event <-
|
||||
event |> Repo.preload([:tags, :organizer_actor, :physical_address, :picture]),
|
||||
{:has_tags, true, _} <- {:has_tags, Map.has_key?(attrs, "tags"), event} do
|
||||
event
|
||||
|> Ecto.Changeset.change()
|
||||
@@ -513,8 +514,10 @@ defmodule Mobilizon.Events do
|
||||
@doc """
|
||||
Get an existing tag or create one
|
||||
"""
|
||||
@spec get_or_create_tag(String.t()) :: {:ok, Tag.t()} | {:error, any()}
|
||||
def get_or_create_tag(title) do
|
||||
@spec get_or_create_tag(map()) :: {:ok, Tag.t()} | {:error, any()}
|
||||
def get_or_create_tag(tag) do
|
||||
"#" <> title = tag["name"]
|
||||
|
||||
case Repo.get_by(Tag, title: title) do
|
||||
%Tag{} = tag ->
|
||||
{:ok, tag}
|
||||
@@ -1223,9 +1226,13 @@ defmodule Mobilizon.Events do
|
||||
|
||||
"""
|
||||
def create_comment(attrs \\ %{}) do
|
||||
%Comment{}
|
||||
|> Comment.changeset(attrs)
|
||||
|> Repo.insert()
|
||||
with {:ok, %Comment{} = comment} <-
|
||||
%Comment{}
|
||||
|> Comment.changeset(attrs)
|
||||
|> Repo.insert(),
|
||||
%Comment{} = comment <- Repo.preload(comment, [:actor, :in_reply_to_comment]) do
|
||||
{:ok, comment}
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
|
||||
Reference in New Issue
Block a user