Merge branch 'fix/2449-scheduled-poll-bug' into 'develop'
Fix for scheduled post with poll Closes #2449 See merge request pleroma/pleroma!3294
This commit is contained in:
commit
c3dd860a02
7 changed files with 121 additions and 63 deletions
|
|
@ -413,34 +413,7 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
|
|||
items: %Schema{type: :string},
|
||||
description: "Array of Attachment ids to be attached as media."
|
||||
},
|
||||
poll: %Schema{
|
||||
nullable: true,
|
||||
type: :object,
|
||||
required: [:options],
|
||||
properties: %{
|
||||
options: %Schema{
|
||||
type: :array,
|
||||
items: %Schema{type: :string},
|
||||
description: "Array of possible answers. Must be provided with `poll[expires_in]`."
|
||||
},
|
||||
expires_in: %Schema{
|
||||
type: :integer,
|
||||
nullable: true,
|
||||
description:
|
||||
"Duration the poll should be open, in seconds. Must be provided with `poll[options]`"
|
||||
},
|
||||
multiple: %Schema{
|
||||
allOf: [BooleanLike],
|
||||
nullable: true,
|
||||
description: "Allow multiple choices?"
|
||||
},
|
||||
hide_totals: %Schema{
|
||||
allOf: [BooleanLike],
|
||||
nullable: true,
|
||||
description: "Hide vote counts until the poll ends?"
|
||||
}
|
||||
}
|
||||
},
|
||||
poll: poll_params(),
|
||||
in_reply_to_id: %Schema{
|
||||
nullable: true,
|
||||
allOf: [FlakeID],
|
||||
|
|
@ -522,6 +495,37 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
|
|||
}
|
||||
end
|
||||
|
||||
def poll_params do
|
||||
%Schema{
|
||||
nullable: true,
|
||||
type: :object,
|
||||
required: [:options, :expires_in],
|
||||
properties: %{
|
||||
options: %Schema{
|
||||
type: :array,
|
||||
items: %Schema{type: :string},
|
||||
description: "Array of possible answers. Must be provided with `poll[expires_in]`."
|
||||
},
|
||||
expires_in: %Schema{
|
||||
type: :integer,
|
||||
nullable: true,
|
||||
description:
|
||||
"Duration the poll should be open, in seconds. Must be provided with `poll[options]`"
|
||||
},
|
||||
multiple: %Schema{
|
||||
allOf: [BooleanLike],
|
||||
nullable: true,
|
||||
description: "Allow multiple choices?"
|
||||
},
|
||||
hide_totals: %Schema{
|
||||
allOf: [BooleanLike],
|
||||
nullable: true,
|
||||
description: "Hide vote counts until the poll ends?"
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def id_param do
|
||||
Operation.parameter(:id, :path, FlakeID, "Status ID",
|
||||
example: "9umDrYheeY451cQnEe",
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@
|
|||
defmodule Pleroma.Web.ApiSpec.Schemas.ScheduledStatus do
|
||||
alias OpenApiSpex.Schema
|
||||
alias Pleroma.Web.ApiSpec.Schemas.Attachment
|
||||
alias Pleroma.Web.ApiSpec.Schemas.Poll
|
||||
alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope
|
||||
alias Pleroma.Web.ApiSpec.StatusOperation
|
||||
|
||||
require OpenApiSpex
|
||||
|
||||
|
|
@ -29,7 +29,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ScheduledStatus do
|
|||
spoiler_text: %Schema{type: :string, nullable: true},
|
||||
visibility: %Schema{allOf: [VisibilityScope], nullable: true},
|
||||
scheduled_at: %Schema{type: :string, format: :"date-time", nullable: true},
|
||||
poll: %Schema{allOf: [Poll], nullable: true},
|
||||
poll: StatusOperation.poll_params(),
|
||||
in_reply_to_id: %Schema{type: :string, nullable: true}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,38 +9,50 @@ defmodule Pleroma.Workers.ScheduledActivityWorker do
|
|||
|
||||
use Pleroma.Workers.WorkerHelper, queue: "scheduled_activities"
|
||||
|
||||
alias Pleroma.Config
|
||||
alias Pleroma.Repo
|
||||
alias Pleroma.ScheduledActivity
|
||||
alias Pleroma.User
|
||||
alias Pleroma.Web.CommonAPI
|
||||
|
||||
require Logger
|
||||
|
||||
@impl Oban.Worker
|
||||
def perform(%Job{args: %{"activity_id" => activity_id}}) do
|
||||
if Config.get([ScheduledActivity, :enabled]) do
|
||||
case Pleroma.Repo.get(ScheduledActivity, activity_id) do
|
||||
%ScheduledActivity{} = scheduled_activity ->
|
||||
post_activity(scheduled_activity)
|
||||
with %ScheduledActivity{} = scheduled_activity <- find_scheduled_activity(activity_id),
|
||||
%User{} = user <- find_user(scheduled_activity.user_id) do
|
||||
params = atomize_keys(scheduled_activity.params)
|
||||
|
||||
_ ->
|
||||
Logger.error("#{__MODULE__} Couldn't find scheduled activity: #{activity_id}")
|
||||
end
|
||||
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 post_activity(%ScheduledActivity{user_id: user_id, params: params} = scheduled_activity) do
|
||||
params = Map.new(params, fn {key, value} -> {String.to_existing_atom(key), value} end)
|
||||
|
||||
with {:delete, {:ok, _}} <- {:delete, ScheduledActivity.delete(scheduled_activity)},
|
||||
{:user, %User{} = user} <- {:user, User.get_cached_by_id(user_id)},
|
||||
{:post, {:ok, _}} <- {:post, CommonAPI.post(user, params)} do
|
||||
:ok
|
||||
else
|
||||
error ->
|
||||
Logger.error(
|
||||
"#{__MODULE__} Couldn't create a status from the scheduled activity: #{inspect(error)}"
|
||||
)
|
||||
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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue