mirror of
https://github.com/ash-project/ash_events.git
synced 2024-09-19 12:52:48 +12:00
153 lines
3 KiB
Elixir
153 lines
3 KiB
Elixir
defmodule AshEventsTest do
|
|
use ExUnit.Case
|
|
|
|
require Ash.Query
|
|
|
|
defmodule Domain do
|
|
use Ash.Domain
|
|
|
|
resources do
|
|
allow_unregistered?(true)
|
|
end
|
|
end
|
|
|
|
defmodule Event do
|
|
use Ash.Resource,
|
|
domain: Domain,
|
|
data_layer: Ash.DataLayer.Ets
|
|
|
|
actions do
|
|
default_accept :*
|
|
defaults([:read, :create, :update, :destroy])
|
|
|
|
update :process do
|
|
change(set_attribute(:processed, true))
|
|
end
|
|
end
|
|
|
|
ets do
|
|
private?(true)
|
|
end
|
|
|
|
attributes do
|
|
uuid_primary_key(:id)
|
|
attribute(:input, :map, allow_nil?: false, public?: true)
|
|
attribute(:resource, :atom, allow_nil?: false, public?: true)
|
|
attribute(:action, :atom, allow_nil?: false, public?: true)
|
|
attribute(:processed, :boolean, allow_nil?: false, default: false, public?: true)
|
|
|
|
attribute :timestamp, :utc_datetime_usec do
|
|
public? true
|
|
default(&DateTime.utc_now/0)
|
|
allow_nil?(false)
|
|
writable?(false)
|
|
end
|
|
end
|
|
end
|
|
|
|
defmodule Profile do
|
|
use Ash.Resource,
|
|
domain: Domain,
|
|
data_layer: Ash.DataLayer.Ets,
|
|
extensions: [AshEvents]
|
|
|
|
events do
|
|
event_resource(Event)
|
|
end
|
|
|
|
actions do
|
|
default_accept :*
|
|
defaults([:create, :read, :update, :destroy])
|
|
end
|
|
|
|
ets do
|
|
private?(true)
|
|
end
|
|
|
|
attributes do
|
|
uuid_primary_key(:id)
|
|
attribute(:bio, :string, public?: true)
|
|
end
|
|
|
|
relationships do
|
|
belongs_to :user, AshEventsTest.User do
|
|
public? true
|
|
allow_nil?(false)
|
|
attribute_writable?(true)
|
|
end
|
|
end
|
|
|
|
code_interface do
|
|
define(:create)
|
|
end
|
|
end
|
|
|
|
defmodule User do
|
|
use Ash.Resource,
|
|
domain: Domain,
|
|
data_layer: Ash.DataLayer.Ets,
|
|
extensions: [AshEvents]
|
|
|
|
events do
|
|
event_resource(Event)
|
|
end
|
|
|
|
ets do
|
|
private?(true)
|
|
end
|
|
|
|
attributes do
|
|
uuid_primary_key(:id)
|
|
attribute(:username, :string, allow_nil?: false, public?: true)
|
|
end
|
|
|
|
actions do
|
|
default_accept :*
|
|
defaults([:read, :update, :destroy])
|
|
|
|
create :create do
|
|
primary?(true)
|
|
|
|
change(
|
|
after_action(fn _changeset, result, _context ->
|
|
Profile.create!(%{user_id: result.id, bio: "Initial Bio!"})
|
|
|
|
{:ok, result}
|
|
end)
|
|
)
|
|
end
|
|
end
|
|
|
|
code_interface do
|
|
define(:create)
|
|
end
|
|
|
|
relationships do
|
|
has_one(:profile, Profile, public?: true)
|
|
end
|
|
end
|
|
|
|
test "test" do
|
|
assert [] = Ash.read!(Event)
|
|
User.create!(%{username: "fred"})
|
|
assert [_, _] = Ash.read!(Event)
|
|
assert [_] = Ash.read!(User)
|
|
assert [_] = Ash.read!(Profile)
|
|
end
|
|
|
|
# defp process() do
|
|
# Event
|
|
# |> Ash.Query.sort(timestamp: :asc, id: :desc)
|
|
# |> Ash.Query.filter(processed == false)
|
|
# |> Api.read!()
|
|
# |> Enum.each(fn event ->
|
|
# event.resource
|
|
# |> Ash.Changeset.for_create(event.action, event.input)
|
|
# |> Api.create!()
|
|
|
|
# event
|
|
# |> Ash.Changeset.for_update(:process)
|
|
# |> Api.update!()
|
|
# end)
|
|
# end
|
|
end
|