File manager - Edit - /var/www/html/portal/app/Http/Resources/Accounts/AccountResource.php
Back
<?php namespace App\Http\Resources\Accounts; use App\Enums\StatusPermission; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; class AccountResource { private const ACTIONS = ['visualizar', 'adicionar', 'editar', 'excluir']; /** * Retorna os nomes válidos de permissão (whitelist do enum). * * @return array<int, string> */ public static function permissionWhitelist(): array { return array_column(StatusPermission::cases(), 'name'); } /** * Extrai critérios de filtro por matriz de permissões a partir da request. * * @return array<string, array<string, int>> */ public static function parsePermissionFilterCriteria(Request $request): array { $whitelist = self::permissionWhitelist(); $criterios = []; foreach ($request->input('permission', []) as $perm => $flag) { if ((int) $flag !== 1 || !in_array($perm, $whitelist, true)) { continue; } $criterios[$perm] = [ 'visualizar' => (int) $request->input("visualizar.{$perm}", 0), 'adicionar' => (int) $request->input("adicionar.{$perm}", 0), 'editar' => (int) $request->input("editar.{$perm}", 0), 'excluir' => (int) $request->input("excluir.{$perm}", 0), ]; } return $criterios; } /** * Indica se há filtro de permissões ativo na request. */ public static function hasActivePermissionFilter(Request $request): bool { return !empty(self::parsePermissionFilterCriteria($request)); } /** * Aplica filtro por matriz de permissões na query de usuários. * * @param array<string, array<string, int>> $criterios */ public static function applyPermissionMatrixFilter(Builder $query, array $criterios, string $modo): void { if (empty($criterios)) { return; } $modo = in_array($modo, ['any', 'all', 'exact'], true) ? $modo : 'any'; if ($modo === 'any') { $query->where(function (Builder $outer) use ($criterios) { foreach ($criterios as $perm => $acoes) { $outer->orWhereHas('permissoes', function (Builder $q) use ($perm, $acoes) { self::applyRowCriteria($q, $perm, $acoes, 'any'); }); } }); return; } if ($modo === 'all') { foreach ($criterios as $perm => $acoes) { $query->whereHas('permissoes', function (Builder $q) use ($perm, $acoes) { self::applyRowCriteria($q, $perm, $acoes, 'all'); }); } return; } foreach ($criterios as $perm => $acoes) { $query->whereHas('permissoes', function (Builder $q) use ($perm, $acoes) { self::applyRowCriteria($q, $perm, $acoes, 'exact'); }); } $query->has('permissoes', '=', count($criterios)); } /** * Monta parâmetros de query string do filtro de permissões para preservação de estado. * * @return array<string, int|string> */ public static function permissionFilterQueryParams(Request $request): array { $params = []; $criterios = self::parsePermissionFilterCriteria($request); if (empty($criterios)) { return $params; } $modo = $request->input('permissao_modo', 'any'); if (in_array($modo, ['any', 'all', 'exact'], true)) { $params['permissao_modo'] = $modo; } foreach ($criterios as $perm => $acoes) { $params["permission[{$perm}]"] = 1; foreach (self::ACTIONS as $action) { $params["{$action}[{$perm}]"] = $acoes[$action]; } } return $params; } /** * Monta todos os parâmetros de listagem para redirects e links. * * @return array<string, int|string> */ public static function listFilterQueryParams(Request $request): array { $params = []; foreach (['q', 'structure_id', 'status', 'sort_by', 'sort_dir'] as $key) { if ($request->filled($key)) { $params[$key] = $request->input($key); } } $page = (int) $request->input('page', 1); if ($page > 1) { $params['page'] = $page; } return array_merge($params, self::permissionFilterQueryParams($request)); } /** * Rótulo traduzível do modo de correspondência. */ public static function filterModeLabel(string $modo): string { return match ($modo) { 'all' => __('Todas essas'), 'exact' => __('Exatamente essas'), default => __('Ao menos uma dessas'), }; } /** * Regras de validação do filtro de permissões na listagem. * * @return array<string, string> */ public static function permissionFilterValidationRules(): array { return [ 'permission' => 'nullable|array', 'permission.*' => 'nullable|in:0,1', 'visualizar' => 'nullable|array', 'adicionar' => 'nullable|array', 'editar' => 'nullable|array', 'excluir' => 'nullable|array', 'visualizar.*' => 'nullable|in:0,1', 'adicionar.*' => 'nullable|in:0,1', 'editar.*' => 'nullable|in:0,1', 'excluir.*' => 'nullable|in:0,1', 'permissao_modo' => 'nullable|string|in:any,all,exact', ]; } /** * @param array<string, int> $acoes */ private static function applyRowCriteria(Builder $q, string $perm, array $acoes, string $modo): void { $q->where('permissao', $perm); foreach (self::ACTIONS as $action) { if ($modo === 'exact') { $q->where($action, $acoes[$action]); } elseif (!empty($acoes[$action])) { $q->where($action, 1); } } } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings