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 [:read, :destroy] default_accept [:value, :member_id, :property_type_id] create :create_property do primary? true load [:property_type] end update :update_property do primary? true require_atomic? false load [:property_type] end end attributes do uuid_primary_key :id attribute :value, :union, allow_nil?: true, constraints: [ storage: :type_and_value, types: [ boolean: [type: :boolean], date: [type: :date], integer: [type: :integer], string: [type: :string], email: [type: Mv.Membership.Email], phone: [type: Mv.Membership.PhoneNumber] ] ] end relationships do belongs_to :member, Mv.Membership.Member belongs_to :property_type, Mv.Membership.PropertyType end calculations do calculate :value_to_string, :string, expr(value[:value] <> "") end aggregates do first :property_type_required, :property_type, :required end validations do validate {Mv.Membership.Validations.ValidateProperty, attribute: :value} end end