File manager - Edit - /var/www/html/portalHomolog/app/Http/Services/Observatorio/IndicadorService.php
Back
<?php namespace App\Http\Services\Observatorio; use App\Models\Observatorio\Base; use App\Models\Observatorio\Diretriz; use App\Models\Observatorio\Eixo; use App\Models\Observatorio\Fonte; use App\Models\Observatorio\Indicador; use App\Models\Observatorio\Orgao; use App\Models\Observatorio\Periodicidade; use App\Models\Observatorio\Programa; use App\Models\Observatorio\Tema; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Collection; class IndicadorService { public function listWithFilters(Request $request, int $perPage = 20): LengthAwarePaginator { return Indicador::query() ->with(['tema', 'fonte']) ->when($request->filled('tema_id'), function ($query) use ($request) { $query->where('tema_id', (int) $request->input('tema_id')); }) ->when($request->filled('observatorio'), function ($query) use ($request) { $query->where('observatorio', (int) $request->input('observatorio')); }) ->when($request->filled('q'), function ($query) use ($request) { $term = trim((string) $request->input('q')); $query->where('nome', 'like', "%{$term}%"); }) ->orderBy('nome') ->paginate($perPage) ->appends($request->query()); } public function create(array $data): Indicador { return DB::connection('mysql_observatorio')->transaction( fn () => Indicador::create($this->sanitizeData($data)) ); } public function update(Indicador $indicador, array $data): Indicador { DB::connection('mysql_observatorio')->transaction(function () use ($indicador, $data): void { $indicador->update($this->sanitizeData($data)); }); return $indicador; } public function delete(Indicador $indicador): void { DB::connection('mysql_observatorio')->transaction(function () use ($indicador): void { $indicador->delete(); }); } /** * Coleções para popular os selects do formulário. * * @return array<string, Collection> */ public function formOptions(): array { return [ 'temas' => Tema::orderBy('nome')->get(['id', 'nome']), 'diretrizes' => Diretriz::orderBy('descricao')->get(['id', 'descricao']), 'eixos' => Eixo::orderBy('descricao')->get(['id', 'descricao']), 'orgaos' => Orgao::orderBy('descricao')->get(['id', 'descricao']), 'programas' => Programa::orderBy('descricao')->get(['id', 'descricao']), 'fontes' => Fonte::orderBy('descricao')->get(['id', 'descricao']), 'bases' => Base::orderBy('descricao')->get(['id', 'descricao']), 'periodicidades' => Periodicidade::orderBy('descricao')->get(['id', 'descricao']), ]; } private function sanitizeData(array $data): array { foreach (['tema_id', 'diretriz_id', 'eixo_id', 'orgao_id', 'programa_id', 'fonte_id', 'base_id', 'periodicidade_id'] as $fk) { $data[$fk] = !empty($data[$fk]) ? (int) $data[$fk] : null; } foreach (['planilha_link'] as $urlField) { $data[$urlField] = isset($data[$urlField]) ? trim((string) $data[$urlField]) : null; $data[$urlField] = $data[$urlField] !== '' ? $data[$urlField] : null; } foreach (['grafico_link_1', 'grafico_link_2', 'grafico_link_3', 'grafico_link_4', 'grafico_link_5', 'grafico_embed'] as $embedField) { $data[$embedField] = $this->sanitizeGraficoEmbed($data[$embedField] ?? null); } $data['observatorio'] = (int) ($data['observatorio'] ?? 0); $data['ppa'] = (int) ($data['ppa'] ?? 0); $data['destaque'] = (int) ($data['destaque'] ?? 0); $data['status'] = $data['status'] ?? 'ATIVADO'; unset($data['q'], $data['page'], $data['tema_filter']); return $data; } private function sanitizeGraficoEmbed(mixed $value): ?string { $html = trim((string) ($value ?? '')); if ($html === '') { return null; } $decoded = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8'); preg_match_all('/<iframe\b[^>]*>(?:<\/iframe>)?/i', $decoded, $matches); $iframes = collect($matches[0] ?? []) ->map(fn (string $iframe): ?string => $this->sanitizeIframeTag($iframe)) ->filter() ->values() ->all(); if ($iframes !== []) { return implode("\n", $iframes); } $plainText = trim(strip_tags($decoded)); return $plainText !== '' ? e($plainText) : null; } private function sanitizeIframeTag(string $iframe): ?string { preg_match_all('/\s([a-zA-Z0-9_-]+)(?:\s*=\s*("[^"]*"|\'[^\']*\'|[^\s>]+))?/', $iframe, $matches, PREG_SET_ORDER); $allowedAttributes = ['src', 'width', 'height', 'frameborder', 'allow', 'allowfullscreen', 'loading', 'referrerpolicy']; $attributes = []; foreach ($matches as $match) { $name = strtolower($match[1]); if (!in_array($name, $allowedAttributes, true)) { continue; } if ($name === 'allowfullscreen') { $attributes[$name] = null; continue; } $rawValue = trim($match[2] ?? '', "\"'"); $normalizedValue = strtolower(preg_replace('/\s+/', '', html_entity_decode($rawValue, ENT_QUOTES | ENT_HTML5, 'UTF-8')) ?? ''); if ($name === 'src' && !str_starts_with($normalizedValue, 'https://') && !str_starts_with($normalizedValue, 'http://')) { return null; } if (str_starts_with($normalizedValue, 'javascript:') || str_starts_with($normalizedValue, 'vbscript:') || str_starts_with($normalizedValue, 'data:')) { continue; } $attributes[$name] = e($rawValue); } if (empty($attributes['src'])) { return null; } $htmlAttributes = collect($attributes) ->map(fn (?string $value, string $name): string => $value === null ? $name : "{$name}=\"{$value}\"") ->implode(' '); return "<iframe {$htmlAttributes}></iframe>"; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings