user(); $query = Ticket::query()->orderByDesc('id'); if (!$user->can('helpdesk.admin')) { $query->where(function ($q) use ($user) { $q->where('user_id', $user->getKey())->orWhere('agent_id', $user->getKey()); }); } if ($search = $request->query('search')) { $query->where('subject', 'like', '%'.addcslashes((string) $search, '%_\\').'%'); } return response()->json($query->paginate(30)); } public function show(Request $request, Ticket $ticket): JsonResponse { $this->authorizeTicket($request, $ticket); return response()->json($ticket->load(['comments', 'status', 'priority', 'agent'])); } public function store(Request $request): JsonResponse { $data = $request->validate(['subject' => ['required','string','max:255'], 'body' => ['required','string']]); $ticket = DB::transaction(function () use ($request, $data) { return Ticket::create($data + [ 'reference' => 'MAC-'.strtoupper(bin2hex(random_bytes(6))), 'user_id' => $request->user()->getKey(), ]); }); return response()->json($ticket, 201); } private function authorizeTicket(Request $request, Ticket $ticket): void { abort_unless($request->user()->can('helpdesk.admin') || (int) $ticket->user_id === (int) $request->user()->getKey() || (int) $ticket->agent_id === (int) $request->user()->getKey(), 403); } }