File manager - Edit - /var/www/html/portalHomolog/app/Http/Services/HtmlService.php
Back
<?php namespace App\Http\Services; use App\Models\Html; use App\Models\ReusableMenu; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Str; class HtmlService { /** * Lista páginas HTML com paginação e busca (quando informado). * * @param array{q?:string|null, perPage?:int|null} $filters */ public function paginate(array $filters = []): LengthAwarePaginator { $q = isset($filters['q']) ? trim((string) $filters['q']) : null; $perPage = (int) ($filters['perPage'] ?? 20); if ($perPage <= 0) { $perPage = 20; } return Html::query() ->with('pertence') ->search($q) ->orderedForAdmin() ->paginate($perPage); } /** * Cria uma página HTML. * * @param array{ * structure_id?:string|null, * title:string, * summary?:string|null, * code?:string|null, * css?:string|null, * js?:string|null, * order?:int|string|null, * visibility:string, * status:string, * display_context?:string|null * } $data */ public function create(array $data): Html { try { return DB::transaction(function () use ($data) { $title = (string) ($data['title'] ?? ''); $status = (string) ($data['status'] ?? 'ATIVADO'); // Regra de negócio: Se a página estiver desativada, não pode estar visível na lista $visibility = (string) ($data['visibility'] ?? 'ATIVADO'); if ($status === 'DESATIVADO') { $visibility = 'DESATIVADO'; } return Html::create([ 'structure_id' => $this->normalizeNullableString($data['structure_id'] ?? null), 'title' => $title, 'summary' => $this->normalizeNullableString($data['summary'] ?? null), 'slug' => Str::slug($title, '-'), 'code' => $this->normalizeNullableString($data['code'] ?? null), 'css' => $this->normalizeNullableString($data['css'] ?? null), 'js' => $this->normalizeNullableString($data['js'] ?? null), 'order' => $this->normalizeInt($data['order'] ?? 0, 0), 'visibility' => $visibility, 'status' => $status, 'reusable_menu_id' => $this->normalizeNullableString($data['reusable_menu_id'] ?? null), 'display_context' => (string) ($data['display_context'] ?? 'BOTH'), // Exclusividade: ao criar via formulário, não ativamos menu custom. 'custom_menu_enabled' => false, ]); }); } catch (\Throwable $e) { Log::error('Falha ao criar Página HTML', [ 'exception' => $e, ]); throw $e; } } /** * Atualiza uma página HTML. * * @param array{ * structure_id?:string|null, * title:string, * summary?:string|null, * code?:string|null, * css?:string|null, * js?:string|null, * order?:int|string|null, * visibility:string, * status:string, * display_context?:string|null * } $data */ public function update(Html $html, array $data): Html { try { return DB::transaction(function () use ($html, $data) { $title = (string) ($data['title'] ?? ''); $status = (string) ($data['status'] ?? $html->status ?? 'ATIVADO'); $visibility = (string) ($data['visibility'] ?? $html->visibility); // Regra de negócio: Se a página estiver desativada, não pode estar visível na lista if ($status === 'DESATIVADO') { $visibility = 'DESATIVADO'; } $reusableMenuId = $this->normalizeNullableString($data['reusable_menu_id'] ?? null); // Exclusividade: não permite ativar os dois menus ao mesmo tempo. // Se menu custom estiver ativado, o menu reutilizável não pode ser ativado. $reusableMenuAtivado = false; if (!empty($reusableMenuId)) { $reusableMenuAtivado = ReusableMenu::query() ->where('id', $reusableMenuId) ->where('status', 'ATIVADO') ->exists(); } if ($reusableMenuAtivado && (bool) $html->custom_menu_enabled) { throw new \Exception(__('* Desative o Menu Personalizado antes de ativar o Menu reutilizável.')); } $html->update([ 'structure_id' => $this->normalizeNullableString($data['structure_id'] ?? null), 'title' => $title, 'summary' => $this->normalizeNullableString($data['summary'] ?? null), 'slug' => Str::slug($title, '-'), 'code' => $this->normalizeNullableString($data['code'] ?? null), 'css' => $this->normalizeNullableString($data['css'] ?? null), 'js' => $this->normalizeNullableString($data['js'] ?? null), 'order' => $this->normalizeInt($data['order'] ?? 0, 0), 'visibility' => $visibility, 'status' => $status, 'reusable_menu_id' => $reusableMenuId, 'display_context' => (string) ($data['display_context'] ?? $html->display_context ?? 'BOTH'), ]); return $html->refresh(); }); } catch (\Throwable $e) { Log::error('Falha ao atualizar Página HTML', [ 'html_id' => $html->id, 'exception' => $e, ]); throw $e; } } /** * Exclui uma página HTML. */ public function delete(Html $html): void { try { DB::transaction(function () use ($html) { $html->delete(); }); } catch (\Throwable $e) { Log::error('Falha ao excluir Página HTML', [ 'html_id' => $html->id, 'exception' => $e, ]); throw $e; } } /** * Atualiza a visibilidade de uma página HTML (antigo status). */ public function updateVisibility(Html $html, string $visibility): Html { try { // Regra de negócio: Só pode ativar Visibilidade se a Página estiver Ativada if ($visibility === 'ATIVADO' && ($html->status ?? 'ATIVADO') === 'DESATIVADO') { throw new \Exception(__('Não é possível ativar a visibilidade na lista de serviços se a página estiver desativada.')); } return DB::transaction(function () use ($html, $visibility) { $html->fill(['visibility' => $visibility]); $html->save(); return $html->refresh(); }); } catch (\Throwable $e) { Log::error('Falha ao atualizar visibilidade da Página HTML', [ 'html_id' => $html->id, 'visibility' => $visibility, 'exception' => $e, ]); throw $e; } } /** * Atualiza o status da página. */ public function updateStatus(Html $html, string $status): Html { try { return DB::transaction(function () use ($html, $status) { $dataToUpdate = ['status' => $status]; // Regra de negócio: Se desativar a página, remove da visibilidade também if ($status === 'DESATIVADO') { $dataToUpdate['visibility'] = 'DESATIVADO'; } $html->fill($dataToUpdate); $html->save(); return $html->refresh(); }); } catch (\Throwable $e) { Log::error('Falha ao atualizar status da página HTML', [ 'html_id' => $html->id, 'status' => $status, 'exception' => $e, ]); throw $e; } } /** * Atualiza se o Menu Personalizado está ativado ou desativado. */ public function updateCustomMenuEnabled(Html $html, bool $enabled): Html { try { return DB::transaction(function () use ($html, $enabled) { // Exclusividade: não permite ativar os dois menus ao mesmo tempo. // Se menu reutilizável estiver associado (e ATIVADO), o menu custom não pode ser ativado. $reusableMenuAtivado = false; if (!empty($html->reusable_menu_id)) { $reusableMenuAtivado = ReusableMenu::query() ->where('id', $html->reusable_menu_id) ->where('status', 'ATIVADO') ->exists(); } if ($enabled && $reusableMenuAtivado) { throw new \Exception(__('* Desative o Menu reutilizável antes de ativar o Menu Personalizado.')); } $html->fill(['custom_menu_enabled' => $enabled]); $html->save(); return $html->refresh(); }); } catch (\Throwable $e) { Log::error('Falha ao atualizar Menu Personalizado da Página HTML', [ 'html_id' => $html->id, 'exception' => $e, ]); throw $e; } } private function normalizeNullableString(mixed $value): ?string { if ($value === null) { return null; } $value = trim((string) $value); return $value === '' ? null : $value; } private function normalizeInt(mixed $value, int $default): int { if ($value === null || $value === '') { return $default; } if (is_int($value)) { return $value; } $int = (int) $value; return $int; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings