/
verb.ex
103 lines (80 loc) · 2.35 KB
/
verb.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
defmodule Bonfire.Data.AccessControl.Verb do
@moduledoc """
"""
use Needle.Pointable,
otp_app: :bonfire_data_access_control,
table_id: "2W0RDDESCR1B1NGD01NGTH1NGS",
source: "bonfire_data_access_control_verb"
alias Bonfire.Data.AccessControl.Verb
alias Ecto.Changeset
alias Needle.Changesets
pointable_schema do
field(:verb, :string)
end
# @default_opts [cast: [:verb], required: [:verb]]
def changeset(verb \\ %Verb{}, params) do
verb
|> Changesets.cast(params, [:verb])
|> Changeset.validate_required([:verb])
|> Changeset.unique_constraint([:verb])
end
end
defmodule Bonfire.Data.AccessControl.Verb.Migration do
@moduledoc false
use Ecto.Migration
import Needle.Migration
alias Bonfire.Data.AccessControl.Verb
@verb_table Verb.__schema__(:source)
# create_verb_table/{0,1}
defp make_verb_table(exprs) do
quote do
require Needle.Migration
Needle.Migration.create_pointable_table Bonfire.Data.AccessControl.Verb do
Ecto.Migration.add(:verb, :text, null: false)
unquote_splicing(exprs)
end
end
end
defmacro create_verb_table(), do: make_verb_table([])
defmacro create_verb_table(do: {_, _, body}), do: make_verb_table(body)
# drop_verb_table/0
def drop_verb_table(), do: drop_pointable_table(Verb)
# create_verb_verb_index/{0,1}
defp make_verb_verb_index(opts) do
quote do
Ecto.Migration.create_if_not_exists(
Ecto.Migration.unique_index(
unquote(@verb_table),
[:verb],
unquote(opts)
)
)
end
end
defmacro create_verb_verb_index(opts \\ [])
defmacro create_verb_verb_index(opts), do: make_verb_verb_index(opts)
def drop_verb_verb_index(opts \\ [])
def drop_verb_verb_index(opts),
do: drop_if_exists(unique_index(@verb_table, [:verb], opts))
# migrate_verb/{0,1}
defp mv(:up) do
quote do
unquote(make_verb_table([]))
unquote(make_verb_verb_index([]))
end
end
defp mv(:down) do
quote do
Bonfire.Data.AccessControl.Verb.Migration.drop_verb_verb_index()
Bonfire.Data.AccessControl.Verb.Migration.drop_verb_table()
end
end
defmacro migrate_verb() do
quote do
if Ecto.Migration.direction() == :up,
do: unquote(mv(:up)),
else: unquote(mv(:down))
end
end
defmacro migrate_verb(dir), do: mv(dir)
end