From e6aaf95d63961b4e40df6f51ac382393840c010a Mon Sep 17 00:00:00 2001 From: dev-guy Date: Thu, 10 Jul 2025 11:34:57 -0500 Subject: [PATCH 1/2] id macro -> Extension --- lib/geo/geography/country.ex | 4 ++-- lib/geo/resources/attributes/id.ex | 2 +- lib/geo/resources/extensions/id.ex | 33 ++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 lib/geo/resources/extensions/id.ex diff --git a/lib/geo/geography/country.ex b/lib/geo/geography/country.ex index aebc6c6..22c29ed 100644 --- a/lib/geo/geography/country.ex +++ b/lib/geo/geography/country.ex @@ -2,10 +2,10 @@ defmodule Geo.Geography.Country do use Ash.Resource, otp_app: :geo, domain: Geo.Geography, - data_layer: AshPostgres.DataLayer + data_layer: AshPostgres.DataLayer, + extensions: [Geo.Resources.Extensions.Id] # === Attributes === - use Geo.Resources.Attributes.Id use Geo.Resources.Attributes.Name, allow_nil?: false, unique?: true use Geo.Resources.Attributes.Slug, allow_nil?: false, unique?: true use Geo.Resources.Attributes.Timestamps diff --git a/lib/geo/resources/attributes/id.ex b/lib/geo/resources/attributes/id.ex index 32f595b..538ffc7 100644 --- a/lib/geo/resources/attributes/id.ex +++ b/lib/geo/resources/attributes/id.ex @@ -1,4 +1,4 @@ -defmodule Geo.Resources.Attributes.Id do +defmodule Geo.Resources.Attributes.Id.Defunct do @moduledoc """ """ diff --git a/lib/geo/resources/extensions/id.ex b/lib/geo/resources/extensions/id.ex new file mode 100644 index 0000000..1dbd8bb --- /dev/null +++ b/lib/geo/resources/extensions/id.ex @@ -0,0 +1,33 @@ +defmodule Geo.Resources.Extensions.Id do + @moduledoc """ + An Ash extension that adds a UUID v7 primary key attribute to a resource. + """ + + use Spark.Dsl.Extension, + transformers: [ + __MODULE__.Transformer + ] + + defmodule Transformer do + @moduledoc false + use Spark.Dsl.Transformer + + def before?(Ash.Resource.Transformers.BelongsToAttribute), do: true + def before?(_), do: false + + def transform(dsl_state) do + case Spark.Dsl.Transformer.build_entity( + Ash.Resource.Dsl, + [:attributes], + :uuid_v7_primary_key, + [:id] + ) do + {:ok, attribute} -> + {:ok, Spark.Dsl.Transformer.add_entity(dsl_state, [:attributes], attribute)} + + {:error, error} -> + {:error, error} + end + end + end +end From 2929ef2a7f22614251b581d7648aea055e34d6fd Mon Sep 17 00:00:00 2001 From: dev-guy Date: Thu, 10 Jul 2025 13:16:38 -0500 Subject: [PATCH 2/2] id extension --- lib/geo/resources/extensions/id.ex | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/geo/resources/extensions/id.ex b/lib/geo/resources/extensions/id.ex index 1dbd8bb..e37c3fd 100644 --- a/lib/geo/resources/extensions/id.ex +++ b/lib/geo/resources/extensions/id.ex @@ -16,18 +16,17 @@ defmodule Geo.Resources.Extensions.Id do def before?(_), do: false def transform(dsl_state) do - case Spark.Dsl.Transformer.build_entity( - Ash.Resource.Dsl, - [:attributes], - :uuid_v7_primary_key, - [:id] - ) do - {:ok, attribute} -> - {:ok, Spark.Dsl.Transformer.add_entity(dsl_state, [:attributes], attribute)} + attribute = %Ash.Resource.Attribute{ + name: :id, + type: :uuid_v7, + allow_nil?: false, + writable?: false, + public?: true, + primary_key?: true, + default: &Ash.UUIDv7.generate/0 + } - {:error, error} -> - {:error, error} - end + {:ok, Spark.Dsl.Transformer.add_entity(dsl_state, [:attributes], attribute)} end end end