46 lines
1.4 KiB
Elixir
46 lines
1.4 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.Workers.PollWorker do
|
|
@moduledoc """
|
|
Generates notifications when a poll ends.
|
|
"""
|
|
use Pleroma.Workers.WorkerHelper, queue: "poll_notifications"
|
|
|
|
alias Pleroma.Activity
|
|
alias Pleroma.Notification
|
|
alias Pleroma.Object
|
|
|
|
@impl Oban.Worker
|
|
def perform(%Job{args: %{"op" => "poll_end", "activity_id" => activity_id}}) do
|
|
with %Activity{} = activity <- find_poll_activity(activity_id) do
|
|
Notification.create_poll_notifications(activity)
|
|
end
|
|
end
|
|
|
|
defp find_poll_activity(activity_id) do
|
|
with nil <- Activity.get_by_id(activity_id) do
|
|
{:error, :poll_activity_not_found}
|
|
end
|
|
end
|
|
|
|
def schedule_poll_end(%Activity{data: %{"type" => "Create"}, id: activity_id} = activity) do
|
|
with %Object{data: %{"type" => "Question", "closed" => closed}} when is_binary(closed) <-
|
|
Object.normalize(activity),
|
|
{:ok, end_time} <- NaiveDateTime.from_iso8601(closed),
|
|
:gt <- NaiveDateTime.compare(end_time, NaiveDateTime.utc_now()) do
|
|
%{
|
|
op: "poll_end",
|
|
activity_id: activity_id
|
|
}
|
|
|> new(scheduled_at: end_time)
|
|
|> Oban.insert()
|
|
else
|
|
_ -> {:error, activity}
|
|
end
|
|
end
|
|
|
|
def schedule_poll_end(activity), do: {:error, activity}
|
|
end
|