From 00a997293b738680b3d908121c2b69a4414d5ed8 Mon Sep 17 00:00:00 2001 From: Chili Palmer Date: Sat, 25 Apr 2026 13:01:38 +0200 Subject: [PATCH] fix: cleaned up file format handling to stop constant mapping --- lib/bds/maintenance.ex | 30 +++++++-------- lib/bds/media.ex | 27 ++----------- lib/bds/posts.ex | 46 ++++++---------------- lib/bds/scripts.ex | 19 +-------- lib/bds/templates.ex | 19 +-------- test/bds/maintenance_test.exs | 72 ++++++++++++++++++----------------- 6 files changed, 71 insertions(+), 142 deletions(-) diff --git a/lib/bds/maintenance.ex b/lib/bds/maintenance.ex index edc299e..e7b7bf2 100644 --- a/lib/bds/maintenance.ex +++ b/lib/bds/maintenance.ex @@ -72,10 +72,10 @@ defmodule BDS.Maintenance do diff_field("author", post.author, Map.get(fields, "author")), diff_field("language", post.language, Map.get(fields, "language")), diff_field("status", post.status, Map.get(fields, "status")), - diff_field("template_slug", post.template_slug, Map.get(fields, "template_slug")), - diff_field("created_at", post.created_at, Map.get(fields, "created_at")), - diff_field("updated_at", post.updated_at, Map.get(fields, "updated_at")), - diff_field("published_at", post.published_at, Map.get(fields, "published_at")), + diff_field("template_slug", post.template_slug, Map.get(fields, "templateSlug")), + diff_field("created_at", post.created_at, Map.get(fields, "createdAt")), + diff_field("updated_at", post.updated_at, Map.get(fields, "updatedAt")), + diff_field("published_at", post.published_at, Map.get(fields, "publishedAt")), diff_field("tags", post.tags, Map.get(fields, "tags", [])), diff_field("categories", post.categories, Map.get(fields, "categories", [])) ] @@ -110,8 +110,8 @@ defmodule BDS.Maintenance do diff_field("caption", media.caption, Map.get(fields, "caption")), diff_field("author", media.author, Map.get(fields, "author")), diff_field("language", media.language, Map.get(fields, "language")), - diff_field("created_at", media.created_at, Map.get(fields, "created_at")), - diff_field("updated_at", media.updated_at, Map.get(fields, "updated_at")), + diff_field("created_at", media.created_at, Map.get(fields, "createdAt")), + diff_field("updated_at", media.updated_at, Map.get(fields, "updatedAt")), diff_field("tags", media.tags, Map.get(fields, "tags", [])) ] |> Enum.reject(&is_nil/1) @@ -147,14 +147,14 @@ defmodule BDS.Maintenance do diff_field( "translation_for", translation.translation_for, - Map.get(fields, "translation_for") + Map.get(fields, "translationFor") ), - diff_field("created_at", translation.created_at, Map.get(fields, "created_at")), - diff_field("updated_at", translation.updated_at, Map.get(fields, "updated_at")), + diff_field("created_at", translation.created_at, Map.get(fields, "createdAt")), + diff_field("updated_at", translation.updated_at, Map.get(fields, "updatedAt")), diff_field( "published_at", translation.published_at, - Map.get(fields, "published_at") + Map.get(fields, "publishedAt") ) ] |> Enum.reject(&is_nil/1) @@ -193,7 +193,7 @@ defmodule BDS.Maintenance do diff_field( "translation_for", translation.translation_for, - Map.get(fields, "translation_for") + Map.get(fields, "translationFor") ) ] |> Enum.reject(&is_nil/1) @@ -231,8 +231,8 @@ defmodule BDS.Maintenance do diff_field("title", script.title, Map.get(fields, "title")), diff_field("entrypoint", script.entrypoint, Map.get(fields, "entrypoint")), diff_field("enabled", script.enabled, Map.get(fields, "enabled")), - diff_field("created_at", script.created_at, Map.get(fields, "created_at")), - diff_field("updated_at", script.updated_at, Map.get(fields, "updated_at")) + diff_field("created_at", script.created_at, Map.get(fields, "createdAt")), + diff_field("updated_at", script.updated_at, Map.get(fields, "updatedAt")) ] |> Enum.reject(&is_nil/1) @@ -262,8 +262,8 @@ defmodule BDS.Maintenance do [ diff_field("title", template.title, Map.get(fields, "title")), diff_field("enabled", template.enabled, Map.get(fields, "enabled")), - diff_field("created_at", template.created_at, Map.get(fields, "created_at")), - diff_field("updated_at", template.updated_at, Map.get(fields, "updated_at")) + diff_field("created_at", template.created_at, Map.get(fields, "createdAt")), + diff_field("updated_at", template.updated_at, Map.get(fields, "updatedAt")) ] |> Enum.reject(&is_nil/1) diff --git a/lib/bds/media.ex b/lib/bds/media.ex index feb3d93..8304a39 100644 --- a/lib/bds/media.ex +++ b/lib/bds/media.ex @@ -341,7 +341,6 @@ defmodule BDS.Media do defp upsert_media_from_sidecar(project, sidecar_path) do {:ok, fields} = sidecar_path |> File.read!() |> Sidecar.parse_document() - fields = normalize_media_sidecar_fields(fields) relative_sidecar_path = Path.relative_to(sidecar_path, Projects.project_data_dir(project)) relative_file_path = String.trim_trailing(relative_sidecar_path, ".meta") filename = Path.basename(relative_file_path) @@ -351,8 +350,8 @@ defmodule BDS.Media do id: Map.get(fields, "id") || Ecto.UUID.generate(), project_id: project.id, filename: filename, - original_name: Map.get(fields, "original_name") || filename, - mime_type: Map.get(fields, "mime_type") || detect_mime(filename), + original_name: Map.get(fields, "originalName") || filename, + mime_type: Map.get(fields, "mimeType") || detect_mime(filename), size: Map.get(fields, "size", 0), width: blank_to_nil(Map.get(fields, "width")), height: blank_to_nil(Map.get(fields, "height")), @@ -365,8 +364,8 @@ defmodule BDS.Media do sidecar_path: relative_sidecar_path, checksum: nil, tags: Map.get(fields, "tags", []), - created_at: Map.get(fields, "created_at", now), - updated_at: Map.get(fields, "updated_at", now) + created_at: Map.get(fields, "createdAt", now), + updated_at: Map.get(fields, "updatedAt", now) } media = @@ -436,7 +435,6 @@ defmodule BDS.Media do media -> {:ok, fields} = sidecar_path |> File.read!() |> Sidecar.parse_document() - fields = normalize_media_sidecar_fields(fields) now = Persistence.now_ms() language = Map.fetch!(fields, "language") @@ -610,23 +608,6 @@ defmodule BDS.Media do Persistence.atomic_write(path, contents) end - defp normalize_media_sidecar_fields(fields) when is_map(fields) do - [ - {"originalName", "original_name"}, - {"mimeType", "mime_type"}, - {"createdAt", "created_at"}, - {"updatedAt", "updated_at"}, - {"translationFor", "translation_for"}, - {"linkedPostIds", "linked_post_ids"} - ] - |> Enum.reduce(fields, fn {file_key, current_key}, acc -> - case Map.fetch(acc, file_key) do - {:ok, value} -> Map.put_new(acc, current_key, value) - :error -> acc - end - end) - end - defp linked_post_ids(media_id) do case Repo.query("SELECT post_id FROM post_media WHERE media_id = ? ORDER BY sort_order ASC, post_id ASC", [media_id]) do {:ok, %{rows: rows}} -> Enum.map(rows, fn [post_id] -> post_id end) diff --git a/lib/bds/posts.ex b/lib/bds/posts.ex index 7e34fea..73b55cc 100644 --- a/lib/bds/posts.ex +++ b/lib/bds/posts.ex @@ -658,16 +658,16 @@ defmodule BDS.Posts do content: nil, status: parse_post_status(Map.get(fields, "status", "published")), author: Map.get(fields, "author"), - created_at: Map.get(fields, "created_at", now), - updated_at: Map.get(fields, "updated_at", now), - published_at: Map.get(fields, "published_at"), + created_at: Map.get(fields, "createdAt", now), + updated_at: Map.get(fields, "updatedAt", now), + published_at: Map.get(fields, "publishedAt"), file_path: rebuild_file.relative_path, checksum: nil, tags: Map.get(fields, "tags", []), categories: Map.get(fields, "categories", []), - template_slug: Map.get(fields, "template_slug"), + template_slug: Map.get(fields, "templateSlug"), language: Map.get(fields, "language"), - do_not_translate: Map.get(fields, "do_not_translate", false), + do_not_translate: Map.get(fields, "doNotTranslate", false), published_title: nil, published_content: nil, published_tags: nil, @@ -686,7 +686,7 @@ defmodule BDS.Posts do defp upsert_post_translation_from_rebuild_file(project_id, rebuild_file) do fields = rebuild_file.fields - source_post_id = Map.fetch!(fields, "translation_for") + source_post_id = Map.fetch!(fields, "translationFor") source_post = Repo.get!(Post, source_post_id) now = Persistence.now_ms() language = normalize_language(Map.fetch!(fields, "language")) @@ -703,9 +703,9 @@ defmodule BDS.Posts do excerpt: Map.get(fields, "excerpt"), content: nil, status: parse_translation_status(Map.get(fields, "status", "published")), - created_at: Map.get(fields, "created_at", source_post.created_at || now), - updated_at: Map.get(fields, "updated_at", source_post.updated_at || source_post.created_at || now), - published_at: Map.get(fields, "published_at", source_post.published_at), + created_at: Map.get(fields, "createdAt", source_post.created_at || now), + updated_at: Map.get(fields, "updatedAt", source_post.updated_at || source_post.created_at || now), + published_at: Map.get(fields, "publishedAt", source_post.published_at), file_path: rebuild_file.relative_path, checksum: nil } @@ -731,38 +731,14 @@ defmodule BDS.Posts do %{ path: path, relative_path: Path.relative_to(path, Projects.project_data_dir(project)), - fields: normalize_rebuild_fields(fields) + fields: fields } end defp translation_rebuild_file?(%{fields: fields}) do - Map.has_key?(fields, "translation_for") and not Map.has_key?(fields, "slug") + Map.has_key?(fields, "translationFor") and not Map.has_key?(fields, "slug") end - defp normalize_rebuild_fields(fields) when is_map(fields) do - [ - {"translationFor", "translation_for"}, - {"doNotTranslate", "do_not_translate"}, - {"templateSlug", "template_slug"}, - {"createdAt", "created_at"}, - {"updatedAt", "updated_at"}, - {"publishedAt", "published_at"} - ] - |> Enum.reduce(fields, fn {file_key, current_key}, acc -> - case Map.fetch(acc, file_key) do - {:ok, value} -> Map.put_new(acc, current_key, normalize_rebuild_field_value(current_key, value)) - :error -> acc - end - end) - end - - defp normalize_rebuild_field_value(key, value) - when key in ["created_at", "updated_at", "published_at"] do - Persistence.parse_timestamp(value) || value - end - - defp normalize_rebuild_field_value(_key, value), do: value - defp list_matching_files(dir, pattern) do if File.dir?(dir) do Path.join([dir, "**", pattern]) diff --git a/lib/bds/scripts.ex b/lib/bds/scripts.ex index 1a7bd37..b1559ff 100644 --- a/lib/bds/scripts.ex +++ b/lib/bds/scripts.ex @@ -204,7 +204,6 @@ defmodule BDS.Scripts do defp upsert_script_from_file(project_id, project, path) do contents = File.read!(path) {:ok, %{fields: fields}} = Frontmatter.parse_document(contents) - fields = normalize_script_fields(fields) relative_path = Path.relative_to(path, Projects.project_data_dir(project)) now = Persistence.now_ms() @@ -220,8 +219,8 @@ defmodule BDS.Scripts do file_path: relative_path, status: :published, content: nil, - created_at: Map.get(fields, "created_at", now), - updated_at: Map.get(fields, "updated_at", now) + created_at: Map.get(fields, "createdAt", now), + updated_at: Map.get(fields, "updatedAt", now) } script = Repo.get_by(Script, project_id: project_id, slug: attrs.slug) || %Script{} @@ -236,20 +235,6 @@ defmodule BDS.Scripts do defp parse_script_kind("utility"), do: :utility defp parse_script_kind("transform"), do: :transform - defp normalize_script_fields(fields) when is_map(fields) do - [ - {"createdAt", "created_at"}, - {"updatedAt", "updated_at"}, - {"projectId", "project_id"} - ] - |> Enum.reduce(fields, fn {file_key, current_key}, acc -> - case Map.fetch(acc, file_key) do - {:ok, value} -> Map.put_new(acc, current_key, value) - :error -> acc - end - end) - end - defp list_matching_files(dir, pattern) do if File.dir?(dir) do Path.join(dir, pattern) diff --git a/lib/bds/templates.ex b/lib/bds/templates.ex index 4f88bc2..48db5b2 100644 --- a/lib/bds/templates.ex +++ b/lib/bds/templates.ex @@ -343,7 +343,6 @@ defmodule BDS.Templates do defp upsert_template_from_file(project_id, project, path) do contents = File.read!(path) {:ok, %{fields: fields}} = Frontmatter.parse_document(contents) - fields = normalize_template_fields(fields) relative_path = Path.relative_to(path, Projects.project_data_dir(project)) now = Persistence.now_ms() @@ -358,8 +357,8 @@ defmodule BDS.Templates do file_path: relative_path, status: :published, content: nil, - created_at: Map.get(fields, "created_at", now), - updated_at: Map.get(fields, "updated_at", now) + created_at: Map.get(fields, "createdAt", now), + updated_at: Map.get(fields, "updatedAt", now) } template = Repo.get_by(Template, project_id: project_id, slug: attrs.slug) || %Template{} @@ -375,20 +374,6 @@ defmodule BDS.Templates do defp parse_template_kind("not_found"), do: :not_found defp parse_template_kind("partial"), do: :partial - defp normalize_template_fields(fields) when is_map(fields) do - [ - {"createdAt", "created_at"}, - {"updatedAt", "updated_at"}, - {"projectId", "project_id"} - ] - |> Enum.reduce(fields, fn {file_key, current_key}, acc -> - case Map.fetch(acc, file_key) do - {:ok, value} -> Map.put_new(acc, current_key, value) - :error -> acc - end - end) - end - defp list_matching_files(dir, pattern) do if File.dir?(dir) do Path.join(dir, pattern) diff --git a/test/bds/maintenance_test.exs b/test/bds/maintenance_test.exs index 2b60f18..2176323 100644 --- a/test/bds/maintenance_test.exs +++ b/test/bds/maintenance_test.exs @@ -36,9 +36,9 @@ defmodule BDS.MaintenanceTest do "title: Dispatch Post", "slug: dispatch-post", "status: published", - "created_at: 1711843200", - "updated_at: 1711929600", - "published_at: 1712016000", + "createdAt: 1711843200", + "updatedAt: 1711929600", + "publishedAt: 1712016000", "tags:", "categories:", "---", @@ -56,11 +56,11 @@ defmodule BDS.MaintenanceTest do Path.join(media_dir, "asset.txt.meta"), [ "id: dispatch-media", - "original_name: original.txt", - "mime_type: text/plain", + "originalName: original.txt", + "mimeType: text/plain", "size: 11", - "created_at: 1711843200", - "updated_at: 1711929600", + "createdAt: 1711843200", + "updatedAt: 1711929600", "tags:", "" ] @@ -80,8 +80,8 @@ defmodule BDS.MaintenanceTest do "kind: list", "enabled: true", "version: 1", - "created_at: 101", - "updated_at: 202", + "createdAt: 101", + "updatedAt: 202", "---", "
Template
", "" @@ -103,8 +103,8 @@ defmodule BDS.MaintenanceTest do "entrypoint: main", "enabled: true", "version: 1", - "created_at: 301", - "updated_at: 404", + "createdAt: 301", + "updatedAt: 404", "---", "function main() return true end", "" @@ -253,11 +253,11 @@ defmodule BDS.MaintenanceTest do "status: published", "author: Editor", "language: de", - "do_not_translate: false", - "template_slug: ", - "created_at: #{published_post.created_at + 10}", - "updated_at: #{published_post.updated_at + 20}", - "published_at: #{published_post.published_at + 30}", + "doNotTranslate: false", + "templateSlug: ", + "createdAt: #{published_post.created_at + 10}", + "updatedAt: #{published_post.updated_at + 20}", + "publishedAt: #{published_post.published_at + 30}", "tags:", " - beta", "categories:", @@ -276,14 +276,14 @@ defmodule BDS.MaintenanceTest do [ "---", "id: #{published_post_translation.id}", - "translation_for: #{published_post_translation.translation_for}", + "translationFor: #{published_post_translation.translation_for}", "language: #{published_post_translation.language}", "title: Bearbeiteter Beitrag", "excerpt: Bearbeitete Zusammenfassung", "status: published", - "created_at: #{published_post_translation.created_at}", - "updated_at: #{published_post_translation.updated_at}", - "published_at: #{published_post_translation.published_at}", + "createdAt: #{published_post_translation.created_at}", + "updatedAt: #{published_post_translation.updated_at}", + "publishedAt: #{published_post_translation.published_at}", "---", "Bearbeiteter Inhalt", "" @@ -297,16 +297,16 @@ defmodule BDS.MaintenanceTest do media_sidecar_path, [ "id: #{media.id}", - "original_name: #{media.original_name}", - "mime_type: #{media.mime_type}", + "originalName: #{media.original_name}", + "mimeType: #{media.mime_type}", "size: #{media.size}", "title: Edited media title", "alt: Edited alt", "caption: Edited caption", "author: Editor", "language: de", - "created_at: #{media.created_at}", - "updated_at: #{media.updated_at}", + "createdAt: #{media.created_at}", + "updatedAt: #{media.updated_at}", "tags:", " - beta", "" @@ -320,7 +320,7 @@ defmodule BDS.MaintenanceTest do File.write!( media_translation_sidecar_path, [ - "translation_for: #{media.id}", + "translationFor: #{media.id}", "language: #{media_translation.language}", "title: Bearbeiteter Medientitel", "alt: Bearbeiteter Alt-Text", @@ -337,14 +337,15 @@ defmodule BDS.MaintenanceTest do [ "---", "id: #{published_script.id}", + "projectId: #{project.id}", "slug: #{published_script.slug}", "title: Edited Script", "kind: utility", "entrypoint: run", "enabled: false", "version: #{published_script.version}", - "created_at: #{published_script.created_at}", - "updated_at: #{published_script.updated_at}", + "createdAt: #{published_script.created_at}", + "updatedAt: #{published_script.updated_at}", "---", "function run() return false end", "" @@ -359,13 +360,14 @@ defmodule BDS.MaintenanceTest do [ "---", "id: #{published_template.id}", + "projectId: #{project.id}", "slug: #{published_template.slug}", "title: Edited Template", "kind: list", "enabled: false", "version: #{published_template.version}", - "created_at: #{published_template.created_at}", - "updated_at: #{published_template.updated_at}", + "createdAt: #{published_template.created_at}", + "updatedAt: #{published_template.updated_at}", "---", "
Edited
", "" @@ -375,34 +377,34 @@ defmodule BDS.MaintenanceTest do File.write!( Path.join([temp_dir, "posts", "2026", "04", "orphan-post.md"]), - "---\nid: orphan\ntitle: Orphan\nslug: orphan\nstatus: published\ncreated_at: 1\nupdated_at: 1\npublished_at: 1\ntags:\ncategories:\n---\nBody\n" + "---\nid: orphan\ntitle: Orphan\nslug: orphan\nstatus: published\ncreatedAt: 1\nupdatedAt: 1\npublishedAt: 1\ntags:\ncategories:\n---\nBody\n" ) File.write!( Path.join([temp_dir, "posts", "2026", "04", "orphan-post.es.md"]), - "---\nid: orphan-post-translation\ntranslation_for: orphan\nlanguage: es\ntitle: Huerfano\nstatus: published\ncreated_at: 1\nupdated_at: 1\npublished_at: 1\n---\nCuerpo\n" + "---\nid: orphan-post-translation\ntranslationFor: orphan\nlanguage: es\ntitle: Huerfano\nstatus: published\ncreatedAt: 1\nupdatedAt: 1\npublishedAt: 1\n---\nCuerpo\n" ) File.write!(Path.join([temp_dir, "media", "2026", "04", "orphan.txt"]), "orphan") File.write!( Path.join([temp_dir, "media", "2026", "04", "orphan.txt.meta"]), - "id: orphan-media\noriginal_name: orphan.txt\nmime_type: text/plain\nsize: 6\ncreated_at: 1\nupdated_at: 1\ntags:\n" + "id: orphan-media\noriginalName: orphan.txt\nmimeType: text/plain\nsize: 6\ncreatedAt: 1\nupdatedAt: 1\ntags:\n" ) File.write!( Path.join([temp_dir, "media", "2026", "04", "orphan.txt.es.meta"]), - "translation_for: orphan-media\nlanguage: es\ntitle: Huerfano\nalt: Texto\ncaption: Leyenda\n" + "translationFor: orphan-media\nlanguage: es\ntitle: Huerfano\nalt: Texto\ncaption: Leyenda\n" ) File.write!( Path.join([temp_dir, "scripts", "orphan.lua"]), - "---\nid: orphan-script\nslug: orphan-script\ntitle: Orphan Script\nkind: utility\nentrypoint: main\nenabled: true\nversion: 1\ncreated_at: 1\nupdated_at: 1\n---\nfunction main() return true end\n" + "---\nid: orphan-script\nprojectId: #{project.id}\nslug: orphan-script\ntitle: Orphan Script\nkind: utility\nentrypoint: main\nenabled: true\nversion: 1\ncreatedAt: 1\nupdatedAt: 1\n---\nfunction main() return true end\n" ) File.write!( Path.join([temp_dir, "templates", "orphan-view.liquid"]), - "---\nid: orphan-template\nslug: orphan-view\ntitle: Orphan View\nkind: list\nenabled: true\nversion: 1\ncreated_at: 1\nupdated_at: 1\n---\n
Orphan
\n" + "---\nid: orphan-template\nprojectId: #{project.id}\nslug: orphan-view\ntitle: Orphan View\nkind: list\nenabled: true\nversion: 1\ncreatedAt: 1\nupdatedAt: 1\n---\n
Orphan
\n" ) assert {:ok, %{diff_reports: diff_reports, orphan_reports: orphan_reports}} =