feat: Support destroying records. #8

Merged
james merged 2 commits from destroy into main 2023-10-02 15:42:15 +13:00
4 changed files with 30 additions and 4 deletions

View file

@ -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

View file

@ -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
@ -126,6 +127,7 @@ defmodule AshCubDB.DataLayer do
{:ok, db} <- start(resource),
{:ok, record} <- Changeset.apply_attributes(changeset),
{:ok, key, data} <- Serde.serialise(record),
{:ok, key} <- maybe_wrap_in_tenant(key, changeset),
true <- CubDB.has_key?(db, key),
:ok <- CubDB.put(db, key, data) do
{:ok, set_loaded(record)}
@ -135,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

View file

@ -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()

View file

@ -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