Add comments under events to activities

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2021-03-10 17:38:13 +01:00
parent 58ee8e679b
commit 1f926902aa
14 changed files with 105 additions and 15 deletions

View File

@@ -9,6 +9,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Comments do
alias Mobilizon.Federation.ActivityStream.Converter.Utils, as: ConverterUtils
alias Mobilizon.Federation.ActivityStream.Convertible
alias Mobilizon.GraphQL.API.Utils, as: APIUtils
alias Mobilizon.Service.Activity.Comment, as: CommentActivity
alias Mobilizon.Share
alias Mobilizon.Tombstone
alias Mobilizon.Web.Endpoint
@@ -24,6 +25,10 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Comments do
:ok <- make_sure_event_allows_commenting(args),
{:ok, %Comment{discussion_id: discussion_id} = comment} <-
Discussions.create_comment(args),
{:ok, _} <-
CommentActivity.insert_activity(comment,
subject: "comment_posted"
),
:ok <- maybe_publish_graphql_subscription(discussion_id),
comment_as_data <- Convertible.model_to_as(comment),
audience <-

View File

@@ -78,6 +78,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Activity do
Actors.get_actor(group_id)
end
defp get_object(:comment, comment_id) do
Discussions.get_comment(comment_id)
end
@spec transform_params(map()) :: list()
defp transform_params(params) do
Enum.map(params, fn {key, value} -> %{key: key, value: transform_value(value)} end)

View File

@@ -5,7 +5,7 @@ defmodule Mobilizon.GraphQL.Schema.ActivityType do
use Absinthe.Schema.Notation
alias Mobilizon.Actors.{Actor, Member}
alias Mobilizon.Discussions.Discussion
alias Mobilizon.Discussions.{Comment, Discussion}
alias Mobilizon.Events.Event
alias Mobilizon.Posts.Post
alias Mobilizon.Resources.Resource
@@ -51,6 +51,9 @@ defmodule Mobilizon.GraphQL.Schema.ActivityType do
%Discussion{}, _ ->
:discussion
%Comment{}, _ ->
:comment
%Actor{type: :Group}, _ ->
:group

View File

@@ -11,7 +11,7 @@ defmodule Mobilizon.GraphQL.Schema.Discussions.CommentType do
@desc "A comment"
object :comment do
interfaces([:action_log_object])
interfaces([:action_log_object, :activity_object])
field(:id, :id, description: "Internal ID for this comment")
field(:uuid, :uuid, description: "An UUID for this comment")
field(:url, :string, description: "Comment URL")

View File

@@ -53,7 +53,7 @@ defmodule Mobilizon.Activities do
@resource_activity_subjects ++
@member_activity_subjects ++ @settings_activity_subjects
@object_type ["event", "actor", "post", "discussion", "resource", "member", "group"]
@object_type ["event", "actor", "post", "discussion", "resource", "member", "group", "comment"]
defenum(Type, @activity_types)
defenum(Subject, @subjects)

View File

@@ -0,0 +1,51 @@
defmodule Mobilizon.Service.Activity.Comment do
@moduledoc """
Insert a comment activity
"""
alias Mobilizon.{Actors, Events}
alias Mobilizon.Actors.Actor
alias Mobilizon.Discussions.Comment
alias Mobilizon.Events.Event
alias Mobilizon.Service.Activity
alias Mobilizon.Service.Workers.ActivityBuilder
@behaviour Activity
@impl Activity
def insert_activity(comment, options \\ [])
def insert_activity(
%Comment{
actor_id: actor_id,
event_id: event_id,
in_reply_to_comment_id: in_reply_to_comment_id
} = comment,
options
)
when not is_nil(actor_id) and not is_nil(event_id) do
with {:ok, %Event{attributed_to: %Actor{type: :Group} = group} = event} <-
Events.get_event_with_preload(event_id),
%Actor{id: actor_id} <- Actors.get_actor(actor_id),
subject <- Keyword.fetch!(options, :subject) do
ActivityBuilder.enqueue(:build_activity, %{
"type" => "event",
"subject" => subject,
"subject_params" => %{
event_title: event.title,
event_uuid: event.uuid,
comment_reply_to: !is_nil(in_reply_to_comment_id)
},
"group_id" => group.id,
"author_id" => actor_id,
"object_type" => "comment",
"object_id" => to_string(comment.id),
"inserted_at" => DateTime.utc_now()
})
else
# Event not from group
{:ok, %Event{}} -> {:ok, nil}
end
end
def insert_activity(_, _), do: {:ok, nil}
end