Files
michaelschiemer/src/Framework/ErrorReporting/ErrorReportCriteria.php
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

252 lines
6.9 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Framework\ErrorReporting;
use DateTimeImmutable;
/**
* Criteria for searching error reports
*/
final readonly class ErrorReportCriteria
{
public function __construct(
public ?DateTimeImmutable $from = null,
public ?DateTimeImmutable $to = null,
public ?array $levels = null,
public ?array $exceptions = null,
public ?array $routes = null,
public ?array $methods = null,
public ?string $userId = null,
public ?string $environment = null,
public ?array $tags = null,
public ?string $search = null,
public ?string $fingerprint = null,
public ?int $minSeverity = null,
public ?int $maxSeverity = null,
public int $limit = 100,
public int $offset = 0,
public string $orderBy = 'timestamp',
public string $orderDir = 'DESC'
) {
}
/**
* Create criteria for recent errors
*/
public static function recent(int $hours = 24): self
{
$from = (new DateTimeImmutable())->modify("-{$hours} hours");
return new self(from: $from);
}
/**
* Create criteria for critical errors
*/
public static function critical(): self
{
return new self(
levels: ['emergency', 'alert', 'critical'],
maxSeverity: 2
);
}
/**
* Create criteria for errors by user
*/
public static function byUser(string $userId): self
{
return new self(userId: $userId);
}
/**
* Create criteria for errors by route
*/
public static function byRoute(string $route): self
{
return new self(routes: [$route]);
}
/**
* Create criteria for errors by exception type
*/
public static function byException(string $exceptionClass): self
{
return new self(exceptions: [$exceptionClass]);
}
/**
* Create criteria for production errors
*/
public static function production(): self
{
return new self(environment: 'production');
}
/**
* Create criteria with search term
*/
public static function search(string $term): self
{
return new self(search: $term);
}
/**
* Add time range filter
*/
public function withTimeRange(DateTimeImmutable $from, DateTimeImmutable $to): self
{
return new self(
from: $from,
to: $to,
levels: $this->levels,
exceptions: $this->exceptions,
routes: $this->routes,
methods: $this->methods,
userId: $this->userId,
environment: $this->environment,
tags: $this->tags,
search: $this->search,
fingerprint: $this->fingerprint,
minSeverity: $this->minSeverity,
maxSeverity: $this->maxSeverity,
limit: $this->limit,
offset: $this->offset,
orderBy: $this->orderBy,
orderDir: $this->orderDir
);
}
/**
* Add level filter
*/
public function withLevels(array $levels): self
{
return new self(
from: $this->from,
to: $this->to,
levels: $levels,
exceptions: $this->exceptions,
routes: $this->routes,
methods: $this->methods,
userId: $this->userId,
environment: $this->environment,
tags: $this->tags,
search: $this->search,
fingerprint: $this->fingerprint,
minSeverity: $this->minSeverity,
maxSeverity: $this->maxSeverity,
limit: $this->limit,
offset: $this->offset,
orderBy: $this->orderBy,
orderDir: $this->orderDir
);
}
/**
* Add environment filter
*/
public function withEnvironment(string $environment): self
{
return new self(
from: $this->from,
to: $this->to,
levels: $this->levels,
exceptions: $this->exceptions,
routes: $this->routes,
methods: $this->methods,
userId: $this->userId,
environment: $environment,
tags: $this->tags,
search: $this->search,
fingerprint: $this->fingerprint,
minSeverity: $this->minSeverity,
maxSeverity: $this->maxSeverity,
limit: $this->limit,
offset: $this->offset,
orderBy: $this->orderBy,
orderDir: $this->orderDir
);
}
/**
* Add pagination
*/
public function withPagination(int $limit, int $offset = 0): self
{
return new self(
from: $this->from,
to: $this->to,
levels: $this->levels,
exceptions: $this->exceptions,
routes: $this->routes,
methods: $this->methods,
userId: $this->userId,
environment: $this->environment,
tags: $this->tags,
search: $this->search,
fingerprint: $this->fingerprint,
minSeverity: $this->minSeverity,
maxSeverity: $this->maxSeverity,
limit: $limit,
offset: $offset,
orderBy: $this->orderBy,
orderDir: $this->orderDir
);
}
/**
* Add ordering
*/
public function withOrdering(string $orderBy, string $orderDir = 'DESC'): self
{
return new self(
from: $this->from,
to: $this->to,
levels: $this->levels,
exceptions: $this->exceptions,
routes: $this->routes,
methods: $this->methods,
userId: $this->userId,
environment: $this->environment,
tags: $this->tags,
search: $this->search,
fingerprint: $this->fingerprint,
minSeverity: $this->minSeverity,
maxSeverity: $this->maxSeverity,
limit: $this->limit,
offset: $this->offset,
orderBy: $orderBy,
orderDir: $orderDir
);
}
/**
* Convert to array for storage layer
*/
public function toArray(): array
{
return [
'from' => $this->from?->format('c'),
'to' => $this->to?->format('c'),
'levels' => $this->levels,
'exceptions' => $this->exceptions,
'routes' => $this->routes,
'methods' => $this->methods,
'user_id' => $this->userId,
'environment' => $this->environment,
'tags' => $this->tags,
'search' => $this->search,
'fingerprint' => $this->fingerprint,
'min_severity' => $this->minSeverity,
'max_severity' => $this->maxSeverity,
'limit' => $this->limit,
'offset' => $this->offset,
'order_by' => $this->orderBy,
'order_dir' => $this->orderDir,
];
}
}