From 341c1bf8eede5cfa040c6f1a607aa8658c49463b Mon Sep 17 00:00:00 2001 From: Chili Palmer Date: Sun, 21 Jun 2026 13:00:51 +0200 Subject: [PATCH] Simplify rendering path builders --- AUDIT.md | 1 + lib/bds/rendering/links_and_languages.ex | 55 +++++++++++++----------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/AUDIT.md b/AUDIT.md index 4f1b12c..57f46ac 100644 --- a/AUDIT.md +++ b/AUDIT.md @@ -19,6 +19,7 @@ after each item. - [x] `rendering/list_archive.ex` - [x] `rendering/template_selection.ex` - [x] `rendering/metadata.ex` +- [x] `rendering/links_and_languages.ex` --- diff --git a/lib/bds/rendering/links_and_languages.ex b/lib/bds/rendering/links_and_languages.ex index dbd369c..7eb79d9 100644 --- a/lib/bds/rendering/links_and_languages.ex +++ b/lib/bds/rendering/links_and_languages.ex @@ -41,15 +41,8 @@ defmodule BDS.Rendering.LinksAndLanguages do def canonical_media_path_by_source_path(project_id) do Repo.all(from media in MediaAsset, where: media.project_id == ^project_id) |> Enum.reduce(%{}, fn media, acc -> - datetime = Persistence.from_unix_ms!(media.created_at) - source_key = - Path.join([ - "media", - Integer.to_string(datetime.year), - String.pad_leading(Integer.to_string(datetime.month), 2, "0"), - media.original_name - ]) + Path.join(["media" | year_month_path_parts(media.created_at)] ++ [media.original_name]) |> String.downcase() Map.put(acc, source_key, Path.join("/", media.file_path)) @@ -57,24 +50,8 @@ defmodule BDS.Rendering.LinksAndLanguages do end @spec post_path(map(), String.t() | nil) :: String.t() - def post_path(post, language_prefix) - when is_binary(language_prefix) and language_prefix != "" do - String.trim_trailing(language_prefix, "/") <> post_path(post, nil) - end - - def post_path(post, ""), do: post_path(post, nil) - - def post_path(post, nil) do - datetime = Persistence.from_unix_ms!(post.created_at) - - Path.join([ - "/", - Integer.to_string(datetime.year), - String.pad_leading(Integer.to_string(datetime.month), 2, "0"), - String.pad_leading(Integer.to_string(datetime.day), 2, "0"), - post.slug - ]) <> "/" - end + def post_path(post, language_prefix), + do: normalize_language_prefix(language_prefix) <> base_post_path(post) @spec post_path(map(), String.t() | nil, String.t()) :: String.t() def post_path(post, language, main_language) do @@ -136,4 +113,30 @@ defmodule BDS.Rendering.LinksAndLanguages do |> String.split("-", parts: 2) |> hd() end + + defp base_post_path(post) do + "/" <> Path.join(post_date_path_parts(post.created_at) ++ [post.slug]) <> "/" + end + + defp post_date_path_parts(created_at) do + datetime = Persistence.from_unix_ms!(created_at) + year_month_path_parts(datetime) ++ [pad2(datetime.day)] + end + + defp year_month_path_parts(created_at) when is_integer(created_at) do + created_at + |> Persistence.from_unix_ms!() + |> year_month_path_parts() + end + + defp year_month_path_parts(%DateTime{} = datetime) do + [Integer.to_string(datetime.year), pad2(datetime.month)] + end + + defp normalize_language_prefix(prefix) when is_binary(prefix) and prefix != "", + do: String.trim_trailing(prefix, "/") + + defp normalize_language_prefix(_prefix), do: "" + + defp pad2(value), do: value |> Integer.to_string() |> String.pad_leading(2, "0") end