HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/hi.naniguide.com/app/Http/Controllers/Admin/SupportTicketController.php
<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\SupportTicket;
use App\Models\SupportTicketMessage;
use Illuminate\Http\Request;

class SupportTicketController extends Controller
{
    public function index(Request $request)
    {
        $filters = $request->only(['status', 'search']);

        if (!$request->has('status')) {
            $filters['status'] = 'open';
        }

        $baseQuery = SupportTicket::query()->with('customer');

        if (($filters['search'] ?? '') !== '') {
            $search = $filters['search'];
            $baseQuery->where(function ($sub) use ($search) {
                $sub->where('subject', 'like', "%{$search}%")
                    ->orWhereHas('customer', function ($c) use ($search) {
                        $c->where('email', 'like', "%{$search}%")
                            ->orWhere('first_name', 'like', "%{$search}%")
                            ->orWhere('last_name', 'like', "%{$search}%");
                    });
            });
        }

        $openCount = (clone $baseQuery)->where('status', 'open')->count();
        $closedCount = (clone $baseQuery)->where('status', 'closed')->count();

        $tickets = $baseQuery
            ->when(in_array(($filters['status'] ?? ''), ['open', 'closed'], true), function ($q) use ($filters) {
                $q->where('status', $filters['status']);
            })
            ->orderByDesc('last_message_at')
            ->orderByDesc('created_at')
            ->paginate(20)
            ->withQueryString();

        return view('admin.support-tickets.index', compact('tickets', 'filters', 'openCount', 'closedCount'));
    }

    public function drawer(Request $request, SupportTicket $support_ticket)
    {
        $ticket = $support_ticket->load('customer');

        $messages = $ticket->messages()
            ->with('sender')
            ->orderBy('created_at')
            ->get();

        return view('admin.support-tickets._drawer', compact('ticket', 'messages'));
    }

    public function show(Request $request, SupportTicket $support_ticket)
    {
        $ticket = $support_ticket->load('customer');

        $messages = $ticket->messages()
            ->with('sender')
            ->orderBy('created_at')
            ->get();

        return view('admin.support-tickets.show', compact('ticket', 'messages'));
    }

    public function reply(Request $request, SupportTicket $support_ticket)
    {
        $admin = $request->user('admin');

        $validated = $request->validate([
            'body' => ['required', 'string'],
        ]);

        SupportTicketMessage::create([
            'support_ticket_id' => $support_ticket->id,
            'sender_type' => get_class($admin),
            'sender_id' => $admin->id,
            'body' => SupportTicketMessage::sanitizeBody($validated['body']),
        ]);

        $support_ticket->forceFill([
            'last_message_at' => now(),
            'status' => 'open',
            'closed_at' => null,
        ])->save();

        if ($request->ajax() || $request->expectsJson()) {
            return response()->noContent();
        }

        return redirect()
            ->route('admin.support-tickets.show', $support_ticket)
            ->with('success', 'Reply sent successfully.');
    }

    public function setStatus(Request $request, SupportTicket $support_ticket)
    {
        $validated = $request->validate([
            'status' => ['required', 'in:open,closed'],
        ]);

        $support_ticket->status = $validated['status'];
        $support_ticket->closed_at = $validated['status'] === 'closed' ? now() : null;
        $support_ticket->save();

        if ($request->ajax() || $request->expectsJson()) {
            return response()->noContent();
        }

        return redirect()
            ->route('admin.support-tickets.show', $support_ticket)
            ->with('success', 'Ticket updated successfully.');
    }

    public function setPriority(Request $request, SupportTicket $support_ticket)
    {
        $validated = $request->validate([
            'priority' => ['required', 'in:low,normal,high'],
        ]);

        $support_ticket->priority = $validated['priority'];
        $support_ticket->save();

        if ($request->ajax() || $request->expectsJson()) {
            return response()->noContent();
        }

        return redirect()
            ->route('admin.support-tickets.show', $support_ticket)
            ->with('success', 'Ticket updated successfully.');
    }
}