diff --git a/lib/polar/machines.ex b/lib/polar/machines.ex index 99ea22b..e8cfec7 100644 --- a/lib/polar/machines.ex +++ b/lib/polar/machines.ex @@ -9,9 +9,15 @@ defmodule Polar.Machines do to: Cluster.Manager, as: :create + alias __MODULE__.Check + + defdelegate create_check(params), + to: Check.Manager, + as: :create + alias __MODULE__.Assessment - defdelegate create_assessment(version, params), + defdelegate create_assessment(check, params), to: Assessment.Manager, as: :create end diff --git a/lib/polar/machines/assessment.ex b/lib/polar/machines/assessment.ex index cf13485..c44b481 100644 --- a/lib/polar/machines/assessment.ex +++ b/lib/polar/machines/assessment.ex @@ -6,6 +6,9 @@ defmodule Polar.Machines.Assessment do alias Polar.Machines.Check alias Polar.Machines.Cluster + @valid_attrs ~w(version_id cluster_id check_slug)a + @required_attrs ~w(version_id cluster_id check_slug)a + schema "assessments" do field :current_state, :string, default: "created" @@ -22,7 +25,7 @@ defmodule Polar.Machines.Assessment do @doc false def changeset(assessment, attrs) do assessment - |> cast(attrs, [:cluster_id, :check_slug]) - |> validate_required([:cluster_id, :check_slug]) + |> cast(attrs, @valid_attrs) + |> validate_required(@required_attrs) end end diff --git a/lib/polar/machines/assessment/manager.ex b/lib/polar/machines/assessment/manager.ex index 621f840..30bce08 100644 --- a/lib/polar/machines/assessment/manager.ex +++ b/lib/polar/machines/assessment/manager.ex @@ -2,8 +2,8 @@ defmodule Polar.Machines.Assessment.Manager do alias Polar.Repo alias Polar.Machines.Assessment - def create(version, params) do - %Assessment{version_id: version.id} + def create(check, params) do + %Assessment{check_id: check.id} |> Assessment.changeset(params) |> Repo.insert() end diff --git a/lib/polar/machines/check.ex b/lib/polar/machines/check.ex index 15e2c26..25dc4ac 100644 --- a/lib/polar/machines/check.ex +++ b/lib/polar/machines/check.ex @@ -3,6 +3,8 @@ defmodule Polar.Machines.Check do import Ecto.Changeset schema "checks" do + field :name, :string, virtual: true + field :slug, :string field :description, :string @@ -12,7 +14,16 @@ defmodule Polar.Machines.Check do @doc false def changeset(check, attrs) do check - |> cast(attrs, [:slug, :description]) - |> validate_required([:slug, :description]) + |> cast(attrs, [:name, :description]) + |> validate_required([:name, :description]) + |> generate_slug() + end + + defp generate_slug(changeset) do + if name = get_change(changeset, :name) do + put_change(changeset, :slug, Slug.slugify(name)) + else + changeset + end end end diff --git a/lib/polar/machines/check/manager.ex b/lib/polar/machines/check/manager.ex new file mode 100644 index 0000000..31e0d88 --- /dev/null +++ b/lib/polar/machines/check/manager.ex @@ -0,0 +1,10 @@ +defmodule Polar.Machines.Check.Manager do + alias Polar.Repo + alias Polar.Machines.Check + + def create(params) do + %Check{} + |> Check.changeset(params) + |> Repo.insert() + end +end diff --git a/lib/polar_web/controllers/publish/testing/assessment_controller.ex b/lib/polar_web/controllers/publish/testing/assessment_controller.ex index f13cd9c..e3b903f 100644 --- a/lib/polar_web/controllers/publish/testing/assessment_controller.ex +++ b/lib/polar_web/controllers/publish/testing/assessment_controller.ex @@ -3,11 +3,17 @@ defmodule PolarWeb.Publish.Testing.AssessmentController do 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 + alias Polar.Machines.Check + + def create(conn, %{ + "check_id" => check_id, + "assessment" => assessment_params + }) do + with %Check{} = check <- Repo.get(Check, check_id), + {:ok, assessment} <- Machines.create_assessment(check, assessment_params) do + assessment = Repo.preload(assessment, [:check]) + render(conn, :create, %{assessment: assessment}) end end diff --git a/lib/polar_web/controllers/publish/testing/assessment_json.ex b/lib/polar_web/controllers/publish/testing/assessment_json.ex index e69de29..124bb3b 100644 --- a/lib/polar_web/controllers/publish/testing/assessment_json.ex +++ b/lib/polar_web/controllers/publish/testing/assessment_json.ex @@ -0,0 +1,17 @@ +defmodule PolarWeb.Publish.Testing.AssessmentJSON do + alias Polar.Machines.Assessment + + def create(%{assessment: assessment}) do + %{data: data(assessment)} + end + + defp data(%Assessment{} = assessment) do + %{ + id: assessment.id, + current_state: assessment.current_state, + check: %{ + slug: assessment.check.slug + } + } + end +end diff --git a/lib/polar_web/controllers/publish/testing/check_controller.ex b/lib/polar_web/controllers/publish/testing/check_controller.ex new file mode 100644 index 0000000..e69de29 diff --git a/lib/polar_web/router.ex b/lib/polar_web/router.ex index bd2bd92..3cb9acf 100644 --- a/lib/polar_web/router.ex +++ b/lib/polar_web/router.ex @@ -112,7 +112,7 @@ defmodule PolarWeb.Router do resources "/assessments/:assessment_id/events", EventController, only: [:create] - scope "/versions/:version_id" do + scope "/checks/:check_id" do resources "/assessments", Testing.AssessmentController, only: [:create] end end diff --git a/mix.exs b/mix.exs index 6e76f03..dc430e7 100644 --- a/mix.exs +++ b/mix.exs @@ -77,6 +77,9 @@ defmodule Polar.MixProject do # Cert {:x509, "~> 0.8"}, + # Slug + {:slugify, "~> 1.3"}, + # Encryption {:cloak_ecto, "~> 1.3"}, diff --git a/mix.lock b/mix.lock index 742c8fd..8d49703 100644 --- a/mix.lock +++ b/mix.lock @@ -44,6 +44,7 @@ "plug": {:hex, :plug, "1.15.3", "712976f504418f6dff0a3e554c40d705a9bcf89a7ccef92fc6a5ef8f16a30a97", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cc4365a3c010a56af402e0809208873d113e9c38c401cabd88027ef4f5c01fd2"}, "plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"}, "postgrex": {:hex, :postgrex, "0.17.4", "5777781f80f53b7c431a001c8dad83ee167bcebcf3a793e3906efff680ab62b3", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "6458f7d5b70652bc81c3ea759f91736c16a31be000f306d3c64bcdfe9a18b3cc"}, + "slugify": {:hex, :slugify, "1.3.1", "0d3b8b7e5c1eeaa960e44dce94382bee34a39b3ea239293e457a9c5b47cc6fd3", [:mix], [], "hexpm", "cb090bbeb056b312da3125e681d98933a360a70d327820e4b7f91645c4d8be76"}, "swoosh": {:hex, :swoosh, "1.15.2", "490ea85a98e8fb5178c07039e0d8519839e38127724a58947a668c00db7574ee", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.4 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9f7739c02f6c7c0ca82ee397f3bfe0465dbe4c8a65372ac2a5584bf147dd5831"}, "tailwind": {:hex, :tailwind, "0.2.2", "9e27288b568ede1d88517e8c61259bc214a12d7eed271e102db4c93fcca9b2cd", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "ccfb5025179ea307f7f899d1bb3905cd0ac9f687ed77feebc8f67bdca78565c4"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, diff --git a/test/polar/machines/check/manager_test.exs b/test/polar/machines/check/manager_test.exs new file mode 100644 index 0000000..d536d9a --- /dev/null +++ b/test/polar/machines/check/manager_test.exs @@ -0,0 +1,17 @@ +defmodule Polar.Machines.Check.ManagerTest do + use Polar.DataCase, async: true + + alias Polar.Machines + + describe "create check" do + test "successfully create check" do + assert {:ok, check} = + Machines.create_check(%{ + name: "ipv4 issuing", + description: "checks that ipv4 can be issued." + }) + + assert check.slug == "ipv4-issuing" + end + end +end