Move the row formatting that was duplicated between system-audit's data() and export() endpoints into a single presenter. Both endpoints now call presentAll() on the same object, so enum label translation, actor resolution, and timestamp formatting cannot drift between the Grid.js UI and the CSV download. - SystemAuditRowPresenter::present()/presentAll(): canonical row shape with outcome + outcome_label + outcome_badge, channel + channel_label, actor_user_label with display-name-then-email fallback, and safe defaults for every missing field. - data().php shrinks from ~45 to ~15 lines; export().php drops its inline outcome/channel/actor resolvers and reads the already- resolved fields from the presenter output. - AuditContainerRegistrar registers the presenter. - tests/Module/Audit/Service/SystemAuditRowPresenterTest: 9 cases covering enum normalization, unknown-value fallback, actor label precedence (display name → email → "-"), whitespace trimming, safe defaults for missing keys, and iterable input. - StatusTaxonomyContractFiles: the taxonomy data contract now points at the presenter (the single source of truth for badge/label resolution) instead of the thin data endpoint, and the presenter is added to the literal-guard file list. Gates: PHPUnit 1889 OK, PHPStan 0 errors, module:sync ok. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
18 lines
625 B
PHP
18 lines
625 B
PHP
<?php
|
|
|
|
use MintyPHP\Module\Audit\AuditAuthorizationPolicy;
|
|
use MintyPHP\Module\Audit\Service\SystemAuditRowPresenter;
|
|
use MintyPHP\Module\Audit\Service\SystemAuditService;
|
|
use MintyPHP\Support\Guard;
|
|
|
|
Guard::requireLogin();
|
|
Guard::requireAbilityOrForbidden(AuditAuthorizationPolicy::ABILITY_SYSTEM_AUDIT_VIEW);
|
|
gridRequireGetRequest();
|
|
|
|
$filters = gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php');
|
|
|
|
$result = app(SystemAuditService::class)->listPaged($filters);
|
|
$rows = app(SystemAuditRowPresenter::class)->presentAll((array) ($result['rows'] ?? []));
|
|
|
|
gridJsonDataResult($rows, (int) ($result['total'] ?? 0));
|