From 2eab92a76acbeda5d3127f50f697b3c852269b70 Mon Sep 17 00:00:00 2001 From: James Harton Date: Mon, 2 Oct 2023 15:36:56 +1300 Subject: [PATCH] feat: Support destroying records. --- README.md | 2 +- lib/ash_cub_db/data_layer.ex | 16 ++++++++++++++++ test/ash_cub_db/data_layer_test.exs | 11 ++++++++++- test/support/post.ex | 4 ++-- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fa1843f..25c5dc6 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ AshCubDb is still a work in progress. Feel free to give it a go. | Read (calculations) | ❌ | | Read (aggregates) | ❌ | | Update | ✅ | -| Destroy | ❌ | +| Destroy | ✅ | ## Github Mirror diff --git a/lib/ash_cub_db/data_layer.ex b/lib/ash_cub_db/data_layer.ex index 4676c50..fc24c48 100644 --- a/lib/ash_cub_db/data_layer.ex +++ b/lib/ash_cub_db/data_layer.ex @@ -53,6 +53,7 @@ defmodule AshCubDB.DataLayer do def can?(resource, :create), do: Dir.writable?(resource) def can?(resource, :update), do: Dir.writable?(resource) def can?(resource, :upsert), do: Dir.writable?(resource) + def can?(resource, :destroy), do: Dir.writable?(resource) def can?(resource, :read), do: Dir.readable?(resource) def can?(_, :multitenancy), do: true def can?(_, :filter), do: true @@ -136,6 +137,21 @@ defmodule AshCubDB.DataLayer do end end + @doc false + @impl true + def destroy(resource, changeset) do + with :ok <- validate_tenant_configuration(resource, changeset.tenant), + {:ok, db} <- start(resource), + {:ok, key, _data} <- Serde.serialise(changeset.data), + {:ok, key} <- maybe_wrap_in_tenant(key, changeset), + true <- CubDB.has_key?(db, key) do + CubDB.delete(db, key) + else + false -> {:error, StaleRecord.exception(resource: resource)} + {:error, reason} -> {:error, reason} + end + end + @doc false @impl true def run_query(query, resource, parent \\ nil) do diff --git a/test/ash_cub_db/data_layer_test.exs b/test/ash_cub_db/data_layer_test.exs index 4aa894e..a5ec942 100644 --- a/test/ash_cub_db/data_layer_test.exs +++ b/test/ash_cub_db/data_layer_test.exs @@ -1,6 +1,6 @@ defmodule AshCubDB.DataLayerTest do use ExUnit.Case, async: true - alias Ash.Query + alias Ash.{Error.Query.NotFound, Query} alias AshCubDB.Info alias Support.{Api, Author, Post} import Support.Factory @@ -157,6 +157,15 @@ defmodule AshCubDB.DataLayerTest do end end + describe "destroy" do + test "records can be destroyed" do + post = insert!(Post) + + assert :ok = Post.destroy(post) + assert {:error, %NotFound{}} = Post.get(post.id) + end + end + defp dump(resource) do resource |> via() diff --git a/test/support/post.ex b/test/support/post.ex index ffac374..15a0b58 100644 --- a/test/support/post.ex +++ b/test/support/post.ex @@ -16,8 +16,7 @@ defmodule Support.Post do end actions do - # defaults ~w[create read update destroy]a - defaults ~w[create read update]a + defaults ~w[create read update destroy]a end relationships do @@ -31,5 +30,6 @@ defmodule Support.Post do define :read define :update define :get, action: :read, get_by: [:id] + define :destroy end end