diff --git a/lib/towerops_web/controllers/api/v1/gaiia_webhook_controller.ex b/lib/towerops_web/controllers/api/v1/gaiia_webhook_controller.ex index c8b25f59..2281557e 100644 --- a/lib/towerops_web/controllers/api/v1/gaiia_webhook_controller.ex +++ b/lib/towerops_web/controllers/api/v1/gaiia_webhook_controller.ex @@ -13,14 +13,21 @@ defmodule ToweropsWeb.Api.V1.GaiiaWebhookController do alias Towerops.Gaiia.Webhooks alias Towerops.Integrations + require Logger + def create(conn, %{"organization_id" => organization_id}) do + # Log all headers for debugging webhook signature issues + Logger.info("Gaiia webhook headers: #{inspect(conn.req_headers)}") + with {:ok, integration} <- get_gaiia_integration(organization_id), {:ok, secret} <- get_webhook_secret(integration), {:ok, raw_body} <- get_raw_body(conn), :ok <- verify_signature(conn, raw_body, secret), {:ok, event} <- get_event(conn.body_params) do - data = Map.get(conn.body_params, "data", %{}) - payload = %{"entity_id" => Map.get(data, "id"), "data" => data} + # Gaiia sends object data in "payload" field; fall back to "data" for compat + data = Map.get(conn.body_params, "payload", Map.get(conn.body_params, "data", %{})) + entity_id = Map.get(conn.body_params, "objectId", Map.get(data, "id")) + payload = %{"entity_id" => entity_id, "data" => data} Webhooks.process_event(organization_id, event, payload) @@ -109,6 +116,7 @@ defmodule ToweropsWeb.Api.V1.GaiiaWebhookController do end end + defp get_event(%{"eventName" => event}) when is_binary(event), do: {:ok, event} defp get_event(%{"event" => event}) when is_binary(event), do: {:ok, event} defp get_event(_), do: {:error, :missing_event}