Notification for participation request/accepted participation

Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
marcin mikołajczak 2022-08-19 23:20:00 +02:00
parent 4d9ddd4f4b
commit b3700afdd3
9 changed files with 126 additions and 11 deletions

View file

@ -74,6 +74,8 @@ def unread_notifications_count(%User{id: user_id}) do
reblog
poll
status
pleroma:participation_accepted
pleroma:participation_request
}
def changeset(%Notification{} = notification, attrs) do
@ -388,7 +390,7 @@ def create_notifications(%Activity{data: %{"to" => _, "type" => "Create"}} = act
end
def create_notifications(%Activity{data: %{"type" => type}} = activity, options)
when type in ["Follow", "Like", "Announce", "Move", "EmojiReact", "Flag"] do
when type in ["Follow", "Like", "Announce", "Move", "EmojiReact", "Flag", "Accept", "Join"] do
do_create_notifications(activity, options)
end
@ -449,6 +451,12 @@ defp type_from_activity(%{data: %{"type" => type}} = activity) do
activity
|> type_from_activity_object()
"Accept" ->
"pleroma:participation_accepted"
"Join" ->
"pleroma:participation_request"
t ->
raise "No notification type for activity type #{t}"
end
@ -523,7 +531,17 @@ def create_poll_notifications(%Activity{} = activity) do
def get_notified_from_activity(activity, local_only \\ true)
def get_notified_from_activity(%Activity{data: %{"type" => type}} = activity, local_only)
when type in ["Create", "Like", "Announce", "Follow", "Move", "EmojiReact", "Flag"] do
when type in [
"Create",
"Like",
"Announce",
"Follow",
"Move",
"EmojiReact",
"Flag",
"Accept",
"Join"
] do
potential_receiver_ap_ids = get_potential_receiver_ap_ids(activity)
potential_receivers =
@ -576,6 +594,35 @@ def get_potential_receiver_ap_ids(%{data: %{"type" => type, "object" => object_i
end
end
def get_potential_receiver_ap_ids(%{data: %{"type" => "Accept", "object" => join_id}}) do
case Activity.get_by_ap_id_with_object(join_id) do
%Activity{
data: %{"type" => "Join"},
object: %Object{data: %{"type" => "Event", "joinMode" => "free"}}
} ->
[]
%Activity{data: %{"type" => "Join", "actor" => actor_id}} ->
[actor_id]
_ ->
[]
end
end
def get_potential_receiver_ap_ids(%{data: %{"type" => "Join", "object" => object_id}}) do
case Object.get_by_ap_id(object_id) do
%Object{data: %{"type" => "Event", "joinMode" => "free"}} ->
[]
%Object{data: %{"type" => "Event", "actor" => actor_id}} ->
[actor_id]
_ ->
[]
end
end
def get_potential_receiver_ap_ids(%{data: %{"type" => "Follow", "object" => object_id}}) do
[object_id]
end

View file

@ -25,7 +25,6 @@ defp config, do: Config.get([:pipeline, :config], Config)
@spec common_pipeline(map(), keyword()) ::
{:ok, Activity.t() | Object.t(), keyword()} | {:error, any()}
def common_pipeline(object, meta) do
case Repo.transaction(fn -> do_common_pipeline(object, meta) end, Utils.query_timeout()) do
{:ok, {:ok, activity, meta}} ->
side_effects().handle_after_transaction(meta)

View file

@ -49,7 +49,9 @@ def handle(
Activity.get_by_ap_id(activity_id) do
handle_accepted(activity, actor)
Notification.create_notifications(object)
if activity.data["type"] === "Join" do
Notification.create_notifications(object)
end
end
{:ok, object, meta}
@ -396,6 +398,8 @@ def handle(%{data: %{"type" => "Join"}} = object, meta) do
{:ok, _activity, _} = Pipeline.common_pipeline(accept_data, local: true)
end
Notification.create_notifications(object)
{:ok, object, meta}
end

View file

@ -202,12 +202,15 @@ defp notification_type do
"move",
"follow_request",
"poll",
"status"
"status",
"pleroma:participation_accepted",
"pleroma:participation_request"
],
description: """
The type of event that resulted in the notification.
- `follow` - Someone followed you
- `follow_request` - Someone wants to follow you
- `mention` - Someone mentioned you in their status
- `reblog` - Someone boosted one of your statuses
- `favourite` - Someone favourited one of your statuses
@ -217,6 +220,8 @@ defp notification_type do
- `pleroma:chat_mention` - Someone mentioned you in a chat message
- `pleroma:report` - Someone was reported
- `status` - Someone you are subscribed to created a status
- `pleroma:participation_request - Someone wants to participate in your event
- `pleroma:participation_accepted - Your event participation request was accepted
"""
}
end

View file

@ -81,7 +81,7 @@ def perform(:incoming_ap_doc, params) do
nil <- Activity.normalize(params["id"]),
{_, :ok} <-
{:correct_origin?, Containment.contain_origin_from_id(actor, params)},
_ <- "handling incoming",
_ <- "handling incoming",
{:ok, activity} <- Transmogrifier.handle_incoming(params) do
{:ok, activity}
else

View file

@ -52,6 +52,8 @@ def index(conn, %{account_id: account_id} = params) do
pleroma:emoji_reaction
poll
status
pleroma:participation_request
pleroma:participation_accepted
}
def index(%{assigns: %{user: user}} = conn, params) do
params =

View file

@ -129,6 +129,12 @@ def render(
"pleroma:report" ->
put_report(response, activity)
"pleroma:participation_accepted" ->
put_status(response, parent_activity_fn.(), reading_user, status_render_opts)
"pleroma:participation_request" ->
put_participation_request(response, activity)
type when type in ["follow", "follow_request"] ->
response
end
@ -169,4 +175,8 @@ defp put_target(response, activity, reading_user, opts) do
Map.put(response, :target, target_render)
end
defp put_participation_request(response, activity) do
Map.put(response, :participation_message, activity.data["participationMessage"])
end
end

View file

@ -367,8 +367,6 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity}
{pinned?, pinned_at} = pin_data(object, user)
IO.inspect(opts[:for])
%{
id: to_string(activity.id),
uri: object.data["id"],
@ -598,7 +596,6 @@ def build_emojis(emojis) do
end
defp build_event(%{"type" => "Event"} = data, for_user) do
IO.inspect(for_user)
%{
name: data["name"],
start_time: data["startTime"],
@ -619,8 +616,6 @@ defp build_event_location(%{"type" => "Place", "name" => name}) do
defp build_event_location(_), do: nil
defp build_event_join_state(%{ap_id: actor}, id) do
IO.inspect(actor)
IO.inspect(id)
latest_join = Pleroma.Web.ActivityPub.Utils.get_existing_join(actor, id)
if latest_join do

View file

@ -0,0 +1,53 @@
defmodule Pleroma.Repo.Migrations.AddPleromaParticipationAcceptedToNotificationsEnum do
use Ecto.Migration
@disable_ddl_transaction true
def up do
"""
alter type notification_type add value 'pleroma:participation_accepted'
alter type notification_type add value 'pleroma:participation_request'
"""
|> execute()
end
def down do
alter table(:notifications) do
modify(:type, :string)
end
"""
delete from notifications where type = 'pleroma:participation_accepted'
delete from notifications where type = 'pleroma:participation_request'
"""
|> execute()
"""
drop type if exists notification_type
"""
|> execute()
"""
create type notification_type as enum (
'follow',
'follow_request',
'mention',
'move',
'pleroma:emoji_reaction',
'pleroma:chat_mention',
'reblog',
'favourite',
'pleroma:report',
'poll',
'status'
)
"""
|> execute()
"""
alter table notifications
alter column type type notification_type using (type::notification_type)
"""
|> execute()
end
end