Allow to get group followed events after a certain date
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
parent
4923c52f3b
commit
b12cea5ead
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue