From 13057b9dbbfa3451e77f0c6f68319d9b05f5d359 Mon Sep 17 00:00:00 2001 From: Philipp Date: Sun, 22 Dec 2024 22:08:55 +0100 Subject: [PATCH] Fix issue with merging existing settings when updating campaign via API --- .../controllers/api_campaign_controller.ex | 9 +++++++-- .../api/api_campaign_controller_test.exs | 20 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/keila_web/api/controllers/api_campaign_controller.ex b/lib/keila_web/api/controllers/api_campaign_controller.ex index 14d9ff1f..fecedaae 100644 --- a/lib/keila_web/api/controllers/api_campaign_controller.ex +++ b/lib/keila_web/api/controllers/api_campaign_controller.ex @@ -79,8 +79,13 @@ defmodule KeilaWeb.ApiCampaignController do project_id = project_id(conn) with campaign = %Mailings.Campaign{} <- Mailings.get_project_campaign(project_id, id) do - settings_id = campaign.settings.id - params = put_in(conn.body_params.data, [:settings, :id], settings_id) + settings_params = + campaign.settings + |> Mailings.Campaign.Settings.changeset(conn.body_params.data[:settings] || %{}) + |> Ecto.Changeset.apply_changes() + |> Map.from_struct() + + params = Map.put(conn.body_params.data, :settings, settings_params) case Mailings.update_campaign(id, params) do {:ok, campaign} -> render(conn, "campaign.json", %{campaign: campaign}) diff --git a/test/keila_web/api/api_campaign_controller_test.exs b/test/keila_web/api/api_campaign_controller_test.exs index 5fb2a8bd..b3dd5fa6 100644 --- a/test/keila_web/api/api_campaign_controller_test.exs +++ b/test/keila_web/api/api_campaign_controller_test.exs @@ -84,6 +84,26 @@ defmodule KeilaWeb.ApiCampaignControllerTest do assert %{subject: "Updated Subject"} = Keila.Mailings.get_campaign(id) end + + @tag :api_campaign_controller + test "also works when settings are not provided", %{authorized_conn: conn, project: project} do + %{id: id} = insert!(:mailings_campaign, project_id: project.id, settings: %{type: "mjml"}) + + body = %{"data" => %{"subject" => "Updated Subject"}} + conn = patch_json(conn, Routes.api_campaign_path(conn, :update, id), body) + + assert %{ + "data" => %{ + "id" => ^id, + "subject" => "Updated Subject", + "settings" => %{ + "type" => "mjml" + } + } + } = json_response(conn, 200) + + assert %{subject: "Updated Subject"} = Keila.Mailings.get_campaign(id) + end end describe "DELETE /api/v1/campaigns/:id" do