diff --git a/lib/polar/machines.ex b/lib/polar/machines.ex index 414532a..99ea22b 100644 --- a/lib/polar/machines.ex +++ b/lib/polar/machines.ex @@ -8,4 +8,10 @@ defmodule Polar.Machines do defdelegate create_cluster(params), to: Cluster.Manager, as: :create + + alias __MODULE__.Assessment + + defdelegate create_assessment(version, params), + to: Assessment.Manager, + as: :create end diff --git a/lib/polar/machines/assessment.ex b/lib/polar/machines/assessment.ex index 663275f..cf13485 100644 --- a/lib/polar/machines/assessment.ex +++ b/lib/polar/machines/assessment.ex @@ -9,6 +9,8 @@ defmodule Polar.Machines.Assessment do schema "assessments" do field :current_state, :string, default: "created" + field :check_slug, :string, virtual: true + belongs_to :check, Check belongs_to :cluster, Cluster @@ -20,7 +22,7 @@ defmodule Polar.Machines.Assessment do @doc false def changeset(assessment, attrs) do assessment - |> cast(attrs, [:current_state]) - |> validate_required([:current_state]) + |> cast(attrs, [:cluster_id, :check_slug]) + |> validate_required([:cluster_id, :check_slug]) end end diff --git a/lib/polar/machines/assessment/manager.ex b/lib/polar/machines/assessment/manager.ex new file mode 100644 index 0000000..621f840 --- /dev/null +++ b/lib/polar/machines/assessment/manager.ex @@ -0,0 +1,10 @@ +defmodule Polar.Machines.Assessment.Manager do + alias Polar.Repo + alias Polar.Machines.Assessment + + def create(version, params) do + %Assessment{version_id: version.id} + |> Assessment.changeset(params) + |> Repo.insert() + end +end diff --git a/lib/polar_web/controllers/publish/event_controller.ex b/lib/polar_web/controllers/publish/event_controller.ex new file mode 100644 index 0000000..8f4e90f --- /dev/null +++ b/lib/polar_web/controllers/publish/event_controller.ex @@ -0,0 +1,40 @@ +defmodule PolarWeb.Publish.EventController do + use PolarWeb, :controller + + alias Polar.Repo + alias Polar.Streams.Version + + action_fallback PolarWeb.FallbackController + + def create(conn, %{ + "version_id" => version_id, + "event" => event_params + }) do + with %Version{} = version <- Repo.get(Version, version_id) do + transit_and_render(conn, version, event_params) + end + end + + alias Polar.Machines.Assessment + + def create(conn, %{ + "assessment_id" => assessment_id, + "event" => event_params + }) do + with %Assessment{} = assessment <- Repo.get(Assessment, assessment_id) do + transit_and_render(conn, assessment, event_params) + end + end + + defp transit_and_render( + %{assigns: %{current_user: user}} = conn, + resource, + %{"name" => event_name} + ) do + with {:ok, %{event: event}} <- Eventful.Transit.perform(resource, user, event_name) do + conn + |> put_status(:created) + |> render(:create, %{event: event}) + end + end +end diff --git a/lib/polar_web/controllers/publish/version/event_json.ex b/lib/polar_web/controllers/publish/event_json.ex similarity index 65% rename from lib/polar_web/controllers/publish/version/event_json.ex rename to lib/polar_web/controllers/publish/event_json.ex index 2e82970..2d7fe2a 100644 --- a/lib/polar_web/controllers/publish/version/event_json.ex +++ b/lib/polar_web/controllers/publish/event_json.ex @@ -1,4 +1,4 @@ -defmodule PolarWeb.Publish.Version.EventJSON do +defmodule PolarWeb.Publish.EventJSON do def create(%{event: event}) do %{data: %{id: event.id, name: event.name}} end diff --git a/lib/polar_web/controllers/publish/testing/assessment_controller.ex b/lib/polar_web/controllers/publish/testing/assessment_controller.ex index e69de29..f13cd9c 100644 --- a/lib/polar_web/controllers/publish/testing/assessment_controller.ex +++ b/lib/polar_web/controllers/publish/testing/assessment_controller.ex @@ -0,0 +1,14 @@ +defmodule PolarWeb.Publish.Testing.AssessmentController do + use PolarWeb, :controller + + alias Polar.Repo + alias Polar.Machines + alias Polar.Streams.Version + + def create(conn, %{"version_id" => version_id, "assessment" => assessment_params}) do + with %Version{} = version <- Repo.get(Version, version_id), + {:ok, assessment} <- Machines.create_assessment(version, assessment_params) do + render(conn, :create, %{assessment: assessment}) + end + end +end diff --git a/lib/polar_web/controllers/publish/version/event_controller.ex b/lib/polar_web/controllers/publish/version/event_controller.ex deleted file mode 100644 index 5c43bb8..0000000 --- a/lib/polar_web/controllers/publish/version/event_controller.ex +++ /dev/null @@ -1,20 +0,0 @@ -defmodule PolarWeb.Publish.Version.EventController do - use PolarWeb, :controller - - alias Polar.Repo - alias Polar.Streams.Version - - action_fallback PolarWeb.FallbackController - - def create(%{assigns: %{current_user: current_user}} = conn, %{ - "version_id" => version_id, - "event" => %{"name" => event_name} - }) do - with %Version{} = version <- Repo.get(Version, version_id), - {:ok, %{event: event}} <- Eventful.Transit.perform(version, current_user, event_name) do - conn - |> put_status(:created) - |> render(:create, %{event: event}) - end - end -end diff --git a/lib/polar_web/router.ex b/lib/polar_web/router.ex index eae81b2..bd2bd92 100644 --- a/lib/polar_web/router.ex +++ b/lib/polar_web/router.ex @@ -99,18 +99,22 @@ defmodule PolarWeb.Router do scope "/" do pipe_through :publish - scope "/testing", Testing, as: :testing do - resources "/clusters", ClusterController, only: [:index] - end - resources "/storage", StorageController, only: [:show], singleton: true resources "/products", ProductController, only: [:show] do resources "/versions", VersionController, only: [:create] end - scope "/versions/:version_id", Version, as: :version do - resources "/events", EventController, only: [:create] + resources "/versions/:version_id/events", EventController, only: [:create] + + scope "/testing", as: :testing do + resources "/clusters", Testing.ClusterController, only: [:index] + + resources "/assessments/:assessment_id/events", EventController, only: [:create] + + scope "/versions/:version_id" do + resources "/assessments", Testing.AssessmentController, only: [:create] + end end end end