Skip to content

Commit 669245c

Browse files
committed
Save changeset errors and data for GitHub webhooks
1 parent f82f9cd commit 669245c

File tree

8 files changed

+90
-22
lines changed

8 files changed

+90
-22
lines changed

lib/code_corps/github/event.ex

+25-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ defmodule CodeCorps.GitHub.Event do
77
alias CodeCorps.{GithubEvent, Repo}
88
alias Ecto.Changeset
99

10+
defmodule GitHubEventError do
11+
defexception [:reason]
12+
13+
def exception(reason),
14+
do: %__MODULE__{reason: reason}
15+
16+
def message(%__MODULE__{reason: reason}),
17+
do: reason
18+
end
19+
1020
@type error :: atom | Changeset.t
1121

1222
@doc ~S"""
@@ -33,11 +43,24 @@ defmodule CodeCorps.GitHub.Event do
3343
|> Changeset.change(%{status: "processed"})
3444
|> Repo.update()
3545
end
36-
def stop_processing({:error, reason}, %GithubEvent{} = event) do
37-
changes = %{status: "errored", failure_reason: reason |> Atom.to_string}
46+
def stop_processing({:error, reason, error}, %GithubEvent{} = event) do
47+
%GitHubEventError{reason: error}
48+
|> Sentry.capture_exception([stacktrace: System.stacktrace()])
49+
50+
changes = %{
51+
status: "errored",
52+
data: error |> format_data_if_exists(),
53+
error: error |> Kernel.inspect(pretty: true),
54+
failure_reason: reason |> Atom.to_string()
55+
}
3856

3957
event
4058
|> Changeset.change(changes)
4159
|> Repo.update()
4260
end
61+
62+
defp format_data_if_exists(%Ecto.Changeset{data: data}) do
63+
data |> Kernel.inspect(pretty: true)
64+
end
65+
defp format_data_if_exists(_error), do: nil
4366
end

lib/code_corps/github/sync/sync.ex

+13-14
Original file line numberDiff line numberDiff line change
@@ -232,18 +232,17 @@ defmodule CodeCorps.GitHub.Sync do
232232
defp marshall_result({:ok, %{github_pull_request: _, github_issue: _}} = result), do: result
233233
defp marshall_result({:ok, %{github_pull_request: pull_request}}), do: {:ok, pull_request}
234234
defp marshall_result({:ok, %{task: task}}), do: {:ok, task}
235-
defp marshall_result({:error, :repo, :unmatched_project, _steps}), do: {:ok, []}
236-
defp marshall_result({:error, :repo, :unmatched_repository, _steps}), do: {:error, :repo_not_found}
237-
defp marshall_result({:error, :fetch_issue, _, _steps}), do: {:error, :fetching_issue}
238-
defp marshall_result({:error, :fetch_pull_request, _, _steps}), do: {:error, :fetching_pull_request}
239-
defp marshall_result({:error, :github_pull_request, %Ecto.Changeset{}, _steps}), do: {:error, :validating_github_pull_request}
240-
defp marshall_result({:error, :github_issue, %Ecto.Changeset{}, _steps}), do: {:error, :validating_github_issue}
241-
defp marshall_result({:error, :github_comment, %Ecto.Changeset{}, _steps}), do: {:error, :validating_github_comment}
242-
defp marshall_result({:error, :comment_user, %Ecto.Changeset{}, _steps}), do: {:error, :validating_user}
243-
defp marshall_result({:error, :comment_user, :multiple_users, _steps}), do: {:error, :multiple_comment_users_match}
244-
defp marshall_result({:error, :issue_user, %Ecto.Changeset{}, _steps}), do: {:error, :validating_user}
245-
defp marshall_result({:error, :issue_user, :multiple_users, _steps}), do: {:error, :multiple_issue_users_match}
246-
defp marshall_result({:error, :comment, {_comments, _errors}, _steps}), do: {:error, :validating_comment}
247-
defp marshall_result({:error, :task, %Ecto.Changeset{}, _steps}), do: {:error, :validating_task}
248-
defp marshall_result({:error, _errored_step, _error_response, _steps}), do: {:error, :unexpected_transaction_outcome}
235+
defp marshall_result({:error, :repo, :unmatched_repository, _steps}), do: {:error, :repo_not_found, %{}}
236+
defp marshall_result({:error, :fetch_issue, _, _steps}), do: {:error, :fetching_issue, %{}}
237+
defp marshall_result({:error, :fetch_pull_request, _, _steps}), do: {:error, :fetching_pull_request, %{}}
238+
defp marshall_result({:error, :github_pull_request, %Ecto.Changeset{} = changeset, _steps}), do: {:error, :validating_github_pull_request, changeset}
239+
defp marshall_result({:error, :github_issue, %Ecto.Changeset{} = changeset, _steps}), do: {:error, :validating_github_issue, changeset}
240+
defp marshall_result({:error, :github_comment, %Ecto.Changeset{} = changeset, _steps}), do: {:error, :validating_github_comment, changeset}
241+
defp marshall_result({:error, :comment_user, %Ecto.Changeset{} = changeset, _steps}), do: {:error, :validating_user, changeset}
242+
defp marshall_result({:error, :comment_user, :multiple_users, _steps}), do: {:error, :multiple_comment_users_match, %{}}
243+
defp marshall_result({:error, :issue_user, %Ecto.Changeset{} = changeset, _steps}), do: {:error, :validating_user, changeset}
244+
defp marshall_result({:error, :issue_user, :multiple_users, _steps}), do: {:error, :multiple_issue_users_match, %{}}
245+
defp marshall_result({:error, :comment, %Ecto.Changeset{} = changeset, _steps}), do: {:error, :validating_comment, changeset}
246+
defp marshall_result({:error, :task, %Ecto.Changeset{} = changeset, _steps}), do: {:error, :validating_task, changeset}
247+
defp marshall_result({:error, _errored_step, error_response, _steps}), do: {:error, :unexpected_transaction_outcome, error_response}
249248
end

lib/code_corps/model/github_event.ex

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ defmodule CodeCorps.GithubEvent do
66

77
schema "github_events" do
88
field :action, :string
9+
field :data, :string
910
field :failure_reason, :string
1011
field :github_delivery_id, :string
1112
field :payload, :map
13+
field :error, :string
1214
field :status, :string
1315
field :type, :string
1416

@@ -20,7 +22,7 @@ defmodule CodeCorps.GithubEvent do
2022
"""
2123
def changeset(struct, params \\ %{}) do
2224
struct
23-
|> cast(params, [:action, :github_delivery_id, :payload, :status, :type])
25+
|> cast(params, [:action, :data, :github_delivery_id, :payload, :error, :status, :type])
2426
|> validate_required([:action, :github_delivery_id, :payload, :status, :type])
2527
end
2628
end

lib/code_corps_web/views/github_event_view.ex

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ defmodule CodeCorpsWeb.GithubEventView do
55

66
attributes [
77
:action, :event_type, :failure_reason, :github_delivery_id, :inserted_at,
8-
:payload, :status, :updated_at
8+
:payload, :error, :status, :updated_at
99
]
1010

1111
def event_type(github_event, _conn) do
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
defmodule CodeCorps.Repo.Migrations.AddSerializedErrorToGithubEvents do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:github_events) do
6+
add :data, :text
7+
add :error, :text
8+
end
9+
end
10+
end

priv/repo/structure.sql

+4-2
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,9 @@ CREATE TABLE github_events (
284284
inserted_at timestamp without time zone NOT NULL,
285285
updated_at timestamp without time zone NOT NULL,
286286
payload jsonb,
287-
failure_reason character varying(255)
287+
failure_reason character varying(255),
288+
data text,
289+
error text
288290
);
289291

290292

@@ -3799,5 +3801,5 @@ ALTER TABLE ONLY users
37993801
-- PostgreSQL database dump complete
38003802
--
38013803

3802-
INSERT INTO "schema_migrations" (version) VALUES (20160723215749), (20160804000000), (20160804001111), (20160805132301), (20160805203929), (20160808143454), (20160809214736), (20160810124357), (20160815125009), (20160815143002), (20160816020347), (20160816034021), (20160817220118), (20160818000944), (20160818132546), (20160820113856), (20160820164905), (20160822002438), (20160822004056), (20160822011624), (20160822020401), (20160822044612), (20160830081224), (20160830224802), (20160911233738), (20160912002705), (20160912145957), (20160918003206), (20160928232404), (20161003185918), (20161019090945), (20161019110737), (20161020144622), (20161021131026), (20161031001615), (20161121005339), (20161121014050), (20161121043941), (20161121045709), (20161122015942), (20161123081114), (20161123150943), (20161124085742), (20161125200620), (20161126045705), (20161127054559), (20161205024856), (20161207112519), (20161209192504), (20161212005641), (20161214005935), (20161215052051), (20161216051447), (20161218005913), (20161219160401), (20161219163909), (20161220141753), (20161221085759), (20161226213600), (20161231063614), (20170102130055), (20170102181053), (20170104113708), (20170104212623), (20170104235423), (20170106013143), (20170115035159), (20170115230549), (20170121014100), (20170131234029), (20170201014901), (20170201025454), (20170201035458), (20170201183258), (20170220032224), (20170224233516), (20170226050552), (20170228085250), (20170308214128), (20170308220713), (20170308222552), (20170313130611), (20170318032449), (20170318082740), (20170324194827), (20170424215355), (20170501225441), (20170505224222), (20170526095401), (20170602000208), (20170622205732), (20170626231059), (20170628092119), (20170628213609), (20170629183404), (20170630140136), (20170706132431), (20170707213648), (20170711122252), (20170717092127), (20170725060612), (20170727052644), (20170731130121), (20170814131722), (20170913114958), (20170921014405), (20170925214512), (20170925230419), (20170926134646), (20170927100300), (20170928234412), (20171003134956), (20171003225853), (20171006063358), (20171006161407), (20171012215106), (20171012221231), (20171016125229), (20171016125516), (20171016223356), (20171016235656), (20171017235433), (20171019191035), (20171025184225), (20171026010933), (20171027061833), (20171028011642), (20171028173508), (20171030182857), (20171031232023), (20171031234356), (20171101023309), (20171104013543), (20171106045740), (20171106050209), (20171106103153), (20171106200036), (20171109231538), (20171110001134), (20171114010851), (20171114033357), (20171114225214), (20171114225713), (20171114232534), (20171115201624);
3804+
INSERT INTO "schema_migrations" (version) VALUES (20160723215749), (20160804000000), (20160804001111), (20160805132301), (20160805203929), (20160808143454), (20160809214736), (20160810124357), (20160815125009), (20160815143002), (20160816020347), (20160816034021), (20160817220118), (20160818000944), (20160818132546), (20160820113856), (20160820164905), (20160822002438), (20160822004056), (20160822011624), (20160822020401), (20160822044612), (20160830081224), (20160830224802), (20160911233738), (20160912002705), (20160912145957), (20160918003206), (20160928232404), (20161003185918), (20161019090945), (20161019110737), (20161020144622), (20161021131026), (20161031001615), (20161121005339), (20161121014050), (20161121043941), (20161121045709), (20161122015942), (20161123081114), (20161123150943), (20161124085742), (20161125200620), (20161126045705), (20161127054559), (20161205024856), (20161207112519), (20161209192504), (20161212005641), (20161214005935), (20161215052051), (20161216051447), (20161218005913), (20161219160401), (20161219163909), (20161220141753), (20161221085759), (20161226213600), (20161231063614), (20170102130055), (20170102181053), (20170104113708), (20170104212623), (20170104235423), (20170106013143), (20170115035159), (20170115230549), (20170121014100), (20170131234029), (20170201014901), (20170201025454), (20170201035458), (20170201183258), (20170220032224), (20170224233516), (20170226050552), (20170228085250), (20170308214128), (20170308220713), (20170308222552), (20170313130611), (20170318032449), (20170318082740), (20170324194827), (20170424215355), (20170501225441), (20170505224222), (20170526095401), (20170602000208), (20170622205732), (20170626231059), (20170628092119), (20170628213609), (20170629183404), (20170630140136), (20170706132431), (20170707213648), (20170711122252), (20170717092127), (20170725060612), (20170727052644), (20170731130121), (20170814131722), (20170913114958), (20170921014405), (20170925214512), (20170925230419), (20170926134646), (20170927100300), (20170928234412), (20171003134956), (20171003225853), (20171006063358), (20171006161407), (20171012215106), (20171012221231), (20171016125229), (20171016125516), (20171016223356), (20171016235656), (20171017235433), (20171019191035), (20171025184225), (20171026010933), (20171027061833), (20171028011642), (20171028173508), (20171030182857), (20171031232023), (20171031234356), (20171101023309), (20171104013543), (20171106045740), (20171106050209), (20171106103153), (20171106200036), (20171109231538), (20171110001134), (20171114010851), (20171114033357), (20171114225214), (20171114225713), (20171114232534), (20171115201624), (20171115225358);
38033805

test/lib/code_corps/github/sync/sync_test.exs

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ defmodule CodeCorps.GitHub.SyncTest do
144144
github_repo = setup_coderly_repo()
145145

146146
with_real_api do
147-
Sync.sync_repo(github_repo)
147+
Sync.sync_repo(github_repo)
148148
end
149149

150150
repo = Repo.one(GithubRepo)

test/lib/code_corps/github/webhook/handler_test.exs

+33-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ defmodule CodeCorps.GitHub.Webhook.HandlerTest do
88
alias CodeCorps.{
99
GithubEvent,
1010
GitHub.Webhook.Handler,
11-
Repo
11+
Repo,
12+
Task
1213
}
1314

1415
defp setup_repo(github_repo_id) do
@@ -240,6 +241,37 @@ defmodule CodeCorps.GitHub.Webhook.HandlerTest do
240241
end
241242
end
242243

244+
describe "handle_supported/3 when there are errors" do
245+
test "serializes error output" do
246+
%{"repository" => %{"id" => github_repo_id}}
247+
= opened_payload = load_event_fixture("issues_opened")
248+
249+
setup_repo(github_repo_id)
250+
251+
{:ok, %GithubEvent{}} = Handler.handle_supported("issues", "abc-123", opened_payload)
252+
253+
edited_payload = load_event_fixture("issues_edited")
254+
255+
edited_payload =
256+
edited_payload
257+
|> put_in(["issue", "updated_at"], "2006-05-05T23:40:28Z")
258+
259+
task = Repo.one(Task)
260+
changeset = Task.update_changeset(task, %{title: "New title", updated_from: "codecorps"})
261+
Repo.update!(changeset)
262+
263+
{:ok, %GithubEvent{} = event} = Handler.handle_supported("issues", "abc-456", edited_payload)
264+
265+
assert event.action == "edited"
266+
assert event.github_delivery_id == "abc-456"
267+
assert event.data == Repo.one(Task) |> Kernel.inspect(pretty: true)
268+
assert event.error # This is difficult to test, so just assert presence
269+
assert event.payload == edited_payload
270+
assert event.status == "errored"
271+
assert event.type == "issues"
272+
end
273+
end
274+
243275
describe "handle_unsupported/3" do
244276
[
245277
{"installation", "deleted"},

0 commit comments

Comments
 (0)