alias Pleroma.User
alias Pleroma.Conversation
alias Pleroma.Repo
+ alias Pleroma.Web.ActivityPub.ActivityPub
import Ecto.Changeset
import Ecto.Query
belongs_to(:user, User, type: Pleroma.FlakeId)
belongs_to(:conversation, Conversation)
field(:read, :boolean, default: false)
+ field(:last_activity_id, Pleroma.FlakeId, virtual: true)
timestamps()
end
)
|> Pleroma.Pagination.fetch_paginated(params)
end
+
+ def for_user_with_last_activity_id(user, params \\ %{}) do
+ for_user(user, params)
+ |> Repo.preload(:conversation)
+ |> Enum.map(fn participation ->
+ # TODO: Don't load all those activities, just get the most recent
+ # Involves splitting up the query.
+ activities =
+ ActivityPub.fetch_activities_for_context(participation.conversation.ap_id, %{
+ "user" => user,
+ "blocking_user" => user
+ })
+
+ activity_id =
+ case activities do
+ [activity | _] -> activity.id
+ _ -> nil
+ end
+
+ %{
+ participation
+ | last_activity_id: activity_id
+ }
+ end)
+ end
end
|> Repo.preload(:conversation)
assert participation_one.conversation.ap_id == activity_three.data["object"]["context"]
+
+ # With last_activity_id
+ assert [participation_one] =
+ Participation.for_user_with_last_activity_id(user, %{limit: 1})
+ |> Repo.preload(:conversation)
+
+ assert participation_one.last_activity_id == activity_three.id
end
end