defmodule AccessGrid.Webhook do
@moduledoc """
Webhook subscription that receives event notifications. Returned by
`AccessGrid.Console.list_webhooks/1` and `AccessGrid.Console.create_webhook/2`.
Auth-method-specific fields appear only when applicable:
* `private_key` is returned ONLY on `auth_method: "bearer_token"` creation
(sensitive; store on receipt — the server does not return it again).
* `client_cert` and `cert_expires_at` are returned on `auth_method: "mtls"`.
Unused fields are `nil` on the struct.
"""
@type t :: %__MODULE__{
id: String.t() | nil,
name: String.t() | nil,
url: String.t() | nil,
auth_method: String.t() | nil,
created_at: String.t() | nil,
subscribed_events: [String.t()],
private_key: String.t() | nil,
client_cert: String.t() | nil,
cert_expires_at: String.t() | nil
}
defstruct [
:id,
:name,
:url,
:auth_method,
:created_at,
:private_key,
:client_cert,
:cert_expires_at,
subscribed_events: []
]
@doc """
Creates a Webhook struct from an API response map.
"""
@spec from_response(map()) :: t()
def from_response(data) when is_map(data) do
%__MODULE__{
id: data["id"],
name: data["name"],
url: data["url"],
auth_method: data["auth_method"],
created_at: data["created_at"],
subscribed_events: data["subscribed_events"] || [],
private_key: data["private_key"],
client_cert: data["client_cert"],
cert_expires_at: data["cert_expires_at"]
}
end
end