summaryrefslogtreecommitdiff
path: root/lib/pleroma/workers/poll_worker.ex
blob: 4c7eab5c10216985748ebb60e5304d1e029abf29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 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