diff --git a/CHANGELOG.md b/CHANGELOG.md index 70eb1dec33..d7583d42a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -148,6 +148,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) - The workflow version dropdown stayed empty after creating and saving a new workflow, until the page was refreshed. [#4973](https://github.com/OpenFn/lightning/issues/4973) diff --git a/lib/lightning_web/controllers/api/workflows_controller.ex b/lib/lightning_web/controllers/api/workflows_controller.ex index a005741ff2..d2df495f7d 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 48aadfd1b6..fc4ee56287 100644 --- a/test/lightning_web/controllers/api/workflows_controller_test.exs +++ b/test/lightning_web/controllers/api/workflows_controller_test.exs @@ -782,6 +782,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