151 lines
3.6 KiB
PHP
151 lines
3.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Modules\Helpdesk\Http\Controllers;
|
|
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Validation\Rule;
|
|
use Modules\Helpdesk\Models\Ticket;
|
|
use Modules\Helpdesk\Services\TicketService;
|
|
|
|
final class NativeTicketController extends Controller
|
|
{
|
|
public function __construct(
|
|
private readonly TicketService $tickets,
|
|
) {}
|
|
|
|
public function index(Request $request): JsonResponse
|
|
{
|
|
$user = $request->user();
|
|
|
|
$query = Ticket::query()
|
|
->visibleTo($user)
|
|
->orderByDesc('id');
|
|
|
|
if ($request->filled('search')) {
|
|
$search = addcslashes(
|
|
(string) $request->query('search'),
|
|
'%_\\'
|
|
);
|
|
|
|
$query->where(
|
|
'subject',
|
|
'like',
|
|
'%'.$search.'%'
|
|
);
|
|
}
|
|
|
|
return response()->json(
|
|
$query->paginate(30)
|
|
);
|
|
}
|
|
|
|
public function show(Request $request, Ticket $ticket): JsonResponse
|
|
{
|
|
$user = $request->user();
|
|
|
|
$ticket = Ticket::query()
|
|
->visibleTo($user)
|
|
->whereKey($ticket->getKey())
|
|
->firstOrFail();
|
|
|
|
return response()->json(
|
|
$ticket->load([
|
|
'comments',
|
|
'status',
|
|
'priority',
|
|
'category',
|
|
'project',
|
|
'team',
|
|
'agent',
|
|
'attachments',
|
|
'tags',
|
|
])
|
|
);
|
|
}
|
|
|
|
public function store(Request $request): JsonResponse
|
|
{
|
|
$data = $request->validate([
|
|
'subject' => [
|
|
'required',
|
|
'string',
|
|
'max:255',
|
|
],
|
|
'body' => [
|
|
'required',
|
|
'string',
|
|
],
|
|
'priority_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists('helpdesk_priorities', 'id'),
|
|
],
|
|
'category_id' => [
|
|
'nullable',
|
|
'integer',
|
|
Rule::exists('helpdesk_categories', 'id'),
|
|
],
|
|
'project_id' => [
|
|
'nullable',
|
|
'integer',
|
|
Rule::exists('helpdesk_projects', 'id'),
|
|
],
|
|
'product_id' => [
|
|
'nullable',
|
|
'integer',
|
|
Rule::exists('helpdesk_products', 'id'),
|
|
],
|
|
'team_id' => [
|
|
'nullable',
|
|
'integer',
|
|
Rule::exists('helpdesk_teams', 'id'),
|
|
],
|
|
'board_id' => [
|
|
'nullable',
|
|
'integer',
|
|
Rule::exists('helpdesk_kanban_boards', 'id'),
|
|
],
|
|
'due_at' => [
|
|
'nullable',
|
|
'date',
|
|
],
|
|
'tag_ids' => [
|
|
'sometimes',
|
|
'array',
|
|
],
|
|
'tag_ids.*' => [
|
|
'integer',
|
|
'distinct',
|
|
Rule::exists('helpdesk_tags', 'id'),
|
|
],
|
|
'attachments' => [
|
|
'sometimes',
|
|
'array',
|
|
],
|
|
'attachments.*' => [
|
|
'file',
|
|
'max:10240',
|
|
],
|
|
]);
|
|
|
|
$files = $request->file('attachments', []);
|
|
|
|
unset($data['attachments']);
|
|
|
|
$ticket = $this->tickets->create(
|
|
$request->user(),
|
|
$data,
|
|
$files
|
|
);
|
|
|
|
return response()->json(
|
|
$ticket,
|
|
201
|
|
);
|
|
}
|
|
}
|