From bdec7e8fe9f855bd5b68138dd54e1ae40268dd9d Mon Sep 17 00:00:00 2001 From: "Tj (bougyman) Vanderpoel" Date: Fri, 21 Aug 2026 10:21:27 -0400 Subject: [PATCH] fix: correct api call for --trash --- app/lib/linear_cli/linear/issue.ex | 23 ++++++++++-- app/test/linear_cli/linear/issue_test.exs | 46 ++++++++++++++--------- documents/ash-domain-erd.adoc | 3 +- 3 files changed, 51 insertions(+), 21 deletions(-) diff --git a/app/lib/linear_cli/linear/issue.ex b/app/lib/linear_cli/linear/issue.ex index 03f7597..da752fb 100644 --- a/app/lib/linear_cli/linear/issue.ex +++ b/app/lib/linear_cli/linear/issue.ex @@ -365,14 +365,31 @@ defmodule LinearCli.Linear.Issue.Update.Close do @moduledoc false use Ash.Resource.ManualUpdate + alias LinearCli.Api alias LinearCli.Linear.Issue def update(changeset, _opts, _context) do args = changeset.arguments - input = %{"stateId" => args.state_id} - input = if args.trash, do: Map.put(input, "trashed", true), else: input - Issue.Update.run(changeset.data.identifier, input) + with {:ok, issue} <- + Issue.Update.run(changeset.data.identifier, %{"stateId" => args.state_id}), + :ok <- maybe_trash(changeset.data.id, args.trash) do + {:ok, issue} + end + end + + defp maybe_trash(_id, false), do: :ok + + defp maybe_trash(id, true) do + case Api.call(trash_document(), %{"id" => id}) do + {:ok, %{"issueArchive" => %{"success" => true}}} -> :ok + {:ok, other} -> {:error, {:unexpected_response, other}} + {:error, reason} -> {:error, reason} + end + end + + defp trash_document do + "mutation($id: String!) { issueArchive(id: $id, trash: true) { success } }" end end diff --git a/app/test/linear_cli/linear/issue_test.exs b/app/test/linear_cli/linear/issue_test.exs index f51fb3d..2dc19a2 100644 --- a/app/test/linear_cli/linear/issue_test.exs +++ b/app/test/linear_cli/linear/issue_test.exs @@ -371,34 +371,46 @@ defmodule LinearCli.Linear.IssueTest do assert updated.state.name == "Done" end - test "sends trashed: true when given via opts" do + test "transitions the issue before trashing it with issueArchive" do issue = struct!(LinearCli.Linear.Issue, id: "i1", identifier: "CRY-1") + test_pid = self() Req.Test.stub(LinearCli.Api, fn conn -> {:ok, body, conn} = Plug.Conn.read_body(conn) - %{"variables" => %{"input" => input}} = Jason.decode!(body) + %{"query" => query, "variables" => variables} = Jason.decode!(body) - assert input == %{"stateId" => "s1", "trashed" => true} + if String.contains?(query, "issueUpdate") do + assert variables["input"] == %{"stateId" => "s1"} + send(test_pid, :transitioned) - Req.Test.json(conn, %{ - "data" => %{ - "issueUpdate" => %{ - "issue" => %{ - "id" => "i1", - "identifier" => "CRY-1", - "title" => "Fix it", - "branchName" => "cry-1-fix-it", - "description" => nil, - "assignee" => nil, - "team" => %{"id" => "t1", "key" => "ENG", "name" => "Engineering"}, - "comments" => %{"nodes" => []} + Req.Test.json(conn, %{ + "data" => %{ + "issueUpdate" => %{ + "issue" => %{ + "id" => "i1", + "identifier" => "CRY-1", + "title" => "Fix it", + "branchName" => "cry-1-fix-it", + "description" => nil, + "assignee" => nil, + "team" => %{"id" => "t1", "key" => "ENG", "name" => "Engineering"}, + "comments" => %{"nodes" => []} + } } } - } - }) + }) + else + assert query =~ "issueArchive(id: $id, trash: true)" + assert variables == %{"id" => "i1"} + send(test_pid, :trashed) + + Req.Test.json(conn, %{"data" => %{"issueArchive" => %{"success" => true}}}) + end end) assert {:ok, _updated} = Linear.close_issue(issue, "s1", %{trash: true}) + assert_receive :transitioned + assert_receive :trashed end test "surfaces a GraphQL error" do diff --git a/documents/ash-domain-erd.adoc b/documents/ash-domain-erd.adoc index 1dc3f01..87ca54f 100644 --- a/documents/ash-domain-erd.adoc +++ b/documents/ash-domain-erd.adoc @@ -340,7 +340,8 @@ manual-implementation module, and the Linear GraphQL operation it calls. | `:close` | update | `Linear.Issue.Update.Close` -| `issueUpdate(id:, input: { stateId, trashed? })` via `Issue.Update.run/2` +| `issueUpdate(id:, input: { stateId })` via `Issue.Update.run/2`, then +`issueArchive(id:, trash: true)` when requested | `Issue` | `set_issue_status`