58 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| # Pleroma: A lightweight social networking server
 | |
| # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 | |
| # SPDX-License-Identifier: AGPL-3.0-only
 | |
| 
 | |
| defmodule Pleroma.Workers.ScheduledActivityWorker do
 | |
|   @moduledoc """
 | |
|   The worker to post scheduled activity.
 | |
|   """
 | |
| 
 | |
|   use Pleroma.Workers.WorkerHelper, queue: "scheduled_activities"
 | |
| 
 | |
|   alias Pleroma.Repo
 | |
|   alias Pleroma.ScheduledActivity
 | |
|   alias Pleroma.User
 | |
| 
 | |
|   require Logger
 | |
| 
 | |
|   @impl Oban.Worker
 | |
|   def perform(%Job{args: %{"activity_id" => activity_id}}) do
 | |
|     with %ScheduledActivity{} = scheduled_activity <- find_scheduled_activity(activity_id),
 | |
|          %User{} = user <- find_user(scheduled_activity.user_id) do
 | |
|       params = atomize_keys(scheduled_activity.params)
 | |
| 
 | |
|       Repo.transaction(fn ->
 | |
|         {:ok, activity} = Pleroma.Web.CommonAPI.post(user, params)
 | |
|         {:ok, _} = ScheduledActivity.delete(scheduled_activity)
 | |
|         activity
 | |
|       end)
 | |
|     else
 | |
|       {:error, :scheduled_activity_not_found} = error ->
 | |
|         Logger.error("#{__MODULE__} Couldn't find scheduled activity: #{activity_id}")
 | |
|         error
 | |
| 
 | |
|       {:error, :user_not_found} = error ->
 | |
|         Logger.error("#{__MODULE__} Couldn't find user for scheduled activity: #{activity_id}")
 | |
|         error
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   defp find_scheduled_activity(id) do
 | |
|     with nil <- Repo.get(ScheduledActivity, id) do
 | |
|       {:error, :scheduled_activity_not_found}
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   defp find_user(id) do
 | |
|     with nil <- User.get_cached_by_id(id) do
 | |
|       {:error, :user_not_found}
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   defp atomize_keys(map) do
 | |
|     Map.new(map, fn
 | |
|       {key, value} when is_map(value) -> {String.to_existing_atom(key), atomize_keys(value)}
 | |
|       {key, value} -> {String.to_existing_atom(key), value}
 | |
|     end)
 | |
|   end
 | |
| end
 | 
