From e0b25562a8813daa6d9d0c69d8cd67e77a046de3 Mon Sep 17 00:00:00 2001 From: Zack Siri Date: Fri, 21 Jun 2024 18:53:49 +0700 Subject: [PATCH] implement transtions and state machine for cluster --- lib/polar/machines/cluster.ex | 7 +++++ lib/polar/machines/cluster/event.ex | 12 ++++++++ lib/polar/machines/cluster/transit.ex | 2 ++ lib/polar/machines/cluster/triggers.ex | 1 + .../20240621115038_create_cluster_events.exs | 28 +++++++++++++++++++ 5 files changed, 50 insertions(+) create mode 100644 lib/polar/machines/cluster/event.ex create mode 100644 priv/repo/migrations/20240621115038_create_cluster_events.exs diff --git a/lib/polar/machines/cluster.ex b/lib/polar/machines/cluster.ex index c6e3268..5098d38 100644 --- a/lib/polar/machines/cluster.ex +++ b/lib/polar/machines/cluster.ex @@ -3,6 +3,13 @@ defmodule Polar.Machines.Cluster do import Ecto.Changeset alias __MODULE__.Credential + alias __MODULE__.Transitions + alias __MODULE__.Event + + use Eventful.Transitable + + Transitions + |> governs(:current_state, on: Event) @valid_attrs ~w( name diff --git a/lib/polar/machines/cluster/event.ex b/lib/polar/machines/cluster/event.ex new file mode 100644 index 0000000..b1d5dc7 --- /dev/null +++ b/lib/polar/machines/cluster/event.ex @@ -0,0 +1,12 @@ +defmodule Polar.Machines.Cluster.Event do + alias Polar.Machines.Cluster + alias Polar.Accounts.User + + use Eventful, + parent: {:cluster, Cluster}, + actor: {:user, User} + + alias Cluster.Transitions + + handle(:transitions, using: Transitions) +end diff --git a/lib/polar/machines/cluster/transit.ex b/lib/polar/machines/cluster/transit.ex index 5842269..d2ed892 100644 --- a/lib/polar/machines/cluster/transit.ex +++ b/lib/polar/machines/cluster/transit.ex @@ -1,4 +1,6 @@ defimpl Eventful.Transit, for: Polar.Machines.Cluster do + alias Polar.Machines.Cluster.Event + def perform(cluster, user, event_name, options \\ []) do comment = Keyword.get(options, :comment) domain = Keyword.get(options, :domain, "transitions") diff --git a/lib/polar/machines/cluster/triggers.ex b/lib/polar/machines/cluster/triggers.ex index 65df0e9..bab4450 100644 --- a/lib/polar/machines/cluster/triggers.ex +++ b/lib/polar/machines/cluster/triggers.ex @@ -2,6 +2,7 @@ defmodule Polar.Machines.Cluster.Triggers do use Eventful.Trigger alias Polar.Machines.Cluster + alias Polar.Machines.Cluster.Connect Cluster |> trigger([currently: "connecting"], fn event, cluster -> diff --git a/priv/repo/migrations/20240621115038_create_cluster_events.exs b/priv/repo/migrations/20240621115038_create_cluster_events.exs new file mode 100644 index 0000000..6d35608 --- /dev/null +++ b/priv/repo/migrations/20240621115038_create_cluster_events.exs @@ -0,0 +1,28 @@ +defmodule Polar.Repo.Migrations.CreateClusterEvents do + use Ecto.Migration + + def change do + create table(:cluster_events) do + add(:name, :citext, null: false) + add(:domain, :citext, null: false) + add(:metadata, :map, default: "{}") + + add( + :cluster_id, + references(:clusters, on_delete: :restrict), + null: false + ) + + add( + :user_id, + references(:users, on_delete: :restrict), + null: false + ) + + timestamps(type: :utc_datetime_usec) + end + + create index(:cluster_events, [:cluster_id]) + create index(:cluster_events, [:user_id]) + end +end