File manager - Edit - /var/www/html/portalHomolog/app/Http/Resources/Sei/SeiAlertaResource.php
Back
<?php namespace App\Http\Resources\Sei; use App\Helpers\HtmlSanitizer; use App\Http\Services\Sei\SeiAlertaService; use App\Models\Sei\SeiAlerta; use Carbon\Carbon; use Carbon\CarbonInterface; class SeiAlertaResource { /** * Presets de duração aceitos (minutos, horas e dias). * * @var array<string, array{add: string, value: int}> */ private const DURACOES_PRESET = [ '15m' => ['add' => 'minutes', 'value' => 15], '30m' => ['add' => 'minutes', 'value' => 30], '1h' => ['add' => 'hours', 'value' => 1], '2h' => ['add' => 'hours', 'value' => 2], '4h' => ['add' => 'hours', 'value' => 4], '6h' => ['add' => 'hours', 'value' => 6], '12h' => ['add' => 'hours', 'value' => 12], '1' => ['add' => 'days', 'value' => 1], '3' => ['add' => 'days', 'value' => 3], '7' => ['add' => 'days', 'value' => 7], '15' => ['add' => 'days', 'value' => 15], '30' => ['add' => 'days', 'value' => 30], ]; public function __construct( private readonly SeiAlertaService $service, ) { } /** * @return list<string> */ public static function duracoesPermitidas(): array { return array_merge( array_keys(self::DURACOES_PRESET), ['none', 'custom'], ); } /** * Resolve a data de encerramento conforme o preset ou valor personalizado. */ public function resolverExibirAte(?string $publicadoEm, string $duracaoExibicao, ?string $exibirAtePersonalizado): ?CarbonInterface { if ($duracaoExibicao === 'none') { return null; } if ($duracaoExibicao === 'custom') { if ($exibirAtePersonalizado === null || trim($exibirAtePersonalizado) === '') { return null; } return Carbon::parse($exibirAtePersonalizado); } if ($publicadoEm === null || trim($publicadoEm) === '') { return null; } $preset = self::DURACOES_PRESET[$duracaoExibicao] ?? null; if ($preset === null) { return null; } $inicio = Carbon::parse($publicadoEm); return match ($preset['add']) { 'minutes' => $inicio->copy()->addMinutes($preset['value']), 'hours' => $inicio->copy()->addHours($preset['value']), default => $inicio->copy()->addDays($preset['value']), }; } /** * Detecta o preset equivalente a partir das datas salvas. */ public function detectarDuracaoExibicao(?CarbonInterface $publicadoEm, ?CarbonInterface $exibirAte): string { if ($exibirAte === null || $publicadoEm === null) { return 'none'; } $diffSegundos = abs($publicadoEm->diffInSeconds($exibirAte, false)); if ($diffSegundos <= 0) { return 'custom'; } foreach (self::DURACOES_PRESET as $codigo => $preset) { $esperado = match ($preset['add']) { 'minutes' => $preset['value'] * 60, 'hours' => $preset['value'] * 3600, default => $preset['value'] * 86400, }; if (abs($diffSegundos - $esperado) <= 60) { return $codigo; } } return 'custom'; } /** * Retorna o alerta visível no portal público SEI, se houver. */ public function alertaVisivelNoPortal(): ?SeiAlerta { return SeiAlerta::query() ->visivelNoPortal() ->find(SeiAlerta::SINGLETON_ID); } /** * Sanitiza o conteúdo HTML do banner antes de persistir ou renderizar. */ public function sanitizarConteudo(?string $conteudo): string { return HtmlSanitizer::sanitize($conteudo); } /** * Conteúdo seguro para renderização no portal (sanitização na gravação e na exibição). */ public function conteudoParaExibicao(?SeiAlerta $alerta): string { if ($alerta === null || trim((string) $alerta->conteudo) === '') { return ''; } return $this->sanitizarConteudo($alerta->conteudo); } /** * Persiste alterações do alerta com conteúdo sanitizado. */ public function atualizarAlerta(SeiAlerta $alerta, array $dados, string $userId): SeiAlerta { $dados['conteudo'] = $this->sanitizarConteudo($dados['conteudo'] ?? ''); return $this->service->atualizar($alerta, $dados, $userId); } /** * Alterna o status de exibição do alerta. */ public function alternarStatusAlerta(SeiAlerta $alerta, string $userId): SeiAlerta { return $this->service->alternarStatus($alerta, $userId); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.01 |
proxy
|
phpinfo
|
Settings