commit be0e289f199d57096305643ac981f902354c0a18
parent bc23a1a3150dfa3958448790fd54a0d53a2d42f4
Author: srfsh <dev@srf.sh>
Date: Mon, 22 Aug 2022 20:43:30 +0300
Zenflows{Test,}.VF.Agreement: add paging support and small improvements
Diffstat:
5 files changed, 54 insertions(+), 30 deletions(-)
diff --git a/src/zenflows/vf/agreement/domain.ex b/src/zenflows/vf/agreement/domain.ex
@@ -20,6 +20,7 @@ defmodule Zenflows.VF.Agreement.Domain do
alias Ecto.Multi
alias Zenflows.DB.Repo
+alias Zenflows.GQL.Paging
alias Zenflows.VF.Agreement
@typep repo() :: Ecto.Repo.t()
@@ -27,20 +28,22 @@ alias Zenflows.VF.Agreement
@typep id() :: Zenflows.DB.Schema.id()
@typep params() :: Zenflows.DB.Schema.params()
-@spec one(repo(), id()) :: {:ok, Agreement.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, Agreement.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(Agreement, clauses) do
nil -> {:error, "not found"}
found -> {:ok, found}
end
end
+@spec all(Paging.params()) :: Paging.result(Agreement.t())
+def all(params) do
+ Paging.page(Agreement, params)
+end
+
@spec create(params()) :: {:ok, Agreement.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, &Agreement.chgset(&1.one, params))
|> Repo.transaction()
|> case do
@@ -70,7 +73,7 @@ end
def delete(id) do
Multi.new()
|> Multi.put(:id, id)
- |> Multi.run(:one, &one_by/2)
+ |> Multi.run(:one, &one/2)
|> Multi.delete(:delete, &(&1.one))
|> Repo.transaction()
|> case do
diff --git a/src/zenflows/vf/agreement/resolv.ex b/src/zenflows/vf/agreement/resolv.ex
@@ -20,12 +20,12 @@ defmodule Zenflows.VF.Agreement.Resolv do
alias Zenflows.VF.Agreement.Domain
-def created(%{id: id}, _, _) do
- Zenflows.DB.ID.ts(id)
+def agreement(params, _info) do
+ Domain.one(params)
end
-def agreement(%{id: id}, _info) do
- Domain.one(id)
+def agreements(params, _) do
+ Domain.all(params)
end
def create_agreement(%{agreement: params}, _info) do
@@ -45,4 +45,8 @@ def delete_agreement(%{id: id}, _info) do
{:ok, true}
end
end
+
+def created(%{id: id}, _, _) do
+ Zenflows.DB.ID.ts(id)
+end
end
diff --git a/src/zenflows/vf/agreement/type.ex b/src/zenflows/vf/agreement/type.ex
@@ -43,10 +43,6 @@ object :agreement do
field :created, non_null(:datetime), resolve: &Resolv.created/3
end
-object :agreement_response do
- field :agreement, non_null(:agreement)
-end
-
input_object :agreement_create_params do
@desc @name
field :name, non_null(:string)
@@ -65,11 +61,33 @@ input_object :agreement_update_params do
field :note, :string
end
+object :agreement_response do
+ field :agreement, non_null(:agreement)
+end
+
+object :agreement_edge do
+ field :cursor, non_null(:id)
+ field :node, non_null(:agreement)
+end
+
+object :agreement_connection do
+ field :page_info, non_null(:page_info)
+ field :edges, non_null(list_of(non_null(:agreement_edge)))
+end
+
object :query_agreement do
field :agreement, :agreement do
arg :id, non_null(:id)
resolve &Resolv.agreement/2
end
+
+ field :agreements, :agreement_connection do
+ arg :first, :integer
+ arg :after, :id
+ arg :last, :integer
+ arg :before, :id
+ resolve &Resolv.agreements/2
+ end
end
object :mutation_agreement do
diff --git a/test/vf/agreement/domain.test.exs b/test/vf/agreement/domain.test.exs
@@ -28,7 +28,6 @@ setup do
note: Factory.str("note"),
},
inserted: Factory.insert!(:agreement),
- id: Factory.id(),
}
end
@@ -37,16 +36,16 @@ describe "one/1" do
assert {:ok, %Agreement{}} = Domain.one(id)
end
- test "with bad id: doesn't find the Agreement", %{id: id} do
- assert {:error, "not found"} = Domain.one(id)
+ test "with bad id: doesn't find the Agreement" do
+ assert {:error, "not found"} = Domain.one(Factory.id())
end
end
describe "create/1" do
test "with good params: creates an Agreement", %{params: params} do
- assert {:ok, %Agreement{} = agreem} = Domain.create(params)
- assert agreem.name == params.name
- assert agreem.note == params.note
+ assert {:ok, %Agreement{} = new} = Domain.create(params)
+ assert new.name == params.name
+ assert new.note == params.note
end
test "with bad params: doesn't create an Agreement" do
@@ -74,8 +73,8 @@ describe "delete/1" do
assert {:error, "not found"} = Domain.one(id)
end
- test "with bad id: doesn't delete the Agreement", %{id: id} do
- assert {:error, "not found"} = Domain.delete(id)
+ test "with bad id: doesn't delete the Agreement" do
+ assert {:error, "not found"} = Domain.delete(Factory.id())
end
end
end
diff --git a/test/vf/agreement/type.test.exs b/test/vf/agreement/type.test.exs
@@ -38,18 +38,18 @@ fragment agreement on Agreement {
"""
describe "Query" do
- test "agreement", %{inserted: agreem} do
+ test "agreement", %{inserted: new} do
assert %{data: %{"agreement" => data}} =
run!("""
#{@frag}
query ($id: ID!) {
agreement(id: $id) {...agreement}
}
- """, vars: %{"id" => agreem.id})
+ """, vars: %{"id" => new.id})
- assert data["id"] == agreem.id
- assert data["name"] == agreem.name
- assert data["note"] == agreem.note
+ assert data["id"] == new.id
+ assert data["name"] == new.name
+ assert data["note"] == new.note
assert {:ok, created, 0} = DateTime.from_iso8601(data["created"])
assert DateTime.compare(DateTime.utc_now(), created) != :lt
end