From 420daf8a085c18bc7dc91080e74a63649ed5f008 Mon Sep 17 00:00:00 2001 From: lorenzo sanchez fraile Date: Wed, 16 Jul 2025 11:10:05 +0200 Subject: [PATCH 1/3] feat: TD-7175 Added tools intto MapHelper to convert map keys between string and atom --- CHANGELOG.md | 6 +++ lib/td_cache/utils/map_helpers.ex | 61 +++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e0e15f..61f78ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [Unreleased] + +### Added + +- [TD-7175] Added tools intto MapHelper to convert map keys between string and atom + ## [7.7.0] 2025-06-20 ### Added diff --git a/lib/td_cache/utils/map_helpers.ex b/lib/td_cache/utils/map_helpers.ex index d197691..6b4d10c 100644 --- a/lib/td_cache/utils/map_helpers.ex +++ b/lib/td_cache/utils/map_helpers.ex @@ -17,4 +17,65 @@ defmodule TdCache.Utils.MapHelpers do def parse_string(:string, value) when is_atom(value), do: Atom.to_string(value) # def parse_string(:datetime, value) when is_binary(value), do: DateTime.from_iso8601(value) def parse_string(_, value), do: value + + def to_struct(kind, attrs) do + struct = struct(kind) + + Enum.reduce(Map.to_list(struct), struct, fn {k, _}, acc -> + case Map.fetch(attrs, Atom.to_string(k)) do + {:ok, v} -> %{acc | k => v} + :error -> acc + end + end) + end + + def stringify_keys(map, deep \\ false) + + def stringify_keys(map, deep) when is_struct(map) do + map + |> Map.from_struct() + |> stringify_keys(deep) + end + + def stringify_keys(%{} = map, deep) do + map + |> Enum.into(%{}, fn {k, v} -> {stringify_key(k), maybe_stringfy_children(v, deep)} end) + end + + def stringify_keys(value, _deep), do: value + + defp maybe_stringfy_children(v, true), do: stringify_keys(v) + defp maybe_stringfy_children(v, _), do: v + + defp stringify_key(key) when is_atom(key), do: Atom.to_string(key) + defp stringify_key(key), do: key + + def atomize_keys(element, deep \\ false) + + def atomize_keys(%{} = map, deep) do + Enum.into(map, %{}, fn {k, v} -> {atomize_key(k), maybe_atomize_children(v, deep)} end) + end + + def atomize_keys([_ | _] = list, deep) do + Enum.map(list, &atomize_keys(&1, deep)) + end + + def atomize_keys(element, _deep), do: element + + defp atomize_key(key) when is_binary(key), do: String.to_atom(key) + defp atomize_key(key), do: key + + defp maybe_atomize_children(v, true), do: atomize_keys(v, true) + defp maybe_atomize_children(v, _), do: v + + def merge_common(%{} = map1, %{} = map2) do + keys1 = Map.keys(map1) + keys2 = Map.keys(map2) + + keys = MapSet.intersection(MapSet.new(keys1), MapSet.new(keys2)) + map1 = Map.take(map1, MapSet.to_list(keys)) + map2 = Map.take(map2, MapSet.to_list(keys)) + + Map.merge(map1, map2, fn _k, v1, v2 -> v1 ++ v2 end) + end end From b71bfc246b0fdd427e92b88d48b5538bcd8cf786 Mon Sep 17 00:00:00 2001 From: lorenzo sanchez fraile Date: Thu, 31 Jul 2025 15:02:52 +0200 Subject: [PATCH 2/3] feat: TD-7175 added functions to search domain by name in redis --- CHANGELOG.md | 2 +- lib/td_cache/domain_cache.ex | 16 ++++++++++++++++ lib/td_cache/taxonomy_cache.ex | 8 ++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61f78ef..bca2509 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ### Added -- [TD-7175] Added tools intto MapHelper to convert map keys between string and atom +- [TD-7175] Added tools into MapHelper to convert map keys between string and atom. Added functions to search domain by name in redis. ## [7.7.0] 2025-06-20 diff --git a/lib/td_cache/domain_cache.ex b/lib/td_cache/domain_cache.ex index 19c7a70..9750fae 100644 --- a/lib/td_cache/domain_cache.ex +++ b/lib/td_cache/domain_cache.ex @@ -149,6 +149,22 @@ defmodule TdCache.DomainCache do end end + def get_by_name(name) when is_binary(name) do + case Redix.command(["HGETALL", @ids_to_names_key]) do + {:ok, data} -> + data + |> Enum.chunk_every(2) + |> Enum.find(fn [_id, stored_name] -> stored_name == name end) + |> case do + [id, _] -> {:ok, read_domain(id)} + _ -> {:error, :not_found} + end + + _ -> + {:error, :redis_failure} + end + end + defp get_deleted_domains do case Redix.command(["SMEMBERS", @deleted_ids]) do {:ok, ids} -> Enum.map(ids, &String.to_integer/1) diff --git a/lib/td_cache/taxonomy_cache.ex b/lib/td_cache/taxonomy_cache.ex index e2f94b2..29b3f85 100644 --- a/lib/td_cache/taxonomy_cache.ex +++ b/lib/td_cache/taxonomy_cache.ex @@ -132,6 +132,14 @@ defmodule TdCache.TaxonomyCache do DomainCache.put(domain, opts) end + def get_domain_by_name(name) do + case DomainCache.get_by_name(name) do + {:ok, nil} -> nil + {:error, :not_found} -> nil + {:ok, domain} -> domain + end + end + def delete_domain(domain_id, opts \\ []) do delete_local_cache(domain_id) DomainCache.delete(domain_id, opts) From 9b2eb4c6b7eb4ebcef58f69c40c673d70f1874aa Mon Sep 17 00:00:00 2001 From: lorenzo sanchez fraile Date: Mon, 4 Aug 2025 11:15:34 +0200 Subject: [PATCH 3/3] feat: TD-7175 remove usefull code --- CHANGELOG.md | 2 +- lib/td_cache/taxonomy_cache.ex | 8 ---- lib/td_cache/utils/map_helpers.ex | 61 ------------------------------- 3 files changed, 1 insertion(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bca2509..773d92b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ### Added -- [TD-7175] Added tools into MapHelper to convert map keys between string and atom. Added functions to search domain by name in redis. +- [TD-7175] Added search domain in cache by name ## [7.7.0] 2025-06-20 diff --git a/lib/td_cache/taxonomy_cache.ex b/lib/td_cache/taxonomy_cache.ex index 29b3f85..e2f94b2 100644 --- a/lib/td_cache/taxonomy_cache.ex +++ b/lib/td_cache/taxonomy_cache.ex @@ -132,14 +132,6 @@ defmodule TdCache.TaxonomyCache do DomainCache.put(domain, opts) end - def get_domain_by_name(name) do - case DomainCache.get_by_name(name) do - {:ok, nil} -> nil - {:error, :not_found} -> nil - {:ok, domain} -> domain - end - end - def delete_domain(domain_id, opts \\ []) do delete_local_cache(domain_id) DomainCache.delete(domain_id, opts) diff --git a/lib/td_cache/utils/map_helpers.ex b/lib/td_cache/utils/map_helpers.ex index 6b4d10c..d197691 100644 --- a/lib/td_cache/utils/map_helpers.ex +++ b/lib/td_cache/utils/map_helpers.ex @@ -17,65 +17,4 @@ defmodule TdCache.Utils.MapHelpers do def parse_string(:string, value) when is_atom(value), do: Atom.to_string(value) # def parse_string(:datetime, value) when is_binary(value), do: DateTime.from_iso8601(value) def parse_string(_, value), do: value - - def to_struct(kind, attrs) do - struct = struct(kind) - - Enum.reduce(Map.to_list(struct), struct, fn {k, _}, acc -> - case Map.fetch(attrs, Atom.to_string(k)) do - {:ok, v} -> %{acc | k => v} - :error -> acc - end - end) - end - - def stringify_keys(map, deep \\ false) - - def stringify_keys(map, deep) when is_struct(map) do - map - |> Map.from_struct() - |> stringify_keys(deep) - end - - def stringify_keys(%{} = map, deep) do - map - |> Enum.into(%{}, fn {k, v} -> {stringify_key(k), maybe_stringfy_children(v, deep)} end) - end - - def stringify_keys(value, _deep), do: value - - defp maybe_stringfy_children(v, true), do: stringify_keys(v) - defp maybe_stringfy_children(v, _), do: v - - defp stringify_key(key) when is_atom(key), do: Atom.to_string(key) - defp stringify_key(key), do: key - - def atomize_keys(element, deep \\ false) - - def atomize_keys(%{} = map, deep) do - Enum.into(map, %{}, fn {k, v} -> {atomize_key(k), maybe_atomize_children(v, deep)} end) - end - - def atomize_keys([_ | _] = list, deep) do - Enum.map(list, &atomize_keys(&1, deep)) - end - - def atomize_keys(element, _deep), do: element - - defp atomize_key(key) when is_binary(key), do: String.to_atom(key) - defp atomize_key(key), do: key - - defp maybe_atomize_children(v, true), do: atomize_keys(v, true) - defp maybe_atomize_children(v, _), do: v - - def merge_common(%{} = map1, %{} = map2) do - keys1 = Map.keys(map1) - keys2 = Map.keys(map2) - - keys = MapSet.intersection(MapSet.new(keys1), MapSet.new(keys2)) - map1 = Map.take(map1, MapSet.to_list(keys)) - map2 = Map.take(map2, MapSet.to_list(keys)) - - Map.merge(map1, map2, fn _k, v1, v2 -> v1 ++ v2 end) - end end