Skip to content

Commit a84e54f

Browse files
authored
Merge pull request #63 from mike1o1/fix/read-metadata-typed-map-casing
fix: camelize nested keys in read action typed map metadata
2 parents fcd79cf + 8a05642 commit a84e54f

4 files changed

Lines changed: 82 additions & 1 deletion

File tree

lib/ash_typescript/rpc/pipeline.ex

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1341,7 +1341,14 @@ defmodule AshTypescript.Rpc.Pipeline do
13411341
when is_map(filtered_record) do
13421342
metadata_map = Map.get(original_record, :__metadata__, %{})
13431343
extracted_metadata = extract_metadata_fields(metadata_map, show_metadata, rpc_action)
1344-
Map.merge(filtered_record, extracted_metadata)
1344+
formatter = Rpc.output_field_formatter()
1345+
1346+
formatted_metadata =
1347+
Enum.into(extracted_metadata, %{}, fn {key, value} ->
1348+
{key, format_field_names(value, formatter)}
1349+
end)
1350+
1351+
Map.merge(filtered_record, formatted_metadata)
13451352
end
13461353

13471354
defp do_add_read_metadata(filtered_record, _original_record, _show_metadata, _rpc_action) do

test/ash_typescript/rpc/rpc_metadata_test.exs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,38 @@ defmodule AshTypescript.Rpc.MetadataTest do
729729
end
730730
end
731731

732+
describe "READ actions - typed map metadata nested key formatting" do
733+
test "typed map metadata values have camelCase nested keys" do
734+
task = create_task("Test Task")
735+
736+
params = %{
737+
"action" => "read_tasks_with_typed_map_metadata",
738+
"fields" => ["id", "title"],
739+
"metadataFields" => ["auditEntries", "completionInfo"]
740+
}
741+
742+
conn = %Plug.Conn{}
743+
result = Rpc.run_action(:ash_typescript, conn, params)
744+
745+
assert result["success"] == true
746+
tasks = result["data"]
747+
task_result = Enum.find(tasks, &(&1["id"] == task.id))
748+
749+
# Nested keys in {:array, :map} metadata should be camelCase
750+
first_entry = List.first(task_result["auditEntries"])
751+
assert first_entry["fieldName"] == "title"
752+
assert first_entry["oldValue"] == "Old Title"
753+
refute Map.has_key?(first_entry, "field_name")
754+
refute Map.has_key?(first_entry, "old_value")
755+
756+
# Nested keys in :map metadata should be camelCase
757+
assert task_result["completionInfo"]["completedAt"] == "2025-01-15T10:30:00Z"
758+
assert task_result["completionInfo"]["completedBy"] == "user_123"
759+
refute Map.has_key?(task_result["completionInfo"], "completed_at")
760+
refute Map.has_key?(task_result["completionInfo"], "completed_by")
761+
end
762+
end
763+
732764
# Helper function to create tasks
733765
defp create_task(title) do
734766
Task

test/support/domain.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ defmodule AshTypescript.Test.Domain do
211211
rpc_action :destroy_task_metadata_empty, :destroy, show_metadata: []
212212
rpc_action :destroy_task_metadata_one, :destroy, show_metadata: [:some_string]
213213
rpc_action :destroy_task_metadata_two, :destroy, show_metadata: [:some_string, :some_number]
214+
215+
rpc_action :read_tasks_with_typed_map_metadata, :read_with_typed_map_metadata,
216+
show_metadata: nil
214217
end
215218

216219
resource AshTypescript.Test.PostComment

test/support/resources/task.ex

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,45 @@ defmodule AshTypescript.Test.Task do
8989
end
9090
end
9191

92+
read :read_with_typed_map_metadata do
93+
metadata :audit_entries, {:array, :map},
94+
constraints: [
95+
items: [
96+
fields: [
97+
field_name: [type: :string],
98+
old_value: [type: :string]
99+
]
100+
]
101+
]
102+
103+
metadata :completion_info, :map,
104+
constraints: [
105+
fields: [
106+
completed_at: [type: :string],
107+
completed_by: [type: :string]
108+
]
109+
]
110+
111+
prepare fn query, _context ->
112+
Ash.Query.after_action(query, fn _query, results ->
113+
results_with_metadata =
114+
Enum.map(results, fn record ->
115+
record
116+
|> Ash.Resource.put_metadata(:audit_entries, [
117+
%{field_name: "title", old_value: "Old Title"},
118+
%{field_name: "completed", old_value: "false"}
119+
])
120+
|> Ash.Resource.put_metadata(:completion_info, %{
121+
completed_at: "2025-01-15T10:30:00Z",
122+
completed_by: "user_123"
123+
})
124+
end)
125+
126+
{:ok, results_with_metadata}
127+
end)
128+
end
129+
end
130+
92131
read :read_with_invalid_metadata_names do
93132
metadata :meta_1, :string, allow_nil?: false, default: "metadata_value"
94133
metadata :is_valid?, :boolean, allow_nil?: false, default: true

0 commit comments

Comments
 (0)