PluginProbe
Fluent Support – Helpdesk & Customer Support Ticket System / 2.3.1
Fluent Support – Helpdesk & Customer Support Ticket System v2.3.1
2.4.0 2.3.2 2.3.1 2.3.0 2.2.1 2.2.0 trunk 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.10.5 1.4.0 1.4.1 1.4.2 1.4.5 1.4.6 1.4.7 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 All 68 releases
fluent-support / app / Http / Policies / AgentTicketPolicy.php

AgentTicketPolicy.php in Fluent Support – Helpdesk & Customer Support Ticket System 2.3.1, at app/Http/Policies/AgentTicketPolicy.php

289 lines 8.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentSupport\App\Http\Policies;
4
5 use FluentSupport\App\Modules\PermissionManager;
6 use FluentSupport\Framework\Http\Request\Request;
7 use FluentSupport\Framework\Foundation\Policy;
8
9 class AgentTicketPolicy extends Policy
10 {
11 /**
12 * Default policy check: GET requests require view permission, POST/PUT/DELETE require manage permission.
13 *
14 * @param \FluentSupport\Framework\Request\Request $request
15 * @return Boolean
16 */
17 public function verifyRequest(Request $request)
18 {
19 if ($request->method() === 'GET') {
20 $status = PermissionManager::userCan([
21 'fst_view_tickets',
22 'fst_draft_reply',
23 'fst_manage_own_tickets',
24 'fst_manage_unassigned_tickets',
25 'fst_manage_other_tickets'
26 ]);
27 } else {
28 // Non-GET requests require manage permission by default.
29 // Routes safe for draft/view-only agents have dedicated policy methods
30 // (e.g. createResponse, createOrUpdatDraft, storeOrUpdateLabelSearch).
31 $status = PermissionManager::canManageTickets();
32 }
33
34 return apply_filters('fluent_support/agent_has_access', $status, $request);
35 }
36
37 /**
38 * Contact search backs the Add Ticket flow, so any agent who can manage
39 * tickets needs it to work.
40 */
41 public function searchContact(Request $request)
42 {
43 return PermissionManager::canManageTickets();
44 }
45
46 /**
47 * Bulk actions: delete requires fst_delete_tickets plus manage permission
48 * (mirroring deleteTicket), others require manage permission.
49 */
50 public function doBulkActions(Request $request)
51 {
52 $action = $request->getSafe('bulk_action', 'sanitize_text_field');
53
54 if ($action === 'delete_tickets') {
55 return PermissionManager::currentUserCan('fst_delete_tickets')
56 && PermissionManager::canManageTickets();
57 }
58
59 return PermissionManager::canManageTickets();
60 }
61
62 /**
63 * Delete ticket requires explicit delete permission and manage permission.
64 * View-only and draft agents resolve to full ticket visibility, so the
65 * delete capability alone would let them delete any ticket.
66 */
67 public function deleteTicket(Request $request)
68 {
69 return PermissionManager::currentUserCan('fst_delete_tickets')
70 && PermissionManager::canManageTickets();
71 }
72
73 /**
74 * Delete an individual response: requires explicit delete permission and
75 * manage permission, mirroring deleteTicket. Per-ticket access is enforced
76 * in the controller via ensureCanAccessTicket().
77 */
78 public function deleteResponse(Request $request)
79 {
80 return PermissionManager::currentUserCan('fst_delete_tickets')
81 && PermissionManager::canManageTickets();
82 }
83
84 /**
85 * Update an individual response: requires manage permission. Author/type
86 * and per-ticket access rules are enforced in the controller.
87 */
88 public function updateResponse(Request $request)
89 {
90 return PermissionManager::canManageTickets();
91 }
92
93 /**
94 * Creating a response: accessible to manage and draft agents.
95 * View-only agents cannot create responses or drafts.
96 */
97 public function createResponse(Request $request)
98 {
99 return PermissionManager::canManageTickets()
100 || PermissionManager::currentUserCan('fst_draft_reply');
101 }
102
103 /**
104 * Auto-save draft: accessible to manage and draft agents.
105 * View-only agents cannot create drafts.
106 */
107 public function createOrUpdatDraft(Request $request)
108 {
109 return PermissionManager::canManageTickets()
110 || PermissionManager::currentUserCan('fst_draft_reply');
111 }
112
113 /**
114 * Label search save: POST endpoint accessible to any agent with ticket access.
115 */
116 public function storeOrUpdateLabelSearch(Request $request)
117 {
118 return PermissionManager::canAccessTicketRoutes();
119 }
120
121 /**
122 * Label search delete: DELETE endpoint accessible to any agent (personal data).
123 */
124 public function deleteLabelSearch(Request $request)
125 {
126 return PermissionManager::canAccessTicketRoutes();
127 }
128
129 /**
130 * Live activity removal: DELETE endpoint accessible to any agent (cleanup).
131 */
132 public function removeLiveActivity(Request $request)
133 {
134 return PermissionManager::canAccessTicketRoutes();
135 }
136
137 /**
138 * Update ticket property (product, priority, etc.): requires manage ticket permission.
139 */
140 public function updateTicketProperty(Request $request)
141 {
142 return PermissionManager::canManageTickets();
143 }
144
145 /**
146 * Add watchers to a ticket: requires manage ticket permission.
147 */
148 public function addTicketWatchers(Request $request)
149 {
150 return PermissionManager::canManageTickets();
151 }
152
153 /**
154 * Sync watchers on a ticket: requires manage ticket permission.
155 */
156 public function syncTicketWatchers(Request $request)
157 {
158 return PermissionManager::canManageTickets();
159 }
160
161 /**
162 * Update estimated time: requires manage ticket permission.
163 */
164 public function updateEstimatedTime(Request $request)
165 {
166 return PermissionManager::canManageTickets();
167 }
168
169 /**
170 * Manual time commit: requires manage ticket permission.
171 */
172 public function manualCommitTrack(Request $request)
173 {
174 return PermissionManager::canManageTickets();
175 }
176
177 /**
178 * Approve draft response: requires approve permission and ticket route access.
179 */
180 public function approveDraftResponse(Request $request)
181 {
182 return PermissionManager::currentUserCan('fst_approve_draft_reply')
183 && PermissionManager::canAccessTicketRoutes();
184 }
185
186 /**
187 * Delete draft: accessible to draft-capable agents (same as create/update draft).
188 */
189 public function deleteDraft(Request $request)
190 {
191 return PermissionManager::canManageTickets()
192 || PermissionManager::currentUserCan('fst_draft_reply');
193 }
194
195 /**
196 * FluentBot AI-assist actions: accessible to any agent with ticket access.
197 */
198 public function generateResponse(Request $request)
199 {
200 return PermissionManager::canAccessTicketRoutes();
201 }
202
203 public function getRuntimeConfig(Request $request)
204 {
205 return PermissionManager::canAccessTicketRoutes();
206 }
207
208 public function generateStreamResponse(Request $request)
209 {
210 return PermissionManager::canAccessTicketRoutes();
211 }
212
213 public function getTicketSummary(Request $request)
214 {
215 return PermissionManager::canAccessTicketRoutes();
216 }
217
218 public function getTicketTone(Request $request)
219 {
220 return PermissionManager::canAccessTicketRoutes();
221 }
222
223 public function markRead(Request $request)
224 {
225 return PermissionManager::canAccessTicketRoutes();
226 }
227
228 public function markAllRead(Request $request)
229 {
230 return PermissionManager::canAccessTicketRoutes();
231 }
232
233 public function getChatId(Request $request)
234 {
235 return PermissionManager::canAccessTicketRoutes();
236 }
237
238 public function getChatMessages(Request $request)
239 {
240 return PermissionManager::canAccessTicketRoutes();
241 }
242
243 public function getContextSelection(Request $request)
244 {
245 return PermissionManager::canAccessTicketRoutes();
246 }
247
248 public function getConversations(Request $request)
249 {
250 return PermissionManager::canAccessTicketRoutes();
251 }
252
253 public function saveChatId(Request $request)
254 {
255 return PermissionManager::canManageTickets()
256 || PermissionManager::currentUserCan('fst_draft_reply');
257 }
258
259 public function deleteChatId(Request $request)
260 {
261 return PermissionManager::canManageTickets()
262 || PermissionManager::currentUserCan('fst_draft_reply');
263 }
264
265 public function saveContextSelection(Request $request)
266 {
267 return PermissionManager::canManageTickets()
268 || PermissionManager::currentUserCan('fst_draft_reply');
269 }
270
271 public function switchConversation(Request $request)
272 {
273 return PermissionManager::canManageTickets()
274 || PermissionManager::currentUserCan('fst_draft_reply');
275 }
276
277 public function createFeedback(Request $request)
278 {
279 return PermissionManager::canManageTickets()
280 || PermissionManager::currentUserCan('fst_draft_reply');
281 }
282
283 public function deleteFeedback(Request $request)
284 {
285 return PermissionManager::canManageTickets()
286 || PermissionManager::currentUserCan('fst_draft_reply');
287 }
288 }
289