From 11ac2dccebb112eb66387880839064d8b93b7b06 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Tue, 8 Feb 2022 15:27:53 +0100 Subject: [PATCH] Expose remainingAttendeeCapacity and participantCount through AP Signed-off-by: Thomas Citharel --- lib/federation/activity_pub/utils.ex | 5 +++++ .../activity_stream/converter/event.ex | 20 ++++++++++++++++++ lib/web/views/json_ld/object_view.ex | 21 +++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/lib/federation/activity_pub/utils.ex b/lib/federation/activity_pub/utils.ex index c810b4d5..9743662a 100644 --- a/lib/federation/activity_pub/utils.ex +++ b/lib/federation/activity_pub/utils.ex @@ -69,6 +69,7 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do "category" => "sc:category", "uuid" => "sc:identifier", "maximumAttendeeCapacity" => "sc:maximumAttendeeCapacity", + "remainingAttendeeCapacity" => "sc:remainingAttendeeCapacity", "location" => %{ "@id" => "sc:location", "@type" => "sc:Place" @@ -112,6 +113,10 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do "@id" => "mz:participationMessage", "@type" => "sc:Text" }, + "participantCount" => %{ + "@id" => "mz:participantCount", + "@type" => "sc:Integer" + }, "isOnline" => %{ "@type" => "sc:Boolean", "@id" => "mz:isOnline" diff --git a/lib/federation/activity_stream/converter/event.ex b/lib/federation/activity_stream/converter/event.ex index 9acaf109..c89aced1 100644 --- a/lib/federation/activity_stream/converter/event.ex +++ b/lib/federation/activity_stream/converter/event.ex @@ -110,6 +110,8 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Event do do: {[@ap_public], [event.organizer_actor.followers_url]}, else: {[attributed_to_or_default(event).followers_url], [@ap_public]} + participant_count = Mobilizon.Events.count_participant_participants(event.id) + %{ "type" => "Event", "to" => to, @@ -129,6 +131,9 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Event do "endTime" => event.ends_on |> shift_tz(event.options.timezone) |> date_to_string(), "tag" => event.tags |> build_tags(), "maximumAttendeeCapacity" => event.options.maximum_attendee_capacity, + "remainingAttendeeCapacity" => + remaining_attendee_capacity(event.options, participant_count), + "participantCount" => participant_count, "repliesModerationOption" => event.options.comment_moderation, "commentsEnabled" => event.options.comment_moderation == :allow_all, "anonymousParticipationEnabled" => event.options.anonymous_participation, @@ -310,4 +315,19 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Event do |> get_url() |> fetch_actor() end + + @spec remaining_attendee_capacity(map(), integer()) :: integer() | nil + defp remaining_attendee_capacity( + %{maximum_attendee_capacity: maximum_attendee_capacity}, + participant_count + ) + when is_integer(maximum_attendee_capacity) and maximum_attendee_capacity > 0 do + maximum_attendee_capacity - participant_count + end + + defp remaining_attendee_capacity( + %{maximum_attendee_capacity: _}, + _participant_count + ), + do: nil end diff --git a/lib/web/views/json_ld/object_view.ex b/lib/web/views/json_ld/object_view.ex index 256fc93a..dadf7666 100644 --- a/lib/web/views/json_ld/object_view.ex +++ b/lib/web/views/json_ld/object_view.ex @@ -53,6 +53,8 @@ defmodule Mobilizon.Web.JsonLD.ObjectView do organizer end + participant_count = Mobilizon.Events.count_participant_participants(event.id) + json_ld = %{ "@context" => "https://schema.org", "@type" => "Event", @@ -63,6 +65,9 @@ defmodule Mobilizon.Web.JsonLD.ObjectView do "organizer" => organizer, "location" => render_all_locations(event), "eventAttendanceMode" => event |> attendance_mode() |> event_attendance_mode(), + "maximumAttendeeCapacity" => event.options.maximum_attendee_capacity, + "remainingAttendeeCapacity" => + remaining_attendee_capacity(event.options, participant_count), "eventStatus" => if(event.status == :cancelled, do: "https://schema.org/EventCancelled", @@ -229,4 +234,20 @@ defmodule Mobilizon.Web.JsonLD.ObjectView do @spec virtual_location_links(list()) :: list() defp virtual_location_links(metadata), do: Enum.filter(metadata, &String.contains?(&1.key, @livestream_keys)) + + # TODO: Make this in common with Mobilizon.Federation.ActivityStream.Converter.Event + @spec remaining_attendee_capacity(map(), integer()) :: integer() | nil + defp remaining_attendee_capacity( + %{maximum_attendee_capacity: maximum_attendee_capacity}, + participant_count + ) + when is_integer(maximum_attendee_capacity) and maximum_attendee_capacity > 0 do + maximum_attendee_capacity - participant_count + end + + defp remaining_attendee_capacity( + %{maximum_attendee_capacity: _}, + _participant_count + ), + do: nil end