Skip to content

Commit c486af6

Browse files
KaFai Choimikeover
authored andcommitted
add try rescue blcok for all db operation in schema
1 parent 18a1424 commit c486af6

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

lib/repo/schema.ex

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
defmodule ExAudit.Schema do
2+
require Logger
23
def insert_all(module, name, schema_or_source, entries, tuplet = {_adapter_meta, opts}) do
34
# TODO!
45
opts = augment_opts(opts)
@@ -13,7 +14,7 @@ defmodule ExAudit.Schema do
1314

1415
case result do
1516
{:ok, resulting_struct} ->
16-
ExAudit.Tracking.track_change(module, :created, struct, resulting_struct, opts)
17+
track_change(module, :created, struct, resulting_struct, opts)
1718

1819
_ ->
1920
:ok
@@ -31,7 +32,7 @@ defmodule ExAudit.Schema do
3132

3233
case result do
3334
{:ok, resulting_struct} ->
34-
ExAudit.Tracking.track_change(module, :updated, struct, resulting_struct, opts)
35+
track_change(module, :updated, struct, resulting_struct, opts)
3536

3637
_ ->
3738
:ok
@@ -50,7 +51,7 @@ defmodule ExAudit.Schema do
5051
case result do
5152
{:ok, resulting_struct} ->
5253
state = if changeset.data.__meta__.state == :loaded, do: :updated, else: :created
53-
ExAudit.Tracking.track_change(module, state, changeset, resulting_struct, opts)
54+
track_change(module, state, changeset, resulting_struct, opts)
5455

5556
_ ->
5657
:ok
@@ -64,12 +65,12 @@ defmodule ExAudit.Schema do
6465
opts = augment_opts(opts)
6566

6667
augment_transaction(module, fn ->
67-
ExAudit.Tracking.track_assoc_deletion(module, struct, opts)
68+
track_assoc_deletion(module, struct, opts)
6869
result = Ecto.Repo.Schema.delete(module, name, struct, tuplet)
6970

7071
case result do
7172
{:ok, resulting_struct} ->
72-
ExAudit.Tracking.track_change(module, :deleted, struct, resulting_struct, opts)
73+
track_change(module, :deleted, struct, resulting_struct, opts)
7374

7475
_ ->
7576
:ok
@@ -86,7 +87,7 @@ defmodule ExAudit.Schema do
8687
module,
8788
fn ->
8889
result = Ecto.Repo.Schema.insert!(module, name, struct, tuplet)
89-
ExAudit.Tracking.track_change(module, :created, struct, result, opts)
90+
track_change(module, :created, struct, result, opts)
9091
result
9192
end,
9293
true
@@ -100,7 +101,7 @@ defmodule ExAudit.Schema do
100101
module,
101102
fn ->
102103
result = Ecto.Repo.Schema.update!(module, name, struct, tuplet)
103-
ExAudit.Tracking.track_change(module, :updated, struct, result, opts)
104+
track_change(module, :updated, struct, result, opts)
104105
result
105106
end,
106107
true
@@ -115,7 +116,7 @@ defmodule ExAudit.Schema do
115116
fn ->
116117
result = Ecto.Repo.Schema.insert_or_update!(module, name, changeset, tuplet)
117118
state = if changeset.data.__meta__.state == :loaded, do: :updated, else: :created
118-
ExAudit.Tracking.track_change(module, state, changeset, result, opts)
119+
track_change(module, state, changeset, result, opts)
119120
result
120121
end,
121122
true
@@ -128,9 +129,9 @@ defmodule ExAudit.Schema do
128129
augment_transaction(
129130
module,
130131
fn ->
131-
ExAudit.Tracking.track_assoc_deletion(module, struct, opts)
132+
track_assoc_deletion(module, struct, opts)
132133
result = Ecto.Repo.Schema.delete!(module, name, struct, tuplet)
133-
ExAudit.Tracking.track_change(module, :deleted, struct, result, opts)
134+
track_change(module, :deleted, struct, result, opts)
134135
result
135136
end,
136137
true
@@ -174,4 +175,25 @@ defmodule ExAudit.Schema do
174175
end ++ custom_fields
175176
end)
176177
end
178+
179+
# It wraps Tracking.track_change in a try rescue block because we don't want to crash the caller process when there is exception in track_change
180+
# It's opinionated here that tracking is something that's not mission critical and thus an exception caused by bug should
181+
# TODO make this try rescue behaviour configurable
182+
defp track_change(module, action, changeset, resulting_struct, opts) do
183+
ExAudit.Tracking.track_change(module, action, changeset, resulting_struct, opts)
184+
rescue
185+
e ->
186+
:error
187+
|> Exception.format(e, __STACKTRACE__)
188+
|> Logger.error(crash_reason: {e, __STACKTRACE__})
189+
end
190+
191+
def track_assoc_deletion(module, struct, opts) do
192+
ExAudit.Tracking.track_assoc_deletion(module, struct, opts)
193+
rescue
194+
e ->
195+
:error
196+
|> Exception.format(e, __STACKTRACE__)
197+
|> Logger.error(crash_reason: {e, __STACKTRACE__})
198+
end
177199
end

test/ex_audit_test.exs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
defmodule ExAuditTest do
2-
use ExUnit.Case
2+
use ExUnit.Case, async: false
33
doctest ExAudit
44

55
import Ecto.Query
@@ -246,6 +246,21 @@ defmodule ExAuditTest do
246246
assert 2 = Repo.aggregate(query, :count, :id)
247247
end
248248

249+
test "will not crash the caller process if the tracking " do
250+
original = Application.get_env(:ex_audit, :ecto_repos)
251+
Application.put_env(:ex_audit, :ecto_repos, :crash)
252+
253+
ExUnit.Callbacks.on_exit(fn ->
254+
Application.put_env(:ex_audit, :ecto_repos, original)
255+
end)
256+
257+
user = Util.create_user()
258+
259+
changeset = User.changeset(user, %{transient_field: 3})
260+
261+
assert {:ok, user} = Repo.update(changeset)
262+
end
263+
249264
describe "history_query/1" do
250265
setup do
251266
params = %{

0 commit comments

Comments
 (0)