diff --git a/CHANGELOG.md b/CHANGELOG.md index ca9996d047..dfc6b889eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,10 @@ and this project adheres to ### Fixed +- The workflows REST API now returns a 422 validation error instead of a 500 + when a create request omits `edges`, `jobs`, or `triggers` from the body + rather than sending them as empty lists. + [#4982](https://github.com/OpenFn/lightning/issues/4982) - Sandbox merge no longer deletes a workflow that was added to the project after the sandbox was branched. Such workflows were never part of the sandbox, so they are excluded from the merge screen entirely. Workflows deleted inside the diff --git a/lib/lightning_web/controllers/api/workflows_controller.ex b/lib/lightning_web/controllers/api/workflows_controller.ex index f42bca7b9d..3ad834738a 100644 --- a/lib/lightning_web/controllers/api/workflows_controller.ex +++ b/lib/lightning_web/controllers/api/workflows_controller.ex @@ -413,6 +413,14 @@ defmodule LightningWeb.API.WorkflowsController do ), do: validate_workflow(edges, jobs, triggers, ids_map) + defp validate_workflow(%{} = params, ids_map) do + edges = Map.get(params, "edges", []) + jobs = Map.get(params, "jobs", []) + triggers = Map.get(params, "triggers", []) + + validate_workflow(edges, jobs, triggers, ids_map) + end + defp validate_workflow(edges, jobs, triggers, ids_map) do # {:ok, _ids} <- validate_ids(edges), with {:ok, triggers_ids} <- validate_ids(triggers), diff --git a/test/lightning_web/controllers/api/workflows_controller_test.exs b/test/lightning_web/controllers/api/workflows_controller_test.exs index 62378626a7..d25febb23a 100644 --- a/test/lightning_web/controllers/api/workflows_controller_test.exs +++ b/test/lightning_web/controllers/api/workflows_controller_test.exs @@ -745,6 +745,25 @@ defmodule LightningWeb.API.WorkflowsControllerTest do } end + test "returns 422 when edges, jobs and triggers are omitted", %{ + conn: conn, + project: project + } do + conn = + post( + conn, + ~p"/api/projects/#{project.id}/workflows", + Jason.encode!(%{name: "workflow without children"}) + ) + + assert json_response(conn, 422) == %{ + "id" => nil, + "errors" => %{ + "edges" => ["Missing edge with source_trigger_id."] + } + } + end + test "returns 422 when edges has multiple source triggers", %{ conn: conn, project: project