Allow to get group followed events after a certain date

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2021-11-02 19:48:38 +01:00
parent 4923c52f3b
commit b12cea5ead
No known key found for this signature in database
GPG key ID: A061B9DDE0CA0773
3 changed files with 29 additions and 6 deletions

View file

@ -633,11 +633,17 @@ defmodule Mobilizon.GraphQL.Resolvers.User do
}} }}
end end
def user_followed_group_events(%User{id: user_id}, %{page: page, limit: limit}, %{ def user_followed_group_events(%User{id: user_id}, %{page: page, limit: limit} = args, %{
context: %{current_user: %User{id: logged_in_user_id}} context: %{current_user: %User{id: logged_in_user_id}}
}) })
when user_id == logged_in_user_id do when user_id == logged_in_user_id do
activities = FollowedGroupActivity.user_followed_group_events(user_id, page, limit) activities =
FollowedGroupActivity.user_followed_group_events(
user_id,
Map.get(args, :after_datetime),
page,
limit
)
activities = %Page{ activities = %Page{
activities activities

View file

@ -117,6 +117,10 @@ defmodule Mobilizon.GraphQL.Schema.UserType do
description: "The limit of follow group events per page" description: "The limit of follow group events per page"
) )
arg(:after_datetime, :datetime,
description: "Filter follow group events by event start datetime"
)
resolve(&User.user_followed_group_events/3) resolve(&User.user_followed_group_events/3)
end end

View file

@ -8,7 +8,13 @@ defmodule Mobilizon.FollowedGroupActivity do
alias Mobilizon.Events.{Event, Participant} alias Mobilizon.Events.{Event, Participant}
alias Mobilizon.Storage.Page alias Mobilizon.Storage.Page
def user_followed_group_events(user_id, page \\ nil, limit \\ nil) do @spec user_followed_group_events(
integer() | String.t(),
DateTime.t() | nil,
integer() | nil,
integer() | nil
) :: Page.t(Event.t())
def user_followed_group_events(user_id, after_datetime, page \\ nil, limit \\ nil) do
Event Event
|> distinct([e], e.id) |> distinct([e], e.id)
|> join(:left, [e], p in Participant, on: e.id == p.event_id) |> join(:left, [e], p in Participant, on: e.id == p.event_id)
@ -19,9 +25,9 @@ defmodule Mobilizon.FollowedGroupActivity do
|> join(:inner, [_e, _p, pa, _g, f, m], a in Actor, |> join(:inner, [_e, _p, pa, _g, f, m], a in Actor,
on: a.id == f.actor_id or a.id == m.actor_id on: a.id == f.actor_id or a.id == m.actor_id
) )
|> add_after_datetime_filter(after_datetime)
|> where( |> where(
[e, p, pa, _g, f, m, a], [_e, p, pa, _g, f, m, a],
e.begins_on > ^DateTime.utc_now() and
(f.approved or m.role in ^[:member, :moderator, :administrator, :creator]) and (f.approved or m.role in ^[:member, :moderator, :administrator, :creator]) and
a.user_id == ^user_id and a.user_id == ^user_id and
pa.user_id != ^user_id pa.user_id != ^user_id
@ -40,4 +46,11 @@ defmodule Mobilizon.FollowedGroupActivity do
]) ])
|> Page.build_page(page, limit) |> Page.build_page(page, limit)
end end
@spec add_after_datetime_filter(Ecto.Query.t(), DateTime.t() | nil) :: Ecto.Query.t()
defp add_after_datetime_filter(query, nil),
do: where(query, [e], e.begins_on > ^DateTime.utc_now())
defp add_after_datetime_filter(query, %DateTime{} = datetime),
do: where(query, [e], e.begins_on > ^datetime)
end end