115 lines
3.3 KiB
Elixir
115 lines
3.3 KiB
Elixir
defmodule MobilizonWeb.API.Events do
|
|
@moduledoc """
|
|
API for Events.
|
|
"""
|
|
|
|
alias Mobilizon.Events.Event
|
|
alias Mobilizon.Actors.Actor
|
|
alias Mobilizon.Service.ActivityPub
|
|
alias Mobilizon.Service.ActivityPub.Activity
|
|
alias Mobilizon.Service.ActivityPub.Utils, as: ActivityPubUtils
|
|
|
|
alias MobilizonWeb.API.Utils
|
|
|
|
@doc """
|
|
Create an event
|
|
"""
|
|
@spec create_event(map()) :: {:ok, Activity.t(), Event.t()} | any()
|
|
def create_event(%{organizer_actor: organizer_actor} = args) do
|
|
with args <- prepare_args(args),
|
|
event <-
|
|
ActivityPubUtils.make_event_data(
|
|
args.organizer_actor.url,
|
|
%{to: args.to, cc: args.cc},
|
|
args.title,
|
|
args.content_html,
|
|
args.picture,
|
|
args.tags,
|
|
args.metadata
|
|
) do
|
|
ActivityPub.create(%{
|
|
to: args.to,
|
|
actor: organizer_actor,
|
|
object: event,
|
|
# For now we don't federate drafts but it will be needed if we want to edit them as groups
|
|
local: args.metadata.draft == false
|
|
})
|
|
end
|
|
end
|
|
|
|
@doc """
|
|
Update an event
|
|
"""
|
|
@spec update_event(map(), Event.t()) :: {:ok, Activity.t(), Event.t()} | any()
|
|
def update_event(
|
|
%{
|
|
organizer_actor: organizer_actor
|
|
} = args,
|
|
%Event{} = event
|
|
) do
|
|
with args <- Map.put(args, :tags, Map.get(args, :tags, [])),
|
|
args <- prepare_args(Map.merge(event, args)),
|
|
event <-
|
|
ActivityPubUtils.make_event_data(
|
|
args.organizer_actor.url,
|
|
%{to: args.to, cc: args.cc},
|
|
args.title,
|
|
args.content_html,
|
|
args.picture,
|
|
args.tags,
|
|
args.metadata,
|
|
event.uuid,
|
|
event.url
|
|
) do
|
|
ActivityPub.update(%{
|
|
to: args.to,
|
|
actor: organizer_actor.url,
|
|
cc: [],
|
|
object: event,
|
|
local: args.metadata.draft == false
|
|
})
|
|
end
|
|
end
|
|
|
|
defp prepare_args(args) do
|
|
with %Actor{} = organizer_actor <- Map.get(args, :organizer_actor),
|
|
title <- args |> Map.get(:title, "") |> HtmlSanitizeEx.strip_tags() |> String.trim(),
|
|
visibility <- Map.get(args, :visibility, :public),
|
|
description <- Map.get(args, :description),
|
|
tags <- Map.get(args, :tags),
|
|
{content_html, tags, to, cc} <-
|
|
Utils.prepare_content(organizer_actor, description, visibility, tags, nil) do
|
|
%{
|
|
title: title,
|
|
content_html: content_html,
|
|
picture: Map.get(args, :picture),
|
|
tags: tags,
|
|
organizer_actor: organizer_actor,
|
|
to: to,
|
|
cc: cc,
|
|
metadata: %{
|
|
begins_on: Map.get(args, :begins_on),
|
|
ends_on: Map.get(args, :ends_on),
|
|
physical_address: Map.get(args, :physical_address),
|
|
category: Map.get(args, :category),
|
|
options: Map.get(args, :options),
|
|
join_options: Map.get(args, :join_options),
|
|
status: Map.get(args, :status),
|
|
online_address: Map.get(args, :online_address),
|
|
phone_address: Map.get(args, :phone_address),
|
|
draft: Map.get(args, :draft)
|
|
}
|
|
}
|
|
end
|
|
end
|
|
|
|
@doc """
|
|
Trigger the deletion of an event
|
|
|
|
If the event is deleted by
|
|
"""
|
|
def delete_event(%Event{} = event, federate \\ true) do
|
|
ActivityPub.delete(event, federate)
|
|
end
|
|
end
|