File manager - Edit - /var/www/html/portal/app/Http/Services/Legislacao/LegislacaoService.php
Back
<?php namespace App\Http\Services\Legislacao; use App\Helpers\FileUploadHelper; use App\Models\Legislacao\Legislacao; use App\Http\Resources\LegislacaoResource; use App\Models\Legislacao\LegislacaoAcao; use App\Models\Legislacao\LegislacaoAutor; use App\Models\Legislacao\LegislacaoAutorCargo; use App\Models\Legislacao\LegislacaoCategoria; use App\Models\Legislacao\LegislacaoPortaria; use App\Models\Legislacao\LegislacaoPortariaAcao; use App\Models\Legislacao\LegislacaoPortariaRetificacao; use App\Models\Legislacao\LegislacaoRetificacao; use App\Models\Legislacao\LegislacaoTipo; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use Illuminate\Validation\ValidationException; class LegislacaoService { private const PDF_ALLOWED_EXTENSIONS = ['pdf']; private const PDF_ALLOWED_MIME_TYPES = ['application/pdf']; public function storeLegislacao(array $data, array $categoriaIds, array $acoes, ?UploadedFile $pdf = null): Legislacao { return DB::transaction(function () use ($data, $categoriaIds, $acoes, $pdf) { $data['nm_arquivo_anexo'] = $this->resolveLegislacaoPdfName($data['nm_arquivo_anexo'] ?? null, $pdf, null); $legislacao = Legislacao::query()->create($data); $legislacao->categorias()->sync($categoriaIds); $normalizedAcoes = app(LegislacaoResource::class)->normalizeLegislacaoAcoes($legislacao, $acoes); $this->persistLegislacaoAcoes($legislacao, $normalizedAcoes, $data['dt_publicacao'] ?? null); return $legislacao->fresh(['tipo', 'autor', 'boletim']); }); } public function updateLegislacao(Legislacao $legislacao, array $data, array $categoriaIds, array $acoes, ?UploadedFile $pdf = null): void { DB::transaction(function () use ($legislacao, $data, $categoriaIds, $acoes, $pdf) { $data['nm_arquivo_anexo'] = $this->resolveLegislacaoPdfName( $data['nm_arquivo_anexo'] ?? $legislacao->nm_arquivo_anexo, $pdf, $legislacao->nm_arquivo_anexo ); $legislacao->update($data); $legislacao->categorias()->sync($categoriaIds); $normalizedAcoes = app(LegislacaoResource::class)->normalizeLegislacaoAcoes($legislacao, $acoes); $this->persistLegislacaoAcoes($legislacao, $normalizedAcoes, $data['dt_publicacao'] ?? $legislacao->dt_publicacao); }); } public function deleteLegislacao(Legislacao $legislacao): void { $pdf = $legislacao->nm_arquivo_anexo; DB::transaction(function () use ($legislacao) { $legislacao->categorias()->detach(); $legislacao->delete(); }); $this->deleteLegislacaoPdfFile($pdf); } /** * @param array<int, array{cd_acao:int,id_legislacao_sofre_acao:int}> $acoes */ private function persistLegislacaoAcoes(Legislacao $legislacao, array $acoes, mixed $dtAcao): void { $legislacao->acoes()->delete(); foreach ($acoes as $acao) { LegislacaoAcao::query()->create([ 'id_legislacao' => $legislacao->id_legislacao, 'id_legislacao_sofre_acao' => $acao['id_legislacao_sofre_acao'], 'cd_acao' => $acao['cd_acao'], 'dt_acao' => $dtAcao, ]); } } public function storeRetificacao(Legislacao $legislacao, array $data): LegislacaoRetificacao { return LegislacaoRetificacao::query()->create([ 'id_legislacao' => $legislacao->id_legislacao, 'cd_tipo' => (int) $data['cd_tipo'], 'id_boletim_oficial' => $data['id_boletim_oficial'], 'ds_descricao' => $data['ds_descricao'] ?? null, ]); } public function updateRetificacao(LegislacaoRetificacao $retificacao, array $data): void { $retificacao->update([ 'cd_tipo' => (int) $data['cd_tipo'], 'id_boletim_oficial' => $data['id_boletim_oficial'], 'ds_descricao' => $data['ds_descricao'] ?? null, ]); } public function deleteRetificacao(LegislacaoRetificacao $retificacao): void { $retificacao->delete(); } public function storePortaria(array $data, array $acoes): LegislacaoPortaria { return DB::transaction(function () use ($data, $acoes) { $portaria = LegislacaoPortaria::query()->create($data); $normalizedAcoes = app(LegislacaoResource::class)->normalizePortariaAcoes($portaria, $acoes); $this->persistPortariaAcoes($portaria, $normalizedAcoes, $data['dt_publicacao'] ?? null); return $portaria->fresh(['boletim']); }); } public function updatePortaria(LegislacaoPortaria $portaria, array $data, array $acoes): void { DB::transaction(function () use ($portaria, $data, $acoes) { $portaria->update($data); $normalizedAcoes = app(LegislacaoResource::class)->normalizePortariaAcoes($portaria, $acoes); $this->persistPortariaAcoes($portaria, $normalizedAcoes, $data['dt_publicacao'] ?? $portaria->dt_publicacao); }); } public function deletePortaria(LegislacaoPortaria $portaria): void { DB::transaction(function () use ($portaria) { $portaria->acoes()->delete(); $portaria->retificacoes()->delete(); $portaria->delete(); }); } /** * @param array<int, array{cd_acao:int,id_portaria_sofre_acao:int}> $acoes */ private function persistPortariaAcoes(LegislacaoPortaria $portaria, array $acoes, mixed $dtAcao): void { $portaria->acoes()->delete(); foreach ($acoes as $acao) { LegislacaoPortariaAcao::query()->create([ 'id_portaria' => $portaria->id_portaria, 'id_portaria_sofre_acao' => $acao['id_portaria_sofre_acao'], 'cd_acao' => $acao['cd_acao'], 'dt_acao' => $dtAcao, ]); } } public function storePortariaRetificacao(LegislacaoPortaria $portaria, array $data): LegislacaoPortariaRetificacao { return LegislacaoPortariaRetificacao::query()->create([ 'id_portaria' => $portaria->id_portaria, 'cd_tipo' => (int) $data['cd_tipo'], 'id_boletim_oficial' => $data['id_boletim_oficial'], 'ds_descricao' => $data['ds_descricao'] ?? null, ]); } public function updatePortariaRetificacao(LegislacaoPortariaRetificacao $retificacao, array $data): void { $retificacao->update([ 'cd_tipo' => (int) $data['cd_tipo'], 'id_boletim_oficial' => $data['id_boletim_oficial'], 'ds_descricao' => $data['ds_descricao'] ?? null, ]); } public function deletePortariaRetificacao(LegislacaoPortariaRetificacao $retificacao): void { $retificacao->delete(); } public function storeLegislacaoTipo(array $data): LegislacaoTipo { return LegislacaoTipo::query()->create($data); } public function updateLegislacaoTipo(LegislacaoTipo $tipo, array $data): void { $tipo->update($data); } public function deleteLegislacaoTipo(LegislacaoTipo $tipo): void { $tipo->delete(); } public function storeLegislacaoCategoria(array $data): LegislacaoCategoria { return LegislacaoCategoria::query()->create($data); } public function updateLegislacaoCategoria(LegislacaoCategoria $categoria, array $data): void { $categoria->update($data); } public function deleteLegislacaoCategoria(LegislacaoCategoria $categoria): void { $categoria->delete(); } public function storeLegislacaoAutorCargo(array $data): LegislacaoAutorCargo { return LegislacaoAutorCargo::query()->create($data); } public function updateLegislacaoAutorCargo(LegislacaoAutorCargo $cargo, array $data): void { $cargo->update($data); } public function deleteLegislacaoAutorCargo(LegislacaoAutorCargo $cargo): void { $cargo->delete(); } public function storeLegislacaoAutor(array $data): LegislacaoAutor { return LegislacaoAutor::query()->create($data); } public function updateLegislacaoAutor(LegislacaoAutor $autor, array $data): void { $autor->update($data); } public function deleteLegislacaoAutor(LegislacaoAutor $autor): void { $autor->delete(); } private function resolveLegislacaoPdfName(?string $submittedName, ?UploadedFile $pdf, ?string $previous): ?string { if ($pdf instanceof UploadedFile) { $this->assertLegislacaoPdfIsValid($pdf); $this->ensureLegislacaoPdfStorageDirectoryIsWritable(); $safe = Str::slug(pathinfo($pdf->getClientOriginalName(), PATHINFO_FILENAME)); $safe = $safe !== '' ? $safe : 'legislacao'; $name = $safe.'-'.Str::random(8).'.pdf'; try { $storedPath = Storage::disk('public')->putFileAs( Legislacao::PDF_STORAGE_FOLDER, $pdf, $name ); if ($storedPath === false || $storedPath === '') { throw new \RuntimeException('Storage::putFileAs retornou caminho vazio.'); } } catch (\Throwable $e) { Log::error('Falha ao salvar PDF de legislação', [ 'file' => $pdf->getClientOriginalName(), 'target' => Legislacao::legislacaoPdfStorageDirectory(), 'message' => $e->getMessage(), ]); throw ValidationException::withMessages([ 'pdf_arquivo' => __('* Não foi possível salvar o PDF. Verifique permissões de escrita ou contate o suporte.'), ]); } $this->deleteLegislacaoPdfFile($previous); return $name; } $safeSubmitted = Legislacao::legislacaoPdfSafeFileName($submittedName); if ($safeSubmitted !== null) { return $safeSubmitted; } return Legislacao::legislacaoPdfSafeFileName($previous) ?? $previous; } private function assertLegislacaoPdfIsValid(UploadedFile $pdf): void { if (! FileUploadHelper::validateFile($pdf, self::PDF_ALLOWED_EXTENSIONS, self::PDF_ALLOWED_MIME_TYPES)) { throw ValidationException::withMessages([ 'pdf_arquivo' => __('* O arquivo é inválido ou não é um PDF válido.'), ]); } } /** * Garante que storage/app/public/legislacoes-pdf existe e é gravável pelo PHP. */ private function ensureLegislacaoPdfStorageDirectoryIsWritable(): void { $dir = Legislacao::legislacaoPdfStorageDirectory(); if (is_dir($dir)) { if (is_writable($dir)) { return; } throw ValidationException::withMessages([ 'pdf_arquivo' => __('* Não foi possível salvar o PDF: diretório de destino sem permissão de escrita.'), ]); } if (@mkdir($dir, 0755, true) || is_dir($dir)) { if (is_writable($dir)) { return; } } Log::error('Diretório de PDFs de legislação indisponível para escrita', ['path' => $dir]); throw ValidationException::withMessages([ 'pdf_arquivo' => __('* Não foi possível preparar o diretório de upload. Contate o suporte.'), ]); } private function deleteLegislacaoPdfFile(?string $fileName): void { $diskPath = Legislacao::legislacaoPdfDiskPath($fileName); if ($diskPath !== null && Storage::disk('public')->exists($diskPath)) { Storage::disk('public')->delete($diskPath); } $legacyPath = Legislacao::legislacaoPdfLegacyAbsolutePath($fileName); if ($legacyPath !== null && is_file($legacyPath)) { @unlink($legacyPath); } } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings