48 lines
1.2 KiB
PHP
48 lines
1.2 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Expenses;
|
|
|
|
use App\Services\ApplicationUrlService;
|
|
use Illuminate\Http\UploadedFile;
|
|
|
|
class ExpenseReceiptService
|
|
{
|
|
public function __construct(
|
|
private ApplicationUrlService $urls
|
|
) {
|
|
}
|
|
|
|
public function storeReceipt(UploadedFile $file): string
|
|
{
|
|
if (! $file->isValid()) {
|
|
throw new \InvalidArgumentException('Invalid receipt upload.');
|
|
}
|
|
|
|
$allowed = [
|
|
'image/jpeg' => 'jpg',
|
|
'image/png' => 'png',
|
|
'image/webp' => 'webp',
|
|
'application/pdf' => 'pdf',
|
|
];
|
|
|
|
$mime = strtolower((string) $file->getMimeType());
|
|
if (! isset($allowed[$mime])) {
|
|
throw new \InvalidArgumentException('Unsupported receipt file type.');
|
|
}
|
|
|
|
if ((int) $file->getSize() > 5 * 1024 * 1024) {
|
|
throw new \InvalidArgumentException('Receipt file too large. Max 5MB.');
|
|
}
|
|
|
|
$filename = bin2hex(random_bytes(16)) . '.' . $allowed[$mime];
|
|
$file->storeAs('receipts', $filename);
|
|
|
|
return $filename;
|
|
}
|
|
|
|
public function receiptUrl(?string $filename): ?string
|
|
{
|
|
return $this->urls->forReceiptStorage($filename);
|
|
}
|
|
}
|