File manager - Edit - /var/www/html/portal/app/Http/Services/ReusableMenusService.php
Back
<?php namespace App\Http\Services; use App\Models\ReusableMenu; use App\Models\ReusableMenuLink; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; class ReusableMenusService { /** * Lista menus reutilizáveis com paginação e busca simples. * * @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 ReusableMenu::query() ->search($q) ->orderedForAdmin() ->paginate($perPage); } /** * Cria um menu reutilizável. * * @param array{title:string, summary?:string|null, status:string} $data */ public function create(array $data): ReusableMenu { try { return DB::transaction(function () use ($data) { return ReusableMenu::create([ 'title' => (string) ($data['title'] ?? ''), 'summary' => $this->normalizeNullableString($data['summary'] ?? null), 'status' => (string) ($data['status'] ?? 'ATIVADO'), ]); }); } catch (\Throwable $e) { Log::error('Falha ao criar Menu Reutilizável (service)', [ 'exception' => $e, ]); throw $e; } } /** * Cria menu reutilizável e seus links iniciais. * * @param array{title:string, summary?:string|null, status:string} $data * @param array<int, array{titulo?:string|null, link?:string|null, description?:string|null, link_status?:string|null, order?:int|string|null}> $links */ public function createWithLinks(array $data, array $links): ReusableMenu { return DB::transaction(function () use ($data, $links) { $menu = ReusableMenu::create([ 'title' => (string) ($data['title'] ?? ''), 'summary' => $this->normalizeNullableString($data['summary'] ?? null), 'status' => (string) ($data['status'] ?? 'ATIVADO'), ]); foreach ($links as $linkIndex => $linkData) { $titulo = $this->normalizeNullableString($linkData['titulo'] ?? null); $linkValue = $this->normalizeNullableString($linkData['link'] ?? null); $description = $this->normalizeNullableString($linkData['description'] ?? null); $status = (string) ($linkData['link_status'] ?? '_SELF'); $order = $this->normalizeInt($linkData['order'] ?? 1, 1); // Ignora linhas totalmente em branco. if (empty($titulo) && empty($linkValue)) { continue; } // Não deixa salvar item parcialmente preenchido. if (empty($titulo) || empty($linkValue)) { throw new \RuntimeException( __('* Para cada link preenchido, informe obrigatoriamente título e link.') ); } ReusableMenuLink::create([ 'reusable_menu_id' => $menu->id, 'titulo' => $titulo, 'link' => $linkValue, 'description' => $description, 'status' => $status, 'order' => $order, ]); } return $menu->refresh(); }); } /** * Atualiza um menu reutilizável. * * @param array{title:string, summary?:string|null, status:string} $data */ public function update(ReusableMenu $menu, array $data): ReusableMenu { try { return DB::transaction(function () use ($menu, $data) { $menu->update([ 'title' => (string) ($data['title'] ?? $menu->title), 'summary' => $this->normalizeNullableString($data['summary'] ?? $menu->summary), 'status' => (string) ($data['status'] ?? $menu->status), ]); return $menu->refresh(); }); } catch (\Throwable $e) { Log::error('Falha ao atualizar Menu Reutilizável (service)', [ 'reusable_menu_id' => $menu->id, 'exception' => $e, ]); throw $e; } } /** * Atualiza o status (ATIVADO/DESATIVADO) de um menu reutilizável. */ public function updateStatus(ReusableMenu $menu, string $status): ReusableMenu { try { return DB::transaction(function () use ($menu, $status) { $menu->fill(['status' => $status])->save(); return $menu->refresh(); }); } catch (\Throwable $e) { Log::error('Falha ao atualizar status do Menu Reutilizável (service)', [ 'reusable_menu_id' => $menu->id, 'status' => $status, 'exception' => $e, ]); throw $e; } } /** * Exclui um menu reutilizável. */ public function delete(ReusableMenu $menu): void { try { DB::transaction(function () use ($menu) { // Não há FK explícita, então garantimos a limpeza dos links. $menu->menuLinks()->delete(); $menu->delete(); }); } catch (\Throwable $e) { Log::error('Falha ao excluir Menu Reutilizável (service)', [ 'reusable_menu_id' => $menu->id, 'exception' => $e, ]); throw $e; } } /** * Cria um link para um menu reutilizável. * * @param array{titulo:string, link:string, description?:string|null, status:string, order:int|string} $data */ public function createLink(ReusableMenu $menu, array $data): ReusableMenuLink { try { return DB::transaction(function () use ($menu, $data) { return ReusableMenuLink::create([ 'reusable_menu_id' => $menu->id, 'titulo' => (string) ($data['titulo'] ?? ''), 'link' => (string) ($data['link'] ?? ''), 'description' => $this->normalizeNullableString($data['description'] ?? null), 'status' => (string) ($data['link_status'] ?? '_SELF'), 'order' => $this->normalizeInt($data['order'] ?? 1, 1), ]); }); } catch (\Throwable $e) { Log::error('Falha ao criar Link de Menu Reutilizável (service)', [ 'reusable_menu_id' => $menu->id, 'exception' => $e, ]); throw $e; } } /** * Atualiza um link de menu reutilizável. * * @param array{titulo:string, link:string, description?:string|null, status:string, order:int|string} $data */ public function updateLink(ReusableMenu $menu, ReusableMenuLink $link, array $data): ReusableMenuLink { try { return DB::transaction(function () use ($menu, $link, $data) { if ($link->reusable_menu_id !== $menu->id) { throw new \RuntimeException('Link não pertence ao menu informado.'); } $link->update([ 'titulo' => (string) ($data['titulo'] ?? $link->titulo), 'link' => (string) ($data['link'] ?? $link->link), 'description' => $this->normalizeNullableString($data['description'] ?? $link->description), 'status' => (string) ($data['link_status'] ?? $link->status), 'order' => $this->normalizeInt($data['order'] ?? $link->order, 1), ]); return $link->refresh(); }); } catch (\Throwable $e) { Log::error('Falha ao atualizar Link de Menu Reutilizável (service)', [ 'reusable_menu_id' => $menu->id, 'reusable_menu_link_id' => $link->id, 'exception' => $e, ]); throw $e; } } /** * Exclui um link de menu reutilizável. */ public function deleteLink(ReusableMenu $menu, ReusableMenuLink $link): void { try { DB::transaction(function () use ($menu, $link) { if ($link->reusable_menu_id !== $menu->id) { throw new \RuntimeException('Link não pertence ao menu informado.'); } $link->delete(); }); } catch (\Throwable $e) { Log::error('Falha ao excluir Link de Menu Reutilizável (service)', [ 'reusable_menu_id' => $menu->id, 'reusable_menu_link_id' => $link->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; } return (int) $value; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings