<?php
declare(strict_types=1);
namespace SpringerNature\CPS\AMEDReviewTracker\App\Logger\Processor;
use SpringerNature\CPS\AMEDReviewTracker\App\Exception\WrappedApplicationException;
use SpringerNature\CPS\AMEDReviewTracker\Domain\Exception\HasProgramIdException;
use SpringerNature\CPS\AMEDReviewTracker\Domain\Exception\HasReviewerIdException;
class WrappedApplicationExceptionProcessor
{
public function __invoke(array $record): array
{
$data = [];
// PSR3 goodness, sadly, exception is optional in the context so we have to check for it
if (array_key_exists('exception', $record['context'])) {
$data = $this->process($record['context']['exception']);
}
if (\count($data)) {
if ( ! array_key_exists('extra', $record)) {
$record['extra'] = [];
}
$record['extra'] = array_merge($record['extra'], $data);
}
return $record;
}
private function process($exception): array
{
if ( ! $exception instanceof WrappedApplicationException) {
return [];
}
$domainException = $exception->getPrevious();
$data = [];
if ($domainException instanceof HasProgramIdException) {
$data['program_id'] = $domainException->getProgramId();
}
if ($domainException instanceof HasReviewerIdException) {
$data['reviewer_id'] = $domainException->getReviewerId();
}
return $data;
}
}