feat: Implement Fast Request feature with file upload and request management
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Document;
|
||||
|
||||
use App\Enums\DocumentPriorityEnum;
|
||||
use App\Enums\MediaCollectionEnum;
|
||||
use App\Enums\PetGenderEnum;
|
||||
use App\Enums\PetTypeEnum;
|
||||
use App\Models\Document;
|
||||
use App\Models\Pet;
|
||||
use App\Models\User;
|
||||
use App\Services\FileStorageService;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class FastRequestService
|
||||
{
|
||||
protected FileStorageService $fileStorageService;
|
||||
|
||||
public function __construct(FileStorageService $fileStorageService)
|
||||
{
|
||||
$this->fileStorageService = $fileStorageService;
|
||||
}
|
||||
|
||||
public function create(User $requester, array $data, array $historyFiles = [], array $scanFiles = []): Document
|
||||
{
|
||||
return DB::transaction(function () use ($requester, $data, $historyFiles, $scanFiles) {
|
||||
$pet = $this->resolvePet($requester, $data);
|
||||
|
||||
$document = Document::create([
|
||||
'modality' => $data['modality'],
|
||||
'priority' => DocumentPriorityEnum::fromName($data['priority'])->value,
|
||||
'note' => $data['note'] ?? null,
|
||||
'submitted_at' => now(),
|
||||
'pet_id' => $pet->id,
|
||||
'requester_id' => $requester->id,
|
||||
]);
|
||||
|
||||
$this->attachFiles($document, $historyFiles, MediaCollectionEnum::History);
|
||||
$this->attachFiles($document, $scanFiles, MediaCollectionEnum::Primary);
|
||||
|
||||
if (!empty($data['doctor_id'])) {
|
||||
$document->assignments()->create([
|
||||
'user_id' => $data['doctor_id'],
|
||||
'role' => 'رادیولوژیست',
|
||||
]);
|
||||
}
|
||||
|
||||
return $document;
|
||||
});
|
||||
}
|
||||
|
||||
protected function resolvePet(User $requester, array $data): Pet
|
||||
{
|
||||
if (!empty($data['pet_id'])) {
|
||||
return Pet::findOrFail($data['pet_id']);
|
||||
}
|
||||
|
||||
$pet = $data['pet'];
|
||||
|
||||
return Pet::create([
|
||||
'name' => $pet['name'],
|
||||
'type' => PetTypeEnum::fromName($pet['type'])->value,
|
||||
'gender' => isset($pet['gender']) ? PetGenderEnum::fromName($pet['gender'])->value : PetGenderEnum::Unknown->value,
|
||||
'breed' => $pet['breed'] ?? null,
|
||||
'weight' => $pet['weight'] ?? null,
|
||||
'sterilized' => $pet['sterilized'] ?? null,
|
||||
'birthday' => isset($pet['age']) ? now()->subYears((int) $pet['age'])->startOfDay() : null,
|
||||
'owner_id' => $requester->id,
|
||||
]);
|
||||
}
|
||||
|
||||
protected function attachFiles(Document $document, array $files, MediaCollectionEnum $collection): void
|
||||
{
|
||||
foreach ($files as $file) {
|
||||
$medium = $this->fileStorageService->storeFile($file);
|
||||
$document->media()->attach($medium->id, ['collection' => $collection->value]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user