Show related events

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2019-04-12 17:00:55 +02:00
parent a877e4d7d9
commit f5b02ed154
8 changed files with 89 additions and 42 deletions

View File

@@ -57,6 +57,7 @@ defmodule Mobilizon.Events do
e.organizer_actor_id == ^actor_id and e.visibility in [^:public, ^:unlisted] and
e.begins_on > ^DateTime.utc_now(),
order_by: [asc: :begins_on],
limit: 1,
preload: [
:organizer_actor,
:tags,
@@ -259,18 +260,42 @@ defmodule Mobilizon.Events do
[%Event{}, ...]
"""
def list_events(page \\ nil, limit \\ nil) do
@spec list_events(integer(), integer(), atom(), atom()) :: list(Event.t())
def list_events(
page \\ nil,
limit \\ nil,
sort \\ :begins_on,
direction \\ :asc,
unlisted \\ false,
future \\ true
) do
query =
from(
e in Event,
where: e.visibility == ^:public,
preload: [:organizer_actor, :participants]
)
|> paginate(page, limit)
|> sort(sort, direction)
|> restrict_future_events(future)
|> allow_unlisted(unlisted)
Repo.all(query)
end
# Make sure we only show future events
@spec restrict_future_events(Ecto.Query.t(), boolean()) :: Ecto.Query.t()
defp restrict_future_events(query, true),
do: from(q in query, where: q.begins_on > ^DateTime.utc_now())
defp restrict_future_events(query, false), do: query
# Make sure unlisted events don't show up where they're not allowed
@spec allow_unlisted(Ecto.Query.t(), boolean()) :: Ecto.Query.t()
defp allow_unlisted(query, true),
do: from(q in query, where: q.visibility in [^:public, ^:unlisted])
defp allow_unlisted(query, false), do: from(q in query, where: q.visibility == ^:public)
@doc """
Find events by name
"""

View File

@@ -49,7 +49,7 @@ defmodule MobilizonWeb.Resolvers.Event do
List related events
"""
def list_related_events(
%Event{tags: tags, organizer_actor: organizer_actor},
%Event{tags: tags, organizer_actor: organizer_actor, uuid: uuid},
_args,
_resolution
) do
@@ -57,12 +57,13 @@ defmodule MobilizonWeb.Resolvers.Event do
events =
[Events.get_actor_upcoming_public_event(organizer_actor, uuid)] |> Enum.filter(&is_map/1)
# We find similar events with the same tags
# uniq_by : It's possible event_from_same_actor is inside events_from_tags
events =
(events ++
Events.find_similar_events_by_common_tags(
tags,
@number_of_related_events - length(events)
@number_of_related_events
))
|> uniq_events()
@@ -85,10 +86,11 @@ defmodule MobilizonWeb.Resolvers.Event do
# We return only @number_of_related_events right now
|> Enum.take(@number_of_related_events)
# TODO: We should use tag_relations to find more events
{:ok, events}
end
defp uniq_events(events), do: Enum.uniq_by(events, fn event -> event.uuid end)
@doc """
Join an event for an actor
"""