feat(ash): member and properties

This commit is contained in:
Moritz 2025-04-28 17:56:58 +02:00
parent a194a3494f
commit 505f5535ea
Signed by: moritz
GPG key ID: 1020A035E5DD0824
10 changed files with 455 additions and 1 deletions

35
lib/membership/member.ex Normal file
View file

@ -0,0 +1,35 @@
defmodule Mv.Membership.Member do
use Ash.Resource,
domain: Mv.Membership,
data_layer: AshPostgres.DataLayer
postgres do
table "members"
repo Mv.Repo
end
actions do
defaults [:read, :destroy]
create :create_member do
primary? true
argument :properties, {:array, :map}
change manage_relationship(:properties, type: :create)
end
update :update_member do
primary? true
require_atomic? false
argument :properties, {:array, :map}
change manage_relationship(:properties, on_match: :update, on_no_match: :create)
end
end
attributes do
uuid_v7_primary_key :id
end
relationships do
has_many :properties, Mv.Membership.Property
end
end

View file

@ -0,0 +1,27 @@
defmodule Mv.Membership do
use Ash.Domain,
extensions: [AshPhoenix]
resources do
resource Mv.Membership.Member do
define :create_member, action: :create_member
define :list_members, action: :read
define :update_member, action: :update_member
define :destroy_member, action: :destroy
end
resource Mv.Membership.Property do
define :create_property, action: :create
define :list_property, action: :read
define :update_property, action: :update
define :destroy_property, action: :destroy
end
resource Mv.Membership.PropertyType do
define :create_property_type, action: :create
define :list_property_types, action: :read
define :update_property_type, action: :update
define :destroy_property_type, action: :destroy
end
end
end

View file

@ -0,0 +1,28 @@
defmodule Mv.Membership.Property do
use Ash.Resource,
domain: Mv.Membership,
data_layer: AshPostgres.DataLayer
postgres do
table "properties"
repo Mv.Repo
end
actions do
defaults [:create, :read, :update, :destroy]
default_accept [:value, :member_id, :property_type_id]
end
attributes do
uuid_primary_key :id
attribute :value, :string,
description: "Speichert den Wert, Typ-Interpretation per property_type.typ"
end
relationships do
belongs_to :member, Mv.Membership.Member
belongs_to :property_type, Mv.Membership.PropertyType
end
end

View file

@ -0,0 +1,43 @@
defmodule Mv.Membership.PropertyType do
use Ash.Resource,
domain: Mv.Membership,
data_layer: AshPostgres.DataLayer
postgres do
table "property_types"
repo Mv.Repo
end
actions do
defaults [:create, :read, :update, :destroy]
default_accept [:name, :type, :description, :immutable, :required]
end
attributes do
uuid_primary_key :id
attribute :name, :string, allow_nil?: false, public?: true
attribute :type, :string,
allow_nil?: false,
description: "Definies the datatype `Property.value` is interpreted as"
attribute :description, :string, allow_nil?: true, public?: true
attribute :immutable, :boolean,
default: false,
allow_nil?: false
attribute :required, :boolean,
default: false,
allow_nil?: false
end
relationships do
has_many :properties, Mv.Membership.Property
end
identities do
identity :unique_name, [:name]
end
end