Require webhook events
This commit is contained in:
parent
e44d2329c8
commit
719b5d65b5
4 changed files with 35 additions and 6 deletions
|
|
@ -1877,7 +1877,7 @@ Note that this differs from the Mastodon API variant: Mastodon API only returns
|
||||||
- Method: `POST`
|
- Method: `POST`
|
||||||
- Params:
|
- Params:
|
||||||
- `url`: **string** Webhook URL
|
- `url`: **string** Webhook URL
|
||||||
- *optional* `events`: **[string]** Types of events to trigger on (`account.created`, `report.created`)
|
- `events`: **[string]** Types of events to trigger on (`account.created`, `report.created`)
|
||||||
- *optional* `enabled`: **boolean** Whether webhook is enabled
|
- *optional* `enabled`: **boolean** Whether webhook is enabled
|
||||||
- Response: A webhook
|
- Response: A webhook
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,9 +55,10 @@ defmodule Pleroma.Web.ApiSpec.Admin.WebhookOperation do
|
||||||
%Schema{
|
%Schema{
|
||||||
description: "POST body for creating a webhook",
|
description: "POST body for creating a webhook",
|
||||||
type: :object,
|
type: :object,
|
||||||
|
required: [:url, :events],
|
||||||
properties: %{
|
properties: %{
|
||||||
url: %Schema{type: :string, format: :uri, required: true},
|
url: %Schema{type: :string, format: :uri},
|
||||||
events: event_type(true),
|
events: event_type(),
|
||||||
enabled: %Schema{type: :boolean}
|
enabled: %Schema{type: :boolean}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -179,15 +180,14 @@ defmodule Pleroma.Web.ApiSpec.Admin.WebhookOperation do
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp event_type(required \\ nil) do
|
defp event_type do
|
||||||
%Schema{
|
%Schema{
|
||||||
type: :array,
|
type: :array,
|
||||||
items: %Schema{
|
items: %Schema{
|
||||||
title: "Event",
|
title: "Event",
|
||||||
description: "Event type",
|
description: "Event type",
|
||||||
type: :string,
|
type: :string,
|
||||||
enum: ["account.created", "report.created"],
|
enum: ["account.created", "report.created"]
|
||||||
required: required
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ defmodule Pleroma.Webhook do
|
||||||
webhook
|
webhook
|
||||||
|> cast(params, [:url, :events, :enabled, :internal])
|
|> cast(params, [:url, :events, :enabled, :internal])
|
||||||
|> validate_required([:url, :events])
|
|> validate_required([:url, :events])
|
||||||
|
|> validate_events_present()
|
||||||
|> unique_constraint(:url)
|
|> unique_constraint(:url)
|
||||||
|> put_secret()
|
|> put_secret()
|
||||||
end
|
end
|
||||||
|
|
@ -43,6 +44,7 @@ defmodule Pleroma.Webhook do
|
||||||
def update_changeset(%__MODULE__{} = webhook, params \\ %{}) do
|
def update_changeset(%__MODULE__{} = webhook, params \\ %{}) do
|
||||||
webhook
|
webhook
|
||||||
|> cast(params, [:url, :events, :enabled, :internal])
|
|> cast(params, [:url, :events, :enabled, :internal])
|
||||||
|
|> validate_events_present()
|
||||||
|> unique_constraint(:url)
|
|> unique_constraint(:url)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -73,6 +75,15 @@ defmodule Pleroma.Webhook do
|
||||||
|> Repo.update()
|
|> Repo.update()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp validate_events_present(changeset) do
|
||||||
|
cond do
|
||||||
|
Keyword.has_key?(changeset.errors, :events) -> changeset
|
||||||
|
get_field(changeset, :internal) -> changeset
|
||||||
|
match?([_ | _], get_field(changeset, :events)) -> changeset
|
||||||
|
true -> add_error(changeset, :events, "can't be blank")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp put_secret(changeset) do
|
defp put_secret(changeset) do
|
||||||
changeset
|
changeset
|
||||||
|> put_change(:secret, generate_secret())
|
|> put_change(:secret, generate_secret())
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,24 @@ defmodule Pleroma.WebhookTest do
|
||||||
assert {:error, _changeset} = Webhook.update(webhook, %{events: [:"status.created"]})
|
assert {:error, _changeset} = Webhook.update(webhook, %{events: [:"status.created"]})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "rejects empty events for non-internal webhooks" do
|
||||||
|
assert {:error, changeset} = Webhook.create(%{url: "https://example.com/webhook", events: []})
|
||||||
|
assert %{events: ["can't be blank"]} = errors_on(changeset)
|
||||||
|
|
||||||
|
{:ok, webhook} =
|
||||||
|
Webhook.create(%{url: "https://example.com/valid-webhook", events: [:"report.created"]})
|
||||||
|
|
||||||
|
assert {:error, changeset} = Webhook.update(webhook, %{events: []})
|
||||||
|
assert %{events: ["can't be blank"]} = errors_on(changeset)
|
||||||
|
|
||||||
|
assert {:ok, _webhook} =
|
||||||
|
Webhook.create(%{
|
||||||
|
url: "https://example.com/internal-webhook",
|
||||||
|
events: [],
|
||||||
|
internal: true
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
test "filter webhooks by type" do
|
test "filter webhooks by type" do
|
||||||
{:ok, %{id: id1}} =
|
{:ok, %{id: id1}} =
|
||||||
Webhook.create(%{url: "https://example.com/webhook1", events: [:"report.created"]})
|
Webhook.create(%{url: "https://example.com/webhook1", events: [:"report.created"]})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue