commit 8d5e61e332c10118905533da5b35511976009dba
parent b1b5bbdd73b3f46e6826ce34005024208ce63f21
Author: srfsh <dev@srf.sh>
Date: Tue, 23 Aug 2022 08:14:42 +0300
Zenflows{Test,}.VF.Plan: add paging support and small improvements
Diffstat:
4 files changed, 63 insertions(+), 46 deletions(-)
diff --git a/src/zenflows/vf/plan/domain.ex b/src/zenflows/vf/plan/domain.ex
@@ -20,6 +20,7 @@ defmodule Zenflows.VF.Plan.Domain do
alias Ecto.Multi
alias Zenflows.DB.Repo
+alias Zenflows.GQL.Paging
alias Zenflows.VF.Plan
@typep repo() :: Ecto.Repo.t()
@@ -27,20 +28,22 @@ alias Zenflows.VF.Plan
@typep id() :: Zenflows.DB.Schema.id()
@typep params() :: Zenflows.DB.Schema.params()
-@spec one(repo(), id()) :: {:ok, Plan.t()} | {:error, String.t()}
-def one(repo \\ Repo, id) do
- one_by(repo, id: id)
-end
-
-@spec one_by(repo(), map() | Keyword.t())
+@spec one(repo(), id() | map() | Keyword.t())
:: {:ok, Plan.t()} | {:error, String.t()}
-def one_by(repo \\ Repo, clauses) do
+def one(repo \\ Repo, _)
+def one(repo, id) when is_binary(id), do: one(repo, id: id)
+def one(repo, clauses) do
case repo.get_by(Plan, clauses) do
nil -> {:error, "not found"}
found -> {:ok, found}
end
end
+@spec all(Paging.params()) :: Paging.result(Plan.t())
+def all(params) do
+ Paging.page(Plan, params)
+end
+
@spec create(params()) :: {:ok, Plan.t()} | {:error, chgset()}
def create(params) do
Multi.new()
@@ -57,7 +60,7 @@ end
def update(id, params) do
Multi.new()
|> Multi.put(:id, id)
- |> Multi.run(:one, &one_by/2)
+ |> Multi.run(:one, &one/2)
|> Multi.update(:update, &Plan.chgset(&1.one, params))
|> Repo.transaction()
|> case do
@@ -70,8 +73,8 @@ end
def delete(id) do
Multi.new()
|> Multi.put(:id, id)
- |> Multi.run(:one, &one_by/2)
- |> Multi.delete(:delete, &(&1.one))
+ |> Multi.run(:one, &one/2)
+ |> Multi.delete(:delete, & &1.one)
|> Repo.transaction()
|> case do
{:ok, %{delete: p}} -> {:ok, p}
diff --git a/src/zenflows/vf/plan/resolv.ex b/src/zenflows/vf/plan/resolv.ex
@@ -20,36 +20,40 @@ defmodule Zenflows.VF.Plan.Resolv do
use Absinthe.Schema.Notation
-alias Zenflows.VF.{Plan, Plan.Domain}
+alias Zenflows.VF.Plan.Domain
-def created(%{id: id}, _, _) do
- Zenflows.DB.ID.ts(id)
+def plan(params, _) do
+ Domain.one(params)
end
-def refinement_of(%Plan{} = plan, _args, _info) do
- plan = Domain.preload(plan, :refinement_of)
- {:ok, plan.refinement_of}
+def plans(params, _) do
+ Domain.all(params)
end
-def plan(%{id: id}, _info) do
- Domain.one(id)
-end
-
-def create_plan(%{plan: params}, _info) do
+def create_plan(%{plan: params}, _) do
with {:ok, plan} <- Domain.create(params) do
{:ok, %{plan: plan}}
end
end
-def update_plan(%{plan: %{id: id} = params}, _info) do
+def update_plan(%{plan: %{id: id} = params}, _) do
with {:ok, plan} <- Domain.update(id, params) do
{:ok, %{plan: plan}}
end
end
-def delete_plan(%{id: id}, _info) do
+def delete_plan(%{id: id}, _) do
with {:ok, _} <- Domain.delete(id) do
{:ok, true}
end
end
+
+def created(%{id: id}, _, _) do
+ Zenflows.DB.ID.ts(id)
+end
+
+def refinement_of(plan, _, _) do
+ plan = Domain.preload(plan, :refinement_of)
+ {:ok, plan.refinement_of}
+end
end
diff --git a/src/zenflows/vf/plan/type.ex b/src/zenflows/vf/plan/type.ex
@@ -31,6 +31,7 @@ uniqueness.
@due "The time the plan is expected to be complete."
@deletable "The plan is able to be deleted or not."
@refinement_of "This plan refines a scenario, making it operational."
+@refinement_of_id "(`Scenario`) #{@refinement_of}"
@desc """
A logical collection of processes that constitute a body of planned work
@@ -58,10 +59,6 @@ object :plan do
field :refinement_of, :scenario, resolve: &Resolv.refinement_of/3
end
-object :plan_response do
- field :plan, non_null(:plan)
-end
-
input_object :plan_create_params do
@desc @name
field :name, non_null(:string)
@@ -72,10 +69,7 @@ input_object :plan_create_params do
@desc @due
field :due, :datetime
- # TODO: When
- # https://github.com/absinthe-graphql/absinthe/issues/1126 results,
- # apply the correct changes if any.
- @desc "(`Scenario`) " <> @refinement_of
+ @desc @refinement_of_id
field :refinement_of_id, :id, name: "refinement_of"
end
@@ -91,20 +85,37 @@ input_object :plan_update_params do
@desc @due
field :due, :datetime
- # TODO: When
- # https://github.com/absinthe-graphql/absinthe/issues/1126 results,
- # apply the correct changes if any.
- @desc "(`Scenario`) " <> @refinement_of
+ @desc @refinement_of_id
field :refinement_of_id, :id, name: "refinement_of"
end
+object :plan_response do
+ field :plan, non_null(:plan)
+end
+
+object :plan_edge do
+ field :cursor, non_null(:id)
+ field :node, non_null(:plan)
+end
+
+object :plan_connection do
+ field :page_info, non_null(:page_info)
+ field :edges, non_null(list_of(non_null(:plan_edge)))
+end
+
object :query_plan do
field :plan, :plan do
arg :id, non_null(:id)
resolve &Resolv.plan/2
end
- #plans(start: ID, limit: Int): [Plan!]
+ field :plans, :plan_connection do
+ arg :first, :integer
+ arg :after, :id
+ arg :last, :integer
+ arg :before, :id
+ resolve &Resolv.plans/2
+ end
end
object :mutation_plan do
diff --git a/test/vf/plan/domain.test.exs b/test/vf/plan/domain.test.exs
@@ -30,7 +30,6 @@ setup do
refinement_of_id: Factory.insert!(:scenario).id,
},
inserted: Factory.insert!(:plan),
- id: Factory.id(),
}
end
@@ -39,18 +38,18 @@ describe "one/1" do
assert {:ok, %Plan{}} = Domain.one(id)
end
- test "with bad id: doesn't find the Plan", %{id: id} do
- assert {:error, "not found"} = Domain.one(id)
+ test "with bad id: doesn't find the Plan" do
+ assert {:error, "not found"} = Domain.one(Factory.id())
end
end
describe "create/1" do
test "with good params: creates a Plan", %{params: params} do
- assert {:ok, %Plan{} = plan} = Domain.create(params)
- assert plan.name == params.name
- assert plan.note == params.note
- assert plan.due == params.due
- assert plan.refinement_of_id == params.refinement_of_id
+ assert {:ok, %Plan{} = new} = Domain.create(params)
+ assert new.name == params.name
+ assert new.note == params.note
+ assert new.due == params.due
+ assert new.refinement_of_id == params.refinement_of_id
end
test "with bad params: doesn't create an" do
@@ -82,8 +81,8 @@ describe "delete/1" do
assert {:error, "not found"} = Domain.one(id)
end
- test "with bad id: doesn't delete the Plan", %{id: id} do
- assert {:error, "not found"} = Domain.delete(id)
+ test "with bad id: doesn't delete the Plan" do
+ assert {:error, "not found"} = Domain.delete(Factory.id())
end
end