75 lines
2.6 KiB
PHP
75 lines
2.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Modules\Helpdesk\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\UploadedFile;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Gate;
|
|
use Modules\Helpdesk\Models\Ticket;
|
|
use Modules\Helpdesk\Services\AttachmentService;
|
|
|
|
final class TicketAttachmentStoreController extends Controller
|
|
{
|
|
/**
|
|
* Store one or more supporting files directly against an existing ticket.
|
|
*/
|
|
public function __invoke(Request $request, Ticket $ticket, AttachmentService $attachments): RedirectResponse
|
|
{
|
|
Gate::authorize('update', $ticket);
|
|
|
|
$request->validate([
|
|
'attachments' => ['required', 'array', 'min:1'],
|
|
'attachments.*' => $this->attachmentFileRules(required: true),
|
|
]);
|
|
|
|
$user = Auth::user();
|
|
abort_if($user === null, 403);
|
|
|
|
$uploadedFiles = $request->file('attachments', []);
|
|
$uploadedFiles = is_array($uploadedFiles) ? $uploadedFiles : [$uploadedFiles];
|
|
$uploadedFiles = array_values(array_filter($uploadedFiles, static fn ($file): bool => $file instanceof UploadedFile && $file->isValid()));
|
|
|
|
$attachments->storeMany($ticket, $uploadedFiles, (int) $user->id);
|
|
|
|
return redirect()
|
|
->route('helpdesk.tickets.show', $ticket)
|
|
->with('ticket-attachments-added', count($uploadedFiles).' supporting file'.(count($uploadedFiles) === 1 ? '' : 's').' uploaded.');
|
|
}
|
|
|
|
/**
|
|
* Return Helpdesk attachment validation rules without relying on a newly autoloaded support class.
|
|
*
|
|
* @param bool $required Whether at least one uploaded file is required.
|
|
* @return array<int, string>
|
|
*/
|
|
private function attachmentFileRules(bool $required = false): array
|
|
{
|
|
return array_values(array_filter([
|
|
$required ? 'required' : null,
|
|
'file',
|
|
'max:'.(int) config('helpdesk.max_upload_kb', 10240),
|
|
'extensions:'.implode(',', $this->allowedAttachmentExtensions()),
|
|
]));
|
|
}
|
|
|
|
/**
|
|
* Return lower-case Helpdesk attachment extensions.
|
|
*
|
|
* @return array<int, string>
|
|
*/
|
|
private function allowedAttachmentExtensions(): array
|
|
{
|
|
return collect(config('helpdesk.allowed_extensions', config('helpdesk.allowed_mimes', [])))
|
|
->filter(static fn (mixed $extension): bool => is_string($extension) && trim($extension) !== '')
|
|
->map(static fn (string $extension): string => strtolower(ltrim(trim($extension), '.')))
|
|
->unique()
|
|
->values()
|
|
->all();
|
|
}
|
|
}
|