fix: update_project_metadata keeps fields absent from attrs instead of resetting them

This commit is contained in:
2026-07-17 08:57:20 +02:00
parent 505527ae4f
commit b016f6d812
5 changed files with 47 additions and 25 deletions

View File

@@ -318,6 +318,8 @@ defmodule BDS.Metadata do
}
end
# Keys absent from attrs are left out entirely, so the merge in
# update_project_metadata/2 keeps their current values (partial update).
defp normalize_project_metadata_attrs(attrs, project) do
%{
name: attr(attrs, :name) || project.name,
@@ -333,6 +335,26 @@ defmodule BDS.Metadata do
semantic_similarity_enabled: attr(attrs, :semantic_similarity_enabled) || false,
blog_languages: normalize_language_list(attr(attrs, :blog_languages) || [])
}
|> Map.take(present_attr_keys(attrs))
end
defp present_attr_keys(attrs) do
Enum.filter(
[
:name,
:description,
:public_url,
:main_language,
:default_author,
:max_posts_per_page,
:image_import_concurrency,
:blogmark_category,
:pico_theme,
:semantic_similarity_enabled,
:blog_languages
],
fn key -> Map.has_key?(attrs, key) or Map.has_key?(attrs, Atom.to_string(key)) end
)
end
defp normalize_category_settings(settings) do

View File

@@ -762,7 +762,8 @@ defmodule BDS.Scripting.ApiDocs do
%{
module: "meta",
name: "update_project_metadata",
description: "Update metadata for the current project.",
description:
"Update metadata for the current project. Keys omitted from updates keep their current values.",
params: [%{name: "updates", type: "table", required: true}],
returns: "ProjectMetadata | nil"
},

View File

@@ -388,30 +388,8 @@ defmodule BDS.UI.SettingsForm do
)
end
# Project, technology and style all live in the same metadata record;
# `Metadata.update_project_metadata/2` treats missing keys as nil, so the
# current values are always passed along and only the edits override them.
defp save_project_metadata(project_id, overrides) do
{:ok, metadata} = Metadata.get_project_metadata(project_id)
attrs =
metadata
|> Map.take([
:name,
:description,
:public_url,
:main_language,
:default_author,
:max_posts_per_page,
:image_import_concurrency,
:blogmark_category,
:pico_theme,
:semantic_similarity_enabled,
:blog_languages
])
|> Map.merge(overrides)
case Metadata.update_project_metadata(project_id, attrs) do
case Metadata.update_project_metadata(project_id, overrides) do
{:ok, _metadata} -> :ok
{:error, reason} -> {:error, reason}
end