Skip to content

Commit 48c5d48

Browse files
KaFai Choimikeover
authored andcommitted
allow different verion_schema and tracked_schemas for different ecto repo
1 parent c486af6 commit 48c5d48

File tree

6 files changed

+48
-46
lines changed

6 files changed

+48
-46
lines changed

config/test.exs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@ config :ex_audit, ExAudit.Test.Repo,
1212
config :logger, level: :info
1313

1414
config :ex_audit,
15-
ecto_repos: [ExAudit.Test.Repo],
16-
version_schema: ExAudit.Test.Version,
17-
tracked_schemas: [
18-
ExAudit.Test.User,
19-
ExAudit.Test.BlogPost,
20-
ExAudit.Test.BlogPost.Section,
21-
ExAudit.Test.Comment
22-
],
15+
ecto_repos: %{
16+
ExAudit.Test.Repo => %{
17+
version_schema: ExAudit.Test.Version,
18+
tracked_schemas: [
19+
ExAudit.Test.User,
20+
ExAudit.Test.BlogPost,
21+
ExAudit.Test.BlogPost.Section,
22+
ExAudit.Test.Comment
23+
]
24+
}
25+
},
2326
primitive_structs: [
2427
Date
2528
]

lib/repo/queryable.ex

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
defmodule ExAudit.Queryable do
22
require Logger
3-
43
import Ecto.Query, only: [from: 2, where: 3]
54

6-
defp version_schema() do
7-
Application.get_env(:ex_audit, :version_schema)
8-
end
9-
10-
@compile {:inline, version_schema: 0}
11-
125
def update_all(module, queryable, updates, opts) do
136
Ecto.Repo.Queryable.update_all(module, queryable, updates, opts)
147
end
@@ -20,7 +13,7 @@ defmodule ExAudit.Queryable do
2013
def history(module, struct, opts) do
2114
query =
2215
from(
23-
v in version_schema(),
16+
v in version_schema(module),
2417
order_by: [desc: :recorded_at]
2518
)
2619

@@ -64,7 +57,7 @@ defmodule ExAudit.Queryable do
6457

6558
versions ++
6659
[
67-
struct(version_schema(), %{
60+
struct(version_schema(module), %{
6861
id: oldest_id
6962
})
7063
|> Map.put(:original, empty_map_to_nil(oldest_struct))
@@ -92,7 +85,7 @@ defmodule ExAudit.Queryable do
9285

9386
query =
9487
from(
95-
v in version_schema(),
88+
v in version_schema(module),
9689
where: v.entity_id == ^version.entity_id,
9790
where: v.entity_schema == ^version.entity_schema,
9891
where: v.recorded_at >= ^version.recorded_at,
@@ -185,4 +178,8 @@ defmodule ExAudit.Queryable do
185178
defp reverse_action(:updated), do: :updated
186179
defp reverse_action(:created), do: :deleted
187180
defp reverse_action(:deleted), do: :created
181+
182+
defp version_schema(repo_module) do
183+
Application.get_env(:ex_audit, :ecto_repos) |> get_in([repo_module, :version_schema])
184+
end
188185
end

lib/repo/repo.ex

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ defmodule ExAudit.Repo do
7474
end
7575
```
7676
"""
77-
def tracked?(struct_or_changeset) do
78-
tracked_schemas = Application.get_env(:ex_audit, :tracked_schemas, [])
77+
@compile {:inline, tracked?: 2}
78+
79+
defp tracked?(repo_module, struct_or_changeset) do
80+
tracked_schemas = ExAudit.Tracking.tracked_schemas(repo_module)
7981

8082
schema =
8183
case struct_or_changeset do
@@ -89,14 +91,11 @@ defmodule ExAudit.Repo do
8991
schema in tracked_schemas
9092
end
9193

92-
@compile {:inline, tracked?: 1}
93-
94-
defoverridable(tracked?: 1)
95-
94+
defoverridable(tracked?: 2)
9695
def insert(struct, opts) do
9796
repo = get_dynamic_repo()
9897

99-
if tracked?(struct) do
98+
if tracked?(__MODULE__, struct) do
10099
ExAudit.Schema.insert(
101100
__MODULE__,
102101
repo,
@@ -111,7 +110,7 @@ defmodule ExAudit.Repo do
111110
def update(struct, opts) do
112111
repo = get_dynamic_repo()
113112

114-
if tracked?(struct) do
113+
if tracked?(__MODULE__, struct) do
115114
ExAudit.Schema.update(
116115
__MODULE__,
117116
repo,
@@ -126,7 +125,7 @@ defmodule ExAudit.Repo do
126125
def insert_or_update(changeset, opts) do
127126
repo = get_dynamic_repo()
128127

129-
if tracked?(changeset) do
128+
if tracked?(__MODULE__, changeset) do
130129
ExAudit.Schema.insert_or_update(
131130
__MODULE__,
132131
repo,
@@ -141,7 +140,7 @@ defmodule ExAudit.Repo do
141140
def delete(struct, opts) do
142141
repo = get_dynamic_repo()
143142

144-
if tracked?(struct) do
143+
if tracked?(__MODULE__, struct) do
145144
ExAudit.Schema.delete(
146145
__MODULE__,
147146
repo,
@@ -156,7 +155,7 @@ defmodule ExAudit.Repo do
156155
def insert!(struct, opts) do
157156
repo = get_dynamic_repo()
158157

159-
if tracked?(struct) do
158+
if tracked?(__MODULE__, struct) do
160159
ExAudit.Schema.insert!(
161160
__MODULE__,
162161
repo,
@@ -171,7 +170,7 @@ defmodule ExAudit.Repo do
171170
def update!(struct, opts) do
172171
repo = get_dynamic_repo()
173172

174-
if tracked?(struct) do
173+
if tracked?(__MODULE__, struct) do
175174
ExAudit.Schema.update!(
176175
__MODULE__,
177176
repo,
@@ -186,7 +185,7 @@ defmodule ExAudit.Repo do
186185
def insert_or_update!(changeset, opts) do
187186
repo = get_dynamic_repo()
188187

189-
if tracked?(changeset) do
188+
if tracked?(__MODULE__, changeset) do
190189
ExAudit.Schema.insert_or_update!(
191190
__MODULE__,
192191
repo,
@@ -201,7 +200,7 @@ defmodule ExAudit.Repo do
201200
def delete!(struct, opts) do
202201
repo = get_dynamic_repo()
203202

204-
if tracked?(struct) do
203+
if tracked?(__MODULE__, struct) do
205204
ExAudit.Schema.delete!(
206205
__MODULE__,
207206
repo,

lib/repo/schema.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
defmodule ExAudit.Schema do
22
require Logger
3+
34
def insert_all(module, name, schema_or_source, entries, tuplet = {_adapter_meta, opts}) do
45
# TODO!
56
opts = augment_opts(opts)
@@ -32,7 +33,7 @@ defmodule ExAudit.Schema do
3233

3334
case result do
3435
{:ok, resulting_struct} ->
35-
track_change(module, :updated, struct, resulting_struct, opts)
36+
track_change(module, :updated, struct, resulting_struct, opts)
3637

3738
_ ->
3839
:ok

lib/repo/schema_type.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ defmodule ExAudit.Type.Schema do
3939

4040
def type, do: :string
4141

42-
defp schemas do
43-
Application.get_env(:ex_audit, :tracked_schemas, [])
42+
defp schemas() do
43+
Application.get_env(:ex_audit, :ecto_repos)
44+
|> Map.values()
45+
|> Enum.flat_map(& &1.tracked_schemas)
4446
end
4547
end

lib/tracking/tracking.ex

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
defmodule ExAudit.Tracking do
2-
def find_changes(action, struct_or_changeset, resulting_struct) do
2+
def find_changes(module, action, struct_or_changeset, resulting_struct) do
33
old =
44
case {action, struct_or_changeset} do
55
{:created, _} -> %{}
@@ -17,13 +17,13 @@ defmodule ExAudit.Tracking do
1717
%{}
1818
end
1919

20-
compare_versions(action, old, new)
20+
compare_versions(module, action, old, new)
2121
end
2222

23-
def compare_versions(action, old, new) do
23+
def compare_versions(module, action, old, new) do
2424
schema = Map.get(old, :__struct__, Map.get(new, :__struct__))
2525

26-
if schema in tracked_schemas() do
26+
if schema in tracked_schemas(module) do
2727
assocs = schema.__schema__(:associations)
2828

2929
patch =
@@ -53,7 +53,7 @@ defmodule ExAudit.Tracking do
5353

5454
def track_change(module, action, changeset, resulting_struct, opts) do
5555
if not Keyword.get(opts, :ignore_audit, false) do
56-
changes = find_changes(action, changeset, resulting_struct)
56+
changes = find_changes(module, action, changeset, resulting_struct)
5757

5858
insert_versions(module, changes, opts)
5959
end
@@ -85,7 +85,7 @@ defmodule ExAudit.Tracking do
8585

8686
_ ->
8787
opts = Keyword.drop(opts, [:on_conflict, :conflict_target])
88-
module.insert_all(version_schema(), changes, opts)
88+
module.insert_all(version_schema(module), changes, opts)
8989
end
9090
end
9191

@@ -109,7 +109,7 @@ defmodule ExAudit.Tracking do
109109
root ++ Enum.map(root, &find_assoc_deletion(module, &1, repo_opts))
110110
end)
111111
|> List.flatten()
112-
|> Enum.flat_map(&compare_versions(:deleted, &1, %{}))
112+
|> Enum.flat_map(&compare_versions(module, :deleted, &1, %{}))
113113
end
114114

115115
def track_assoc_deletion(module, struct, opts) do
@@ -118,11 +118,11 @@ defmodule ExAudit.Tracking do
118118
insert_versions(module, deleted_structs, opts)
119119
end
120120

121-
defp tracked_schemas do
122-
Application.get_env(:ex_audit, :tracked_schemas, [])
121+
def tracked_schemas(repo_module) do
122+
Application.get_env(:ex_audit, :ecto_repos) |> get_in([repo_module, :tracked_schemas])
123123
end
124124

125-
defp version_schema do
126-
Application.get_env(:ex_audit, :version_schema)
125+
defp version_schema(repo_module) do
126+
Application.get_env(:ex_audit, :ecto_repos) |> get_in([repo_module, :version_schema])
127127
end
128128
end

0 commit comments

Comments
 (0)