From afb25a328c31526186f5e9d42ed3557b89b09a49 Mon Sep 17 00:00:00 2001 From: Thelonius Kort Date: Mon, 26 Dec 2022 19:04:21 +0100 Subject: [PATCH] Add TranslationUnitsMap as content type for Translations --- lib/outlook/translations/translation.ex | 3 +- .../translations/translation_units_map.ex | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 lib/outlook/translations/translation_units_map.ex diff --git a/lib/outlook/translations/translation.ex b/lib/outlook/translations/translation.ex index 8f1c3fb..97c4432 100644 --- a/lib/outlook/translations/translation.ex +++ b/lib/outlook/translations/translation.ex @@ -4,9 +4,10 @@ defmodule Outlook.Translations.Translation do alias Outlook.Accounts.User alias Outlook.Articles.Article + alias Outlook.Translations.TranslationUnitsMap schema "translations" do - field :content, :map + field :content, TranslationUnitsMap field :date, :utc_datetime field :lang, :string field :public, :boolean, default: false diff --git a/lib/outlook/translations/translation_units_map.ex b/lib/outlook/translations/translation_units_map.ex new file mode 100644 index 0000000..536264f --- /dev/null +++ b/lib/outlook/translations/translation_units_map.ex @@ -0,0 +1,33 @@ +defmodule Outlook.Translations.TranslationUnitsMap do + use Ecto.Type + + alias Outlook.InternalTree.TranslationUnit + + def type, do: :map + + def cast(tumap) when is_map(tumap) do + {:ok, tumap} + end + + def cast(_), do: :error + + def load(serialized_map) when is_map(serialized_map) do + tumap = for {key, val_str} <- serialized_map do + val_map = Jason.decode!(val_str, keys: :atoms!) + val_tu = struct(TranslationUnit, %{val_map | status: String.to_atom(val_map.status)}) + {key, val_tu} + end + |> Enum.into(%{}) + {:ok, tumap} + end + + def dump(tumap) when is_map(tumap) do + serialized_map = for {key, val} <- tumap do + {key, Jason.encode!(val)} + end + |> Enum.into(%{}) + {:ok, serialized_map} + end + + def dump(_), do: :error +end