-
Notifications
You must be signed in to change notification settings - Fork 46
/
ticket.ex
163 lines (132 loc) · 4.12 KB
/
ticket.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
defmodule Demo.Tickets.Ticket do
use Ash.Resource,
data_layer: AshPostgres.DataLayer,
authorizers: [
AshPolicyAuthorizer.Authorizer
],
extensions: [
AshAdmin.Resource
]
admin do
show_action :read
table_columns [:id, :representative_id, :reporter_id, :subject, :status]
form do
field :description, type: :long_text
end
end
policies do
bypass always() do
authorize_if actor_attribute_equals(:admin, true)
end
policy action_type(:read) do
authorize_if actor_attribute_equals(:representative, true)
authorize_if relates_to_actor_via(:reporter)
end
policy changing_relationship(:reporter) do
authorize_if relating_to_actor(:reporter)
end
end
actions do
read :reported do
filter reporter: actor(:id)
pagination offset?: true, countable: true, required?: false, default_limit: 25
end
read :assigned do
filter representative: actor(:id)
pagination offset?: true, countable: true, required?: false, default_limit: 25
end
read :read do
primary? true
pagination [
offset?: true,
keyset?: true,
default_limit: 10,
countable: :by_default
]
end
read :keyset do
pagination [
keyset?: true,
default_limit: 10
]
end
create :open do
accept [:subject]
primary? true
argument :representative, :map, allow_nil?: false
argument :organization, :map, allow_nil?: false
argument :tickets, {:array, :map}
change manage_relationship(:organization, on_no_match: :create, on_lookup: :relate, on_match: :ignore)
change manage_relationship(:representative, type: :append)
change manage_relationship(:tickets, :source_links, on_lookup: {:relate_and_update, :create, :read, :all})
end
update :update, primary?: true
update :assign do
accept []
argument :representative, :map
argument :reassignment_comment, :map, allow_nil?: false
change manage_relationship(:representative, type: :append)
change manage_relationship(:reassignment_comment, :comments, type: :create)
end
update :link do
accept []
argument :tickets, {:array, :map}, allow_nil?: false
argument :link_comment, :map, type: :create
# Uses the defult create action of the join table, which accepts the `type`
change manage_relationship(:tickets, :source_links, on_lookup: {:relate_and_update, :create, :read, :all})
change manage_relationship(:link_comment, :comments, type: :create)
end
update :nested_example do
accept [:subject]
argument :tickets, {:array, :map}
change manage_relationship(
:tickets,
:source_links,
type: :direct_control,
on_match: {:update, :nested_example, :update, [:type]},
on_no_match: {:create, :nested_example, :update, [:type]}
)
end
destroy :destroy
end
postgres do
table "tickets"
repo Demo.Repo
end
attributes do
uuid_primary_key :id
attribute :subject, :string do
allow_nil? false
constraints min_length: 5
end
attribute :description, :string
attribute :response, :string
attribute :status, :atom do
allow_nil? false
default "new"
constraints one_of: [:new, :investigating, :closed]
end
timestamps()
end
relationships do
belongs_to :reporter, Demo.Tickets.Customer
belongs_to :representative, Demo.Tickets.Representative
belongs_to :organization, Demo.Tickets.Organization do
required? true
end
has_many :comments, Demo.Tickets.Comment do
context %{data_layer: %{table: "ticket_comments"}}
destination_field :resource_id
end
many_to_many :source_links, Demo.Tickets.Ticket do
through Demo.Tickets.TicketLink
source_field_on_join_table :source_id
destination_field_on_join_table :destination_id
end
many_to_many :destination_links, Demo.Tickets.Ticket do
through Demo.Tickets.TicketLink
source_field_on_join_table :destination_id
destination_field_on_join_table :source_id
end
end
end